| 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 b217d9d9aaa2cac257c48dd302f54f86f1c7c594..816116fdded03a7826dc3a1c2b2bff338c4d2e60 100644
|
| --- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
|
| +++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
|
| @@ -3653,18 +3653,6 @@ PolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfN
|
| * 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
|
| */
|
| -Polymer = {
|
| - version: '0.3.3-0e73963'
|
| -};
|
| -
|
| -/*
|
| - * 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
|
| - */
|
|
|
| // TODO(sorvell): this ensures Polymer is an object and not a function
|
| // Platform is currently defining it as a function to allow for async loading
|
| @@ -5033,7 +5021,7 @@ if (typeof window.Polymer === 'function') {
|
| STYLE_CONTROLLER_SCOPE);
|
| Polymer.applyStyleToScope(style, scope);
|
| // cache that this style has been applied
|
| - scope._scopeStyles[this.localName + name] = true;
|
| + this.styleCacheForScope(scope)[this.localName + name] = true;
|
| },
|
| findStyleScope: function(node) {
|
| // find the shadow root that contains this element
|
| @@ -5044,10 +5032,20 @@ if (typeof window.Polymer === 'function') {
|
| return n;
|
| },
|
| scopeHasNamedStyle: function(scope, name) {
|
| - scope._scopeStyles = scope._scopeStyles || {};
|
| - return scope._scopeStyles[name];
|
| + var cache = this.styleCacheForScope(scope);
|
| + return cache[name];
|
| + },
|
| + styleCacheForScope: function(scope) {
|
| + if (window.ShadowDOMPolyfill) {
|
| + var scopeName = scope.host ? scope.host.localName : scope.localName;
|
| + return polyfillScopeStyleCache[scopeName] || (polyfillScopeStyleCache[scopeName] = {});
|
| + } else {
|
| + return scope._scopeStyles = (scope._scopeStyles || {});
|
| + }
|
| }
|
| };
|
| +
|
| + var polyfillScopeStyleCache = {};
|
|
|
| // NOTE: use raw prototype traversal so that we ensure correct traversal
|
| // on platforms where the protoype chain is simulated via __proto__ (IE10)
|
| @@ -6171,21 +6169,26 @@ scope.api.declaration.path = path;
|
|
|
| */
|
| var queue = {
|
| +
|
| // tell the queue to wait for an element to be ready
|
| - wait: function(element, check, go) {
|
| - var shouldAdd = (this.indexOf(element) === -1 &&
|
| - flushQueue.indexOf(element) === -1);
|
| + wait: function(element) {
|
| + if (!element.__queue) {
|
| + element.__queue = {};
|
| + elements.push(element);
|
| + }
|
| + },
|
| +
|
| + // enqueue an element to the next spot in the queue.
|
| + enqueue: function(element, check, go) {
|
| + var shouldAdd = element.__queue && !element.__queue.check;
|
| if (shouldAdd) {
|
| - this.add(element);
|
| - element.__check = check;
|
| - element.__go = go;
|
| + queueForElement(element).push(element);
|
| + element.__queue.check = check;
|
| + element.__queue.go = go;
|
| }
|
| return (this.indexOf(element) !== 0);
|
| },
|
| - add: function(element) {
|
| - //console.log('queueing', element.name);
|
| - queueForElement(element).push(element);
|
| - },
|
| +
|
| indexOf: function(element) {
|
| var i = queueForElement(element).indexOf(element);
|
| if (i >= 0 && document.contains(element)) {
|
| @@ -6194,14 +6197,17 @@ scope.api.declaration.path = path;
|
| }
|
| return i;
|
| },
|
| +
|
| // tell the queue an element is ready to be registered
|
| go: function(element) {
|
| var readied = this.remove(element);
|
| if (readied) {
|
| + element.__queue.flushable = true;
|
| this.addToFlushQueue(readied);
|
| this.check();
|
| }
|
| },
|
| +
|
| remove: function(element) {
|
| var i = this.indexOf(element);
|
| if (i !== 0) {
|
| @@ -6210,37 +6216,59 @@ scope.api.declaration.path = path;
|
| }
|
| return queueForElement(element).shift();
|
| },
|
| +
|
| check: function() {
|
| // next
|
| var element = this.nextElement();
|
| if (element) {
|
| - element.__check.call(element);
|
| + element.__queue.check.call(element);
|
| }
|
| if (this.canReady()) {
|
| this.ready();
|
| return true;
|
| }
|
| },
|
| +
|
| nextElement: function() {
|
| return nextQueued();
|
| },
|
| +
|
| canReady: function() {
|
| return !this.waitToReady && this.isEmpty();
|
| },
|
| +
|
| isEmpty: function() {
|
| - return !importQueue.length && !mainQueue.length;
|
| + for (var i=0, l=elements.length, e; (i<l) &&
|
| + (e=elements[i]); i++) {
|
| + if (e.__queue && !e.__queue.flushable) {
|
| + return;
|
| + }
|
| + }
|
| + return true;
|
| },
|
| +
|
| addToFlushQueue: function(element) {
|
| flushQueue.push(element);
|
| },
|
| +
|
| flush: function() {
|
| + // prevent re-entrance
|
| + if (this.flushing) {
|
| + return;
|
| + }
|
| + if (flushQueue.length) {
|
| + console.warn('flushing %s elements', flushQueue.length);
|
| + }
|
| + this.flushing = true;
|
| var element;
|
| while (flushQueue.length) {
|
| element = flushQueue.shift();
|
| - element.__go.call(element);
|
| - element.__check = element.__go = null;
|
| + element.__queue.go.call(element);
|
| + element.__queue = null;
|
| }
|
| + this.flushing = false;
|
| },
|
| +
|
| ready: function() {
|
| this.flush();
|
| // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
|
| @@ -6256,11 +6284,13 @@ scope.api.declaration.path = path;
|
| Platform.flush();
|
| requestAnimationFrame(this.flushReadyCallbacks);
|
| },
|
| +
|
| addReadyCallback: function(callback) {
|
| if (callback) {
|
| readyCallbacks.push(callback);
|
| }
|
| },
|
| +
|
| flushReadyCallbacks: function() {
|
| if (readyCallbacks) {
|
| var fn;
|
| @@ -6270,11 +6300,13 @@ scope.api.declaration.path = path;
|
| }
|
| }
|
| },
|
| +
|
| waitToReady: true
|
| +
|
| };
|
|
|
| + var elements = [];
|
| var flushQueue = [];
|
| -
|
| var importQueue = [];
|
| var mainQueue = [];
|
| var readyCallbacks = [];
|
| @@ -6304,8 +6336,9 @@ scope.api.declaration.path = path;
|
| }
|
|
|
| // exports
|
| + scope.elements = elements;
|
| scope.queue = queue;
|
| - scope.whenPolymerReady = whenPolymerReady;
|
| + scope.whenReady = scope.whenPolymerReady = whenPolymerReady;
|
| })(Polymer);
|
|
|
| /*
|
| @@ -6385,12 +6418,17 @@ scope.api.declaration.path = path;
|
| // fetch declared values
|
| this.name = this.getAttribute('name');
|
| this.extends = this.getAttribute('extends');
|
| + queue.wait(this);
|
| // initiate any async resource fetches
|
| this.loadResources();
|
| // register when all constraints are met
|
| this.registerWhenReady();
|
| },
|
|
|
| + // TODO(sorvell): we currently queue in the order the prototypes are
|
| + // registered, but we should queue in the order that polymer-elements
|
| + // are registered. We are currently blocked from doing this based on
|
| + // crbug.com/395686.
|
| registerWhenReady: function() {
|
| if (this.registered
|
| || this.waitingForPrototype(this.name)
|
| @@ -6398,16 +6436,11 @@ 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() {
|
| //console.log('registering', this.name);
|
| - //console.group('registering', this.name);
|
| // warn if extending from a custom element not registered via Polymer
|
| if (isCustomTag(this.extends) && !isRegistered(this.extends)) {
|
| console.warn('%s is attempting to extend %s, an unregistered element ' +
|
| @@ -6416,7 +6449,6 @@ scope.api.declaration.path = path;
|
| }
|
| this.register(this.name, this.extends);
|
| this.registered = true;
|
| - //console.groupEnd();
|
| },
|
|
|
| waitingForPrototype: function(name) {
|
| @@ -6434,19 +6466,8 @@ scope.api.declaration.path = path;
|
| // if explicitly marked as 'noscript'
|
| if (this.hasAttribute('noscript') && !this.noscript) {
|
| this.noscript = true;
|
| - // TODO(sorvell): CustomElements polyfill awareness:
|
| - // noscript elements should upgrade in logical order
|
| - // script injection ensures this under native custom elements;
|
| - // under imports + ce polyfills, scripts run before upgrades.
|
| - // dependencies should be ready at upgrade time so register
|
| - // prototype at this time.
|
| - if (window.CustomElements && !CustomElements.useNative) {
|
| - Polymer(name);
|
| - } else {
|
| - var script = document.createElement('script');
|
| - script.textContent = 'Polymer(\'' + name + '\');';
|
| - this.appendChild(script);
|
| - }
|
| + // imperative element registration
|
| + Polymer(name);
|
| }
|
| },
|
|
|
| @@ -6458,7 +6479,7 @@ scope.api.declaration.path = path;
|
| // dependency resolution. Previously this was enforced for inheritance,
|
| // and by rule for composition. It's now entirely by rule.
|
| waitingForQueue: function() {
|
| - return queue.wait(this, this.registerWhenReady, this._register);
|
| + return queue.enqueue(this, this.registerWhenReady, this._register);
|
| },
|
|
|
| loadResources: function() {
|
|
|