Merge pull request #3019 from Polymer/3018-kschaaf-avoid-throw

Avoid throwing with invalid keys/paths. Fixes #3018.
This commit is contained in:
Steve Orvell 2015-11-19 12:08:03 -08:00
commit 4d45842a40
3 changed files with 34 additions and 18 deletions

View File

@ -50,9 +50,10 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
},
removeKey: function(key) {
key = this._parseKey(key);
this._removeFromMap(this.store[key]);
delete this.store[key];
if (key = this._parseKey(key)) {
this._removeFromMap(this.store[key]);
delete this.store[key];
}
},
_removeFromMap: function(item) {
@ -88,29 +89,30 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
},
_parseKey: function(key) {
if (key[0] == '#') {
if (key && key[0] == '#') {
return key.slice(1);
}
throw new Error('unexpected key ' + key);
},
setItem: function(key, item) {
key = this._parseKey(key);
var old = this.store[key];
if (old) {
this._removeFromMap(old);
if (key = this._parseKey(key)) {
var old = this.store[key];
if (old) {
this._removeFromMap(old);
}
if (item && typeof item == 'object') {
this.omap.set(item, key);
} else {
this.pmap[item] = key;
}
this.store[key] = item;
}
if (item && typeof item == 'object') {
this.omap.set(item, key);
} else {
this.pmap[item] = key;
}
this.store[key] = item;
},
getItem: function(key) {
key = this._parseKey(key);
return this.store[key];
if (key = this._parseKey(key)) {
return this.store[key];
}
},
getItems: function() {

View File

@ -85,7 +85,9 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
var info = {};
this._get(path, this, info);
// Notify change to key-based path
this._notifyPath(info.path, value, fromAbove);
if (info.path) {
this._notifyPath(info.path, value, fromAbove);
}
},
// Note: this implemetation only accepts key-based array paths

View File

@ -856,6 +856,18 @@ suite('path API', function() {
assert.equal(el.get('nested.again.again.wayOverThere'), 99);
});
test('notifyPath calls observer', function() {
el.a = {b: {c: true}};
sinon.spy(el, 'aChanged');
el.notifyPath('a.b.c', el.a.b.c);
assert.isTrue(el.aChanged.calledOnce);
assert.equal(el.get('a.b.c'), true);
});
test('notifyPath a non-extistant does nothing', function() {
el.notifyPath('does.not.exist', true);
});
test('get array', function() {
el.arrayChanged = function() {};
el.array = [1, 2, 3];