/* * 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) { // instance api for attributes var attributes = { // copy attributes defined in the element declaration to the instance // e.g. tabIndex is copied // to the element instance here. copyInstanceAttributes: function () { var a$ = this._instanceAttributes; for (var k in a$) { if (!this.hasAttribute(k)) { this.setAttribute(k, a$[k]); } } }, // for each attribute on this, deserialize value to property as needed takeAttributes: function() { // if we have no publish lookup table, we have no attributes to take // TODO(sjmiles): ad hoc if (this._publishLC) { for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i= 0) { return; } // get original value var currentValue = this[name]; // deserialize Boolean or Number values from attribute var value = this.deserializeValue(value, currentValue); // only act if the value has changed if (value !== currentValue) { // install new value (has side-effects) this[name] = value; } } }, // return the published property matching name, or undefined propertyForAttribute: function(name) { var match = this._publishLC && this._publishLC[name]; return match; }, // convert representation of `stringValue` based on type of `currentValue` deserializeValue: function(stringValue, currentValue) { return scope.deserializeValue(stringValue, currentValue); }, // convert to a string value based on the type of `inferredType` serializeValue: function(value, inferredType) { if (inferredType === 'boolean') { return value ? '' : undefined; } else if (inferredType !== 'object' && inferredType !== 'function' && value !== undefined) { return value; } }, // serializes `name` property value and updates the corresponding attribute // note that reflection is opt-in. reflectPropertyToAttribute: function(name) { var inferredType = typeof this[name]; // try to intelligently serialize property value var serializedValue = this.serializeValue(this[name], inferredType); // boolean properties must reflect as boolean attributes if (serializedValue !== undefined) { this.setAttribute(name, serializedValue); // TODO(sorvell): we should remove attr for all properties // that have undefined serialization; however, we will need to // refine the attr reflection system to achieve this; pica, for example, // relies on having inferredType object properties not removed as // attrs. } else if (inferredType === 'boolean') { this.removeAttribute(name); } } }; // exports scope.api.instance.attributes = attributes; })(Polymer);