/* * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ (function(scope) { /** * @class polymer-base */ // imports var log = window.WebComponents ? WebComponents.flags.log : {}; // magic words var OBSERVE_SUFFIX = 'Changed'; // element api var empty = []; var updateRecord = { object: undefined, type: 'update', name: undefined, oldValue: undefined }; var numberIsNaN = Number.isNaN || function(value) { return typeof value === 'number' && isNaN(value); }; function areSameValue(left, right) { if (left === right) return left !== 0 || 1 / left === 1 / right; if (numberIsNaN(left) && numberIsNaN(right)) return true; return left !== left && right !== right; } // capture A's value if B's value is null or undefined, // otherwise use B's value function resolveBindingValue(oldValue, value) { if (value === undefined && oldValue === null) { return value; } return (value === null || value === undefined) ? oldValue : value; } var properties = { // creates a CompoundObserver to observe property changes // NOTE, this is only done there are any properties in the `observe` object createPropertyObserver: function() { var n$ = this._observeNames; if (n$ && n$.length) { var o = this._propertyObserver = new CompoundObserver(true); this.registerObserver(o); // TODO(sorvell): may not be kosher to access the value here (this[n]); // previously we looked at the descriptor on the prototype // this doesn't work for inheritance and not for accessors without // a value property for (var i=0, l=n$.length, n; (i