mirror of
https://github.com/Polymer/polymer.git
synced 2026-08-19 01:14:44 -05:00
Behavior property copying fixes
* ensure element has `is` on prototype early as this is sometimes checked in user code. * ensure properties copied onto elements from info/behaviors are forced to configurable so they can be re-configured by later behaviors. * add `_noAccessors` optimization for faster property copying
This commit is contained in:
+13
-6
@@ -34,7 +34,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
beforeRegister: true,
|
||||
registered: true,
|
||||
attributeChanged: true,
|
||||
behaviors: true
|
||||
behaviors: true,
|
||||
_noAccessors: true
|
||||
};
|
||||
|
||||
const excludeOnBehaviors = Object.assign({
|
||||
@@ -45,13 +46,19 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
}, excludeOnInfo);
|
||||
|
||||
function copyProperties(source, target, excludeProps) {
|
||||
const noAccessors = source._noAccessors;
|
||||
for (let p in source) {
|
||||
// NOTE: cannot copy `excludeProps` methods onto prototype at least because
|
||||
// `super.ready` must be called and is not included in the user fn.
|
||||
if (!(p in excludeProps)) {
|
||||
let pd = Object.getOwnPropertyDescriptor(source, p);
|
||||
if (pd) {
|
||||
Object.defineProperty(target, p, pd);
|
||||
if (noAccessors) {
|
||||
target[p] = source[p];
|
||||
} else {
|
||||
let pd = Object.getOwnPropertyDescriptor(source, p);
|
||||
if (pd) {
|
||||
// ensure property is configurable so that a later behavior can
|
||||
// re-configure it.
|
||||
pd.configurable = true;
|
||||
Object.defineProperty(target, p, pd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -378,6 +378,20 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
behaviors: [window.BehaviorA]
|
||||
});
|
||||
|
||||
Polymer({
|
||||
is: 'no-accessors-behavior',
|
||||
behaviors: [{
|
||||
_noAccessors: true,
|
||||
properties: {
|
||||
nug: String
|
||||
},
|
||||
foo: function() {},
|
||||
bar: true
|
||||
}],
|
||||
_noAccessors: true,
|
||||
zot: 'zot'
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -447,6 +461,12 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
</template>
|
||||
</test-fixture>
|
||||
|
||||
<test-fixture id="no-accessors-behavior">
|
||||
<template>
|
||||
<no-accessors-behavior></no-accessors-behavior>
|
||||
</template>
|
||||
</test-fixture>
|
||||
|
||||
<script>
|
||||
|
||||
suite('single behavior element', function() {
|
||||
@@ -500,6 +520,15 @@ suite('single behavior element', function() {
|
||||
assert.notOk(el.listeners);
|
||||
});
|
||||
|
||||
test('properties on objects marked with `_noAccessors` are copied to class', function() {
|
||||
const el = fixture('no-accessors-behavior');
|
||||
assert.ok(el.foo);
|
||||
assert.isTrue(el.bar);
|
||||
assert.equal(el.zot, 'zot');
|
||||
el.setAttribute('nug', 'nug');
|
||||
assert.equal(el.nug, 'nug');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
suite('behavior.registered', function() {
|
||||
|
||||
Reference in New Issue
Block a user