Skip to content

Commit

Permalink
Merge pull request #5504 from Polymer/5503-kschaaf-default-value
Browse files Browse the repository at this point in the history
Allow value to merge from previous behavior property declaration. Fixes #5503
  • Loading branch information
kevinpschaaf authored Mar 6, 2019
2 parents e4ee5f8 + 62cf9d9 commit fd3ed40
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 deletions.
24 changes: 22 additions & 2 deletions lib/legacy/class.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,26 @@ function flattenBehaviors(behaviors, list, exclude) {
return list;
}

/**
* Copies property descriptors from source to target, overwriting all fields
* of any previous descriptor for a property *except* for `value`, which is
* merged in from the target if it does not exist on the source.
*
* @param {*} target Target properties object
* @param {*} source Source properties object
*/
function mergeProperties(target, source) {
for (const p in source) {
const targetInfo = target[p];
const sourceInfo = source[p];
if (!('value' in sourceInfo) && targetInfo && ('value' in targetInfo)) {
target[p] = Object.assign({value: targetInfo.value}, sourceInfo);
} else {
target[p] = sourceInfo;
}
}
}

/* Note about construction and extension of legacy classes.
[Changed in Q4 2018 to optimize performance.]
Expand Down Expand Up @@ -227,10 +247,10 @@ function GenerateClassFromInfo(info, Base, behaviors) {
const properties = {};
if (behaviorList) {
for (let i=0; i < behaviorList.length; i++) {
Object.assign(properties, behaviorList[i].properties);
mergeProperties(properties, behaviorList[i].properties);
}
}
Object.assign(properties, info.properties);
mergeProperties(properties, info.properties);
return properties;
}

Expand Down
20 changes: 12 additions & 8 deletions test/unit/behaviors.html
Original file line number Diff line number Diff line change
Expand Up @@ -402,23 +402,26 @@
behaviors: [
{
properties: {
foo: { value: true },
bar: { value: true}
foo: { value: 'a' },
bar: { value: 'a' },
ziz: { value: 'a' }
}
},
{
properties: {
foo: { value: true },
foo: { value: 'b' },
bar: String,
zot: {value: true}
zot: { value: 'b' },
ziz: { value: 'b' }
}
},

],

properties: {
foo: String,
zot: String
zot: String,
ziz: { value: 'c' }
}
});

Expand Down Expand Up @@ -587,9 +590,10 @@

test('behavior default values can be overridden', function() {
const el = fixture('override-default-value');
assert.notOk(el.foo);
assert.notOk(el.bar);
assert.notOk(el.zot);
assert.equal(el.foo, 'b');
assert.equal(el.bar, 'a');
assert.equal(el.zot, 'b');
assert.equal(el.ziz, 'c');
});

test('readOnly not applied when property was previously observed', function() {
Expand Down

0 comments on commit fd3ed40

Please sign in to comment.