| Index: pkg/polymer/lib/src/js/polymer/polymer.concat.js
|
| diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
|
| index 85a6554d084eb8e9ebf2d0f3302c1278158a976e..44c0afbcf74e49b9951b0903a12fe5bcc5529a2a 100644
|
| --- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
|
| +++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
|
| @@ -407,11 +407,11 @@ if (typeof window.Polymer === 'function') {
|
| var handle = timeout ? setTimeout(fn, timeout) :
|
| requestAnimationFrame(fn);
|
| // NOTE: switch on inverting handle to determine which time is used.
|
| - return timeout ? handle : ~handle;
|
| + return timeout ? handle : 1 / handle;
|
| },
|
| cancelAsync: function(handle) {
|
| - if (handle < 0) {
|
| - cancelAnimationFrame(~handle);
|
| + if (handle < 1) {
|
| + cancelAnimationFrame(Math.round(1 / handle));
|
| } else {
|
| clearTimeout(handle);
|
| }
|
| @@ -664,8 +664,6 @@ if (typeof window.Polymer === 'function') {
|
| if ((n$ && n$.length) || (pn$ && pn$.length)) {
|
| var self = this;
|
| var o = this._propertyObserver = new CompoundObserver();
|
| - // keep track of property observer so we can shut it down
|
| - this.registerObservers([o]);
|
| for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
|
| o.addPath(this, n);
|
| // observer array properties
|
| @@ -708,7 +706,7 @@ if (typeof window.Polymer === 'function') {
|
| // if we are observing the previous value, stop
|
| if (Array.isArray(old)) {
|
| log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
|
| - this.closeNamedObserver(name + '__array');
|
| + this.unregisterObserver(name + '__array');
|
| }
|
| // if the new value is an array, being observing it
|
| if (Array.isArray(value)) {
|
| @@ -717,7 +715,7 @@ if (typeof window.Polymer === 'function') {
|
| observer.open(function(value, old) {
|
| this.invokeMethod(callbackName, [old]);
|
| }, this);
|
| - this.registerNamedObserver(name + '__array', observer);
|
| + this.registerObserver(name + '__array', observer);
|
| }
|
| }
|
| },
|
| @@ -725,51 +723,42 @@ if (typeof window.Polymer === 'function') {
|
| // apply Polymer two-way reference binding
|
| return bindProperties(this, property, observable);
|
| },
|
| + unbindAllProperties: function() {
|
| + if (this._propertyObserver) {
|
| + this._propertyObserver.close();
|
| + }
|
| + this.unregisterObservers();
|
| + },
|
| + unbindProperty: function(name) {
|
| + return this.unregisterObserver(name);
|
| + },
|
| invokeMethod: function(method, args) {
|
| var fn = this[method] || method;
|
| if (typeof fn === 'function') {
|
| fn.apply(this, args);
|
| }
|
| },
|
| - registerObservers: function(observers) {
|
| - this._observers.push(observers);
|
| - },
|
| - // observer array items are arrays of observers.
|
| - closeObservers: function() {
|
| - for (var i=0, l=this._observers.length; i<l; i++) {
|
| - this.closeObserverArray(this._observers[i]);
|
| - }
|
| - this._observers = [];
|
| - },
|
| - closeObserverArray: function(observerArray) {
|
| - for (var i=0, l=observerArray.length, o; i<l; i++) {
|
| - o = observerArray[i];
|
| - if (o && o.close) {
|
| - o.close();
|
| - }
|
| - }
|
| - },
|
| // bookkeeping observers for memory management
|
| - registerNamedObserver: function(name, observer) {
|
| - var o$ = this._namedObservers || (this._namedObservers = {});
|
| + registerObserver: function(name, observer) {
|
| + var o$ = this._observers || (this._observers = {});
|
| o$[name] = observer;
|
| },
|
| - closeNamedObserver: function(name) {
|
| - var o$ = this._namedObservers;
|
| + unregisterObserver: function(name) {
|
| + var o$ = this._observers;
|
| if (o$ && o$[name]) {
|
| o$[name].close();
|
| o$[name] = null;
|
| return true;
|
| }
|
| },
|
| - closeNamedObservers: function() {
|
| - if (this._namedObservers) {
|
| - var keys=Object.keys(this._namedObservers);
|
| + unregisterObservers: function() {
|
| + if (this._observers) {
|
| + var keys=Object.keys(this._observers);
|
| for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
|
| - o = this._namedObservers[k];
|
| + o = this._observers[k];
|
| o.close();
|
| }
|
| - this._namedObservers = {};
|
| + this._observers = {};
|
| }
|
| }
|
| };
|
| @@ -842,33 +831,33 @@ if (typeof window.Polymer === 'function') {
|
| var mdv = {
|
| syntax: syntax,
|
| instanceTemplate: function(template) {
|
| - var dom = template.createInstance(this, this.syntax);
|
| - this.registerObservers(dom.bindings_);
|
| - return dom;
|
| + return template.createInstance(this, this.syntax);
|
| },
|
| bind: function(name, observable, oneTime) {
|
| + // note: binding is a prepare signal. This allows us to be sure that any
|
| + // property changes that occur as a result of binding will be observed.
|
| + if (!this._elementPrepared) {
|
| + this.prepareElement();
|
| + }
|
| var property = this.propertyForAttribute(name);
|
| if (!property) {
|
| // TODO(sjmiles): this mixin method must use the special form
|
| // of `super` installed by `mixinMethod` in declaration/prototype.js
|
| return this.mixinSuper(arguments);
|
| } else {
|
| + // clean out the closets
|
| + this.unbind(name);
|
| // use n-way Polymer binding
|
| var observer = this.bindProperty(property, observable);
|
| + // stick path on observer so it's available via this.bindings
|
| + observer.path = observable.path_;
|
| + // reflect bound property to attribute when binding
|
| + // to ensure binding is not left on attribute if property
|
| + // does not update due to not changing.
|
| this.reflectPropertyToAttribute(property);
|
| - // NOTE: reflecting binding information is typically required only for
|
| - // tooling. It has a performance cost so it's opt-in in Node.bind.
|
| - if (Platform.enableBindingsReflection) {
|
| - observer.path = observable.path_;
|
| - this.bindings_ = this.bindings_ || {};
|
| - this.bindings_[name] = observer;
|
| - }
|
| - return observer;
|
| + return this.bindings[name] = observer;
|
| }
|
| },
|
| - // TODO(sorvell): unbind/unbindAll has been removed, as public api, from
|
| - // TemplateBinding. We still need to close/dispose of observers but perhaps
|
| - // we should choose a more explicit name.
|
| asyncUnbindAll: function() {
|
| if (!this._unbound) {
|
| log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
|
| @@ -877,12 +866,18 @@ if (typeof window.Polymer === 'function') {
|
| },
|
| unbindAll: function() {
|
| if (!this._unbound) {
|
| - this.closeObservers();
|
| - this.closeNamedObservers();
|
| + this.unbindAllProperties();
|
| + this.super();
|
| + // unbind shadowRoot
|
| + var root = this.shadowRoot;
|
| + while (root) {
|
| + unbindNodeTree(root);
|
| + root = root.olderShadowRoot;
|
| + }
|
| this._unbound = true;
|
| }
|
| },
|
| - cancelUnbindAll: function() {
|
| + cancelUnbindAll: function(preventCascade) {
|
| if (this._unbound) {
|
| log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
|
| return;
|
| @@ -891,6 +886,15 @@ if (typeof window.Polymer === 'function') {
|
| if (this._unbindAllJob) {
|
| this._unbindAllJob = this._unbindAllJob.stop();
|
| }
|
| + // cancel unbinding our shadow tree iff we're not in the process of
|
| + // cascading our tree (as we do, for example, when the element is inserted).
|
| + if (!preventCascade) {
|
| + forNodeTree(this.shadowRoot, function(n) {
|
| + if (n.cancelUnbindAll) {
|
| + n.cancelUnbindAll();
|
| + }
|
| + });
|
| + }
|
| }
|
| };
|
|
|
| @@ -926,17 +930,11 @@ if (typeof window.Polymer === 'function') {
|
| * license that can be found in the LICENSE file.
|
| */
|
| (function(scope) {
|
| + var preparingElements = 0;
|
|
|
| var base = {
|
| PolymerBase: true,
|
| - job: function(job, callback, wait) {
|
| - if (typeof job === 'string') {
|
| - var n = '___' + job;
|
| - this[n] = Polymer.job.call(this, this[n], callback, wait);
|
| - } else {
|
| - return Polymer.job.call(this, job, callback, wait);
|
| - }
|
| - },
|
| + job: Polymer.job,
|
| super: Polymer.super,
|
| // user entry point for element has had its createdCallback called
|
| created: function() {
|
| @@ -946,21 +944,17 @@ if (typeof window.Polymer === 'function') {
|
| ready: function() {
|
| },
|
| createdCallback: function() {
|
| - if (this.templateInstance && this.templateInstance.model) {
|
| - console.warn('Attributes on ' + this.localName + ' were data bound ' +
|
| - 'prior to Polymer upgrading the element. This may result in ' +
|
| - 'incorrect binding types.');
|
| - }
|
| this.created();
|
| - this.prepareElement();
|
| + if (this.ownerDocument.defaultView || this.alwaysPrepare ||
|
| + preparingElements > 0) {
|
| + this.prepareElement();
|
| + }
|
| },
|
| // system entry point, do not override
|
| prepareElement: function() {
|
| this._elementPrepared = true;
|
| // install shadowRoots storage
|
| this.shadowRoots = {};
|
| - // storage for closeable observers.
|
| - this._observers = [];
|
| // install property observers
|
| this.observeProperties();
|
| // install boilerplate attributes
|
| @@ -969,8 +963,13 @@ if (typeof window.Polymer === 'function') {
|
| this.takeAttributes();
|
| // add event listeners
|
| this.addHostListeners();
|
| + // guarantees that while preparing, any
|
| + // sub-elements are also prepared
|
| + preparingElements++;
|
| // process declarative resources
|
| this.parseDeclarations(this.__proto__);
|
| + // decrement semaphore
|
| + preparingElements--;
|
| // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
|
| // :unresolved; remove this attribute to be compatible with native
|
| // CE.
|
| @@ -979,7 +978,10 @@ if (typeof window.Polymer === 'function') {
|
| this.ready();
|
| },
|
| attachedCallback: function() {
|
| - this.cancelUnbindAll();
|
| + if (!this._elementPrepared) {
|
| + this.prepareElement();
|
| + }
|
| + this.cancelUnbindAll(true);
|
| // invoke user action
|
| if (this.attached) {
|
| this.attached();
|
| @@ -1040,7 +1042,7 @@ if (typeof window.Polymer === 'function') {
|
| var template = this.fetchTemplate(elementElement);
|
| if (template) {
|
| var root = this.shadowFromTemplate(template);
|
| - this.shadowRoots[elementElement.name] = root;
|
| + this.shadowRoots[elementElement.name] = root;
|
| }
|
| },
|
| // return a shadow-root template (if desired), override for custom behavior
|
| @@ -1052,6 +1054,8 @@ if (typeof window.Polymer === 'function') {
|
| if (template) {
|
| // make a shadow root
|
| var root = this.createShadowRoot();
|
| + // migrate flag(s)
|
| + root.resetStyleInheritance = this.resetStyleInheritance;
|
| // stamp template
|
| // which includes parsing and applying MDV bindings before being
|
| // inserted (to avoid {{}} in attribute values)
|
| @@ -1066,7 +1070,7 @@ if (typeof window.Polymer === 'function') {
|
| }
|
| },
|
| // utility function that stamps a <template> into light-dom
|
| - lightFromTemplate: function(template, refNode) {
|
| + lightFromTemplate: function(template) {
|
| if (template) {
|
| // TODO(sorvell): mark this element as a lightDOMController so that
|
| // event listeners on bound nodes inside it will be called on it.
|
| @@ -1079,18 +1083,14 @@ if (typeof window.Polymer === 'function') {
|
| // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
|
| var dom = this.instanceTemplate(template);
|
| // append to shadow dom
|
| - if (refNode) {
|
| - this.insertBefore(dom, refNode);
|
| - } else {
|
| - this.appendChild(dom);
|
| - }
|
| + this.appendChild(dom);
|
| // perform post-construction initialization tasks on ahem, light root
|
| - this.shadowRootReady(this);
|
| + this.shadowRootReady(this, template);
|
| // return the created shadow root
|
| return dom;
|
| }
|
| },
|
| - shadowRootReady: function(root) {
|
| + shadowRootReady: function(root, template) {
|
| // locate nodes with id and store references to them in this.$ hash
|
| this.marshalNodeReferences(root);
|
| // set up pointer gestures
|
| @@ -1166,12 +1166,25 @@ if (typeof window.Polymer === 'function') {
|
| /**
|
| * Installs external stylesheets and <style> elements with the attribute
|
| * polymer-scope='controller' into the scope of element. This is intended
|
| - * to be a called during custom element construction.
|
| + * to be a called during custom element construction. Note, this incurs a
|
| + * per instance cost and should be used sparingly.
|
| + *
|
| + * The need for this type of styling should go away when the shadowDOM spec
|
| + * addresses these issues:
|
| + *
|
| + * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21391
|
| + * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21390
|
| + * https://www.w3.org/Bugs/Public/show_bug.cgi?id=21389
|
| + *
|
| + * @param element The custom element instance into whose controller (parent)
|
| + * scope styles will be installed.
|
| + * @param elementElement The <element> containing controller styles.
|
| */
|
| + // TODO(sorvell): remove when spec issues are addressed
|
| installControllerStyles: function() {
|
| // apply controller styles, but only if they are not yet applied
|
| - var scope = this.findStyleScope();
|
| - if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
|
| + var scope = this.findStyleController();
|
| + if (scope && !this.scopeHasElementStyle(scope, STYLE_CONTROLLER_SCOPE)) {
|
| // allow inherited controller styles
|
| var proto = getPrototypeOf(this), cssText = '';
|
| while (proto && proto.element) {
|
| @@ -1179,50 +1192,29 @@ if (typeof window.Polymer === 'function') {
|
| proto = getPrototypeOf(proto);
|
| }
|
| if (cssText) {
|
| - this.installScopeCssText(cssText, scope);
|
| - }
|
| - }
|
| - },
|
| - installScopeStyle: function(style, name, scope) {
|
| - var scope = scope || this.findStyleScope(), name = name || '';
|
| - if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
|
| - var cssText = '';
|
| - if (style instanceof Array) {
|
| - for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
|
| - cssText += s.textContent + '\n\n';
|
| - }
|
| - } else {
|
| - cssText = style.textContent;
|
| + var style = this.element.cssTextToScopeStyle(cssText,
|
| + STYLE_CONTROLLER_SCOPE);
|
| + // TODO(sorvell): for now these styles are not shimmed
|
| + // but we may need to shim them
|
| + Polymer.applyStyleToScope(style, scope);
|
| }
|
| - this.installScopeCssText(cssText, scope, name);
|
| }
|
| },
|
| - installScopeCssText: function(cssText, scope, name) {
|
| - scope = scope || this.findStyleScope();
|
| - name = name || '';
|
| - if (!scope) {
|
| - return;
|
| - }
|
| + findStyleController: function() {
|
| if (window.ShadowDOMPolyfill) {
|
| - cssText = shimCssText(cssText, scope.host);
|
| - }
|
| - var style = this.element.cssTextToScopeStyle(cssText,
|
| - STYLE_CONTROLLER_SCOPE);
|
| - Polymer.applyStyleToScope(style, scope);
|
| - // cache that this style has been applied
|
| - scope._scopeStyles[this.localName + name] = true;
|
| - },
|
| - findStyleScope: function(node) {
|
| - // find the shadow root that contains this element
|
| - var n = node || this;
|
| - while (n.parentNode) {
|
| - n = n.parentNode;
|
| + return wrap(document.head);
|
| + } else {
|
| + // find the shadow root that contains this element
|
| + var n = this;
|
| + while (n.parentNode) {
|
| + n = n.parentNode;
|
| + }
|
| + return n === document ? document.head : n;
|
| }
|
| - return n;
|
| },
|
| - scopeHasNamedStyle: function(scope, name) {
|
| - scope._scopeStyles = scope._scopeStyles || {};
|
| - return scope._scopeStyles[name];
|
| + scopeHasElementStyle: function(scope, descriptor) {
|
| + var rule = STYLE_SCOPE_ATTRIBUTE + '=' + this.localName + '-' + descriptor;
|
| + return scope.querySelector('style[' + rule + ']');
|
| }
|
| };
|
|
|
| @@ -1232,16 +1224,6 @@ if (typeof window.Polymer === 'function') {
|
| return prototype.__proto__;
|
| }
|
|
|
| - function shimCssText(cssText, host) {
|
| - var name = '', is = false;
|
| - if (host) {
|
| - name = host.localName;
|
| - is = host.hasAttribute('is');
|
| - }
|
| - var selector = Platform.ShadowCSS.makeScopeSelector(name, is);
|
| - return Platform.ShadowCSS.shimCssText(cssText, selector);
|
| - }
|
| -
|
| // exports
|
|
|
| scope.api.instance.styles = styles;
|
| @@ -1264,15 +1246,6 @@ if (typeof window.Polymer === 'function') {
|
|
|
| // specify an 'own' prototype for tag `name`
|
| function element(name, prototype) {
|
| - if (arguments.length === 1 && typeof arguments[0] !== 'string') {
|
| - prototype = name;
|
| - var script = document._currentScript;
|
| - name = script && script.parentNode && script.parentNode.getAttribute ?
|
| - script.parentNode.getAttribute('name') : '';
|
| - if (!name) {
|
| - throw 'Element name could not be inferred.';
|
| - }
|
| - }
|
| if (getRegisteredPrototype[name]) {
|
| throw 'Already registered (Polymer) prototype for element ' + name;
|
| }
|
| @@ -1422,7 +1395,7 @@ scope.api.declaration.path = path;
|
| },
|
| copySheetAttributes: function(style, link) {
|
| for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
|
| - if (a.name !== 'rel' && a.name !== 'href') {
|
| + if (a.name !== 'rel' && a.name !== 'src') {
|
| style.setAttribute(a.name, a.value);
|
| }
|
| }
|
| @@ -1444,6 +1417,14 @@ scope.api.declaration.path = path;
|
| * element's template.
|
| * @param elementElement The <element> element to style.
|
| */
|
| + // TODO(sorvell): wip... caching and styles handling can probably be removed
|
| + // We need a scheme to ensure stylesheets are eagerly loaded without
|
| + // the creation of an element instance. Here are 2 options for handling this:
|
| + // 1. create a dummy element with ShadowDOM in dom that includes ALL styles
|
| + // processed here.
|
| + // 2. place stylesheets outside the element template. This will allow
|
| + // imports to naturally load the sheets. Then at load time, we can remove
|
| + // the stylesheet from dom.
|
| installSheets: function() {
|
| this.cacheSheets();
|
| this.cacheStyles();
|
| @@ -1554,17 +1535,11 @@ scope.api.declaration.path = path;
|
|
|
| function importRuleForSheet(sheet, baseUrl) {
|
| var href = new URL(sheet.getAttribute('href'), baseUrl).href;
|
| - return '@import \'' + href + '\';';
|
| + return '@import \'' + href + '\';'
|
| }
|
|
|
| function applyStyleToScope(style, scope) {
|
| if (style) {
|
| - if (scope === document) {
|
| - scope = document.head;
|
| - }
|
| - if (window.ShadowDOMPolyfill) {
|
| - scope = document.head;
|
| - }
|
| // TODO(sorvell): necessary for IE
|
| // see https://connect.microsoft.com/IE/feedback/details/790212/
|
| // cloning-a-style-element-and-adding-to-document-produces
|
| @@ -1575,17 +1550,7 @@ scope.api.declaration.path = path;
|
| if (attr) {
|
| clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
|
| }
|
| - // TODO(sorvell): probably too brittle; try to figure out
|
| - // where to put the element.
|
| - var refNode = scope.firstElementChild;
|
| - if (scope === document.head) {
|
| - var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
|
| - var s$ = document.head.querySelectorAll(selector);
|
| - if (s$.length) {
|
| - refNode = s$[s$.length-1].nextElementSibling;
|
| - }
|
| - }
|
| - scope.insertBefore(clone, refNode);
|
| + scope.appendChild(clone);
|
| }
|
| }
|
|
|
| @@ -1665,94 +1630,95 @@ scope.api.declaration.path = path;
|
| scope.api.declaration.events = events;
|
|
|
| })(Polymer);
|
| -/*
|
| - * Copyright 2013 The Polymer Authors. All rights reserved.
|
| - * Use of this source code is governed by a BSD-style
|
| - * license that can be found in the LICENSE file.
|
| - */
|
| -(function(scope) {
|
| -
|
| - // element api
|
| -
|
| - var properties = {
|
| - inferObservers: function(prototype) {
|
| - // called before prototype.observe is chained to inherited object
|
| - var observe = prototype.observe, property;
|
| - for (var n in prototype) {
|
| - if (n.slice(-7) === 'Changed') {
|
| - if (!observe) {
|
| - observe = (prototype.observe = {});
|
| - }
|
| - property = n.slice(0, -7)
|
| - observe[property] = observe[property] || n;
|
| - }
|
| - }
|
| - },
|
| - explodeObservers: function(prototype) {
|
| - // called before prototype.observe is chained to inherited object
|
| - var o = prototype.observe;
|
| - if (o) {
|
| - var exploded = {};
|
| - for (var n in o) {
|
| - var names = n.split(' ');
|
| - for (var i=0, ni; ni=names[i]; i++) {
|
| - exploded[ni] = o[n];
|
| - }
|
| - }
|
| - prototype.observe = exploded;
|
| - }
|
| - },
|
| - optimizePropertyMaps: function(prototype) {
|
| - if (prototype.observe) {
|
| - // construct name list
|
| - var a = prototype._observeNames = [];
|
| - for (var n in prototype.observe) {
|
| - var names = n.split(' ');
|
| - for (var i=0, ni; ni=names[i]; i++) {
|
| - a.push(ni);
|
| - }
|
| - }
|
| - }
|
| - if (prototype.publish) {
|
| - // construct name list
|
| - var a = prototype._publishNames = [];
|
| - for (var n in prototype.publish) {
|
| - a.push(n);
|
| - }
|
| - }
|
| - },
|
| - publishProperties: function(prototype, base) {
|
| - // if we have any properties to publish
|
| - var publish = prototype.publish;
|
| - if (publish) {
|
| - // transcribe `publish` entries onto own prototype
|
| - this.requireProperties(publish, prototype, base);
|
| - // construct map of lower-cased property names
|
| - prototype._publishLC = this.lowerCaseMap(publish);
|
| - }
|
| - },
|
| - requireProperties: function(properties, prototype, base) {
|
| - // ensure a prototype value for each property
|
| - for (var n in properties) {
|
| - if (prototype[n] === undefined && base[n] === undefined) {
|
| - prototype[n] = properties[n];
|
| - }
|
| - }
|
| - },
|
| - lowerCaseMap: function(properties) {
|
| - var map = {};
|
| - for (var n in properties) {
|
| - map[n.toLowerCase()] = n;
|
| - }
|
| - return map;
|
| - }
|
| - };
|
| -
|
| - // exports
|
| -
|
| - scope.api.declaration.properties = properties;
|
| -
|
| -})(Polymer);
|
| +/*
|
| + * Copyright 2013 The Polymer Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style
|
| + * license that can be found in the LICENSE file.
|
| + */
|
| +(function(scope) {
|
| +
|
| + // element api
|
| +
|
| + var properties = {
|
| + inferObservers: function(prototype) {
|
| + // called before prototype.observe is chained to inherited object
|
| + var observe = prototype.observe, property;
|
| + for (var n in prototype) {
|
| + if (n.slice(-7) === 'Changed') {
|
| + if (!observe) {
|
| + observe = (prototype.observe = {});
|
| + }
|
| + property = n.slice(0, -7)
|
| + observe[property] = observe[property] || n;
|
| + }
|
| + }
|
| + },
|
| + explodeObservers: function(prototype) {
|
| + // called before prototype.observe is chained to inherited object
|
| + var o = prototype.observe;
|
| + if (o) {
|
| + var exploded = {};
|
| + for (var n in o) {
|
| + var names = n.split(' ');
|
| + for (var i=0, ni; ni=names[i]; i++) {
|
| + exploded[ni] = o[n];
|
| + }
|
| + }
|
| + prototype.observe = exploded;
|
| + }
|
| + },
|
| + optimizePropertyMaps: function(prototype) {
|
| + if (prototype.observe) {
|
| + // construct name list
|
| + var a = prototype._observeNames = [];
|
| + for (var n in prototype.observe) {
|
| + var names = n.split(' ');
|
| + for (var i=0, ni; ni=names[i]; i++) {
|
| + a.push(ni);
|
| + }
|
| + //a.push(n);
|
| + }
|
| + }
|
| + if (prototype.publish) {
|
| + // construct name list
|
| + var a = prototype._publishNames = [];
|
| + for (var n in prototype.publish) {
|
| + a.push(n);
|
| + }
|
| + }
|
| + },
|
| + publishProperties: function(prototype, base) {
|
| + // if we have any properties to publish
|
| + var publish = prototype.publish;
|
| + if (publish) {
|
| + // transcribe `publish` entries onto own prototype
|
| + this.requireProperties(publish, prototype, base);
|
| + // construct map of lower-cased property names
|
| + prototype._publishLC = this.lowerCaseMap(publish);
|
| + }
|
| + },
|
| + requireProperties: function(properties, prototype, base) {
|
| + // ensure a prototype value for each property
|
| + for (var n in properties) {
|
| + if (prototype[n] === undefined && base[n] === undefined) {
|
| + prototype[n] = properties[n];
|
| + }
|
| + }
|
| + },
|
| + lowerCaseMap: function(properties) {
|
| + var map = {};
|
| + for (var n in properties) {
|
| + map[n.toLowerCase()] = n;
|
| + }
|
| + return map;
|
| + }
|
| + };
|
| +
|
| + // exports
|
| +
|
| + scope.api.declaration.properties = properties;
|
| +
|
| +})(Polymer);
|
|
|
| /*
|
| * Copyright 2013 The Polymer Authors. All rights reserved.
|
| @@ -2097,8 +2063,8 @@ scope.api.declaration.path = path;
|
| indexOf: function(element) {
|
| var i = queueForElement(element).indexOf(element);
|
| if (i >= 0 && document.contains(element)) {
|
| - i += (HTMLImports.useNative || HTMLImports.ready) ?
|
| - importQueue.length : 1e9;
|
| + i += (HTMLImports.useNative || HTMLImports.ready) ? importQueue.length :
|
| + 1e9;
|
| }
|
| return i;
|
| },
|
| @@ -2117,7 +2083,7 @@ scope.api.declaration.path = path;
|
| //console.warn('queue order wrong', i);
|
| return;
|
| }
|
| - return queueForElement(element).shift();
|
| + return queueForElement(element).shift();
|
| },
|
| check: function() {
|
| // next
|
| @@ -2281,11 +2247,10 @@ scope.api.declaration.path = path;
|
| || this.waitingForResources()) {
|
| return;
|
| }
|
| - // TODO(sorvell): ends up calling '_register' by virtue
|
| - // of `waitingForQueue` (see below)
|
| queue.go(this);
|
| },
|
|
|
| +
|
| // TODO(sorvell): refactor, this method is private-ish, but it's being
|
| // called by the queue object.
|
| _register: function() {
|
|
|