Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Unified Diff: runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js

Issue 342513004: Visual refresh of allocation profile page (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
deleted file mode 100644
index 85a6554d084eb8e9ebf2d0f3302c1278158a976e..0000000000000000000000000000000000000000
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
+++ /dev/null
@@ -1,2392 +0,0 @@
-/*
- * 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.
- */
-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.
- */
-
-// 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
-// of polymer; once we refine the loading process this likely goes away.
-if (typeof window.Polymer === 'function') {
- 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) {
-
- // copy own properties from 'api' to 'prototype, with name hinting for 'super'
- function extend(prototype, api) {
- if (prototype && api) {
- // use only own properties of 'api'
- Object.getOwnPropertyNames(api).forEach(function(n) {
- // acquire property descriptor
- var pd = Object.getOwnPropertyDescriptor(api, n);
- if (pd) {
- // clone property via descriptor
- Object.defineProperty(prototype, n, pd);
- // cache name-of-method for 'super' engine
- if (typeof pd.value == 'function') {
- // hint the 'super' engine
- pd.value.nom = n;
- }
- }
- });
- }
- return prototype;
- }
-
- // exports
-
- scope.extend = extend;
-
-})(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) {
-
- // usage
-
- // invoke cb.call(this) in 100ms, unless the job is re-registered,
- // which resets the timer
- //
- // this.myJob = this.job(this.myJob, cb, 100)
- //
- // returns a job handle which can be used to re-register a job
-
- var Job = function(inContext) {
- this.context = inContext;
- this.boundComplete = this.complete.bind(this)
- };
- Job.prototype = {
- go: function(callback, wait) {
- this.callback = callback;
- var h;
- if (!wait) {
- h = requestAnimationFrame(this.boundComplete);
- this.handle = function() {
- cancelAnimationFrame(h);
- }
- } else {
- h = setTimeout(this.boundComplete, wait);
- this.handle = function() {
- clearTimeout(h);
- }
- }
- },
- stop: function() {
- if (this.handle) {
- this.handle();
- this.handle = null;
- }
- },
- complete: function() {
- if (this.handle) {
- this.stop();
- this.callback.call(this.context);
- }
- }
- };
-
- function job(job, callback, wait) {
- if (job) {
- job.stop();
- } else {
- job = new Job(this);
- }
- job.go(callback, wait);
- return job;
- }
-
- // exports
-
- scope.job = job;
-
-})(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) {
-
- var registry = {};
-
- HTMLElement.register = function(tag, prototype) {
- registry[tag] = prototype;
- }
-
- // get prototype mapped to node <tag>
- HTMLElement.getPrototypeForTag = function(tag) {
- var prototype = !tag ? HTMLElement.prototype : registry[tag];
- // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
- return prototype || Object.getPrototypeOf(document.createElement(tag));
- };
-
- // we have to flag propagation stoppage for the event dispatcher
- var originalStopPropagation = Event.prototype.stopPropagation;
- Event.prototype.stopPropagation = function() {
- this.cancelBubble = true;
- originalStopPropagation.apply(this, arguments);
- };
-
- // TODO(sorvell): remove when we're sure imports does not need
- // to load stylesheets
- /*
- HTMLImports.importer.preloadSelectors +=
- ', polymer-element link[rel=stylesheet]';
- */
-})(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) {
- // super
-
- // `arrayOfArgs` is an optional array of args like one might pass
- // to `Function.apply`
-
- // TODO(sjmiles):
- // $super must be installed on an instance or prototype chain
- // as `super`, and invoked via `this`, e.g.
- // `this.super();`
-
- // will not work if function objects are not unique, for example,
- // when using mixins.
- // The memoization strategy assumes each function exists on only one
- // prototype chain i.e. we use the function object for memoizing)
- // perhaps we can bookkeep on the prototype itself instead
- function $super(arrayOfArgs) {
- // since we are thunking a method call, performance is important here:
- // memoize all lookups, once memoized the fast path calls no other
- // functions
- //
- // find the caller (cannot be `strict` because of 'caller')
- var caller = $super.caller;
- // memoized 'name of method'
- var nom = caller.nom;
- // memoized next implementation prototype
- var _super = caller._super;
- if (!_super) {
- if (!nom) {
- nom = caller.nom = nameInThis.call(this, caller);
- }
- if (!nom) {
- console.warn('called super() on a method not installed declaratively (has no .nom property)');
- }
- // super prototype is either cached or we have to find it
- // by searching __proto__ (at the 'top')
- _super = memoizeSuper(caller, nom, getPrototypeOf(this));
- }
- if (!_super) {
- // if _super is falsey, there is no super implementation
- //console.warn('called $super(' + nom + ') where there is no super implementation');
- } else {
- // our super function
- var fn = _super[nom];
- // memoize information so 'fn' can call 'super'
- if (!fn._super) {
- memoizeSuper(fn, nom, _super);
- }
- // invoke the inherited method
- // if 'fn' is not function valued, this will throw
- return fn.apply(this, arrayOfArgs || []);
- }
- }
-
- function nextSuper(proto, name, caller) {
- // look for an inherited prototype that implements name
- while (proto) {
- if ((proto[name] !== caller) && proto[name]) {
- return proto;
- }
- proto = getPrototypeOf(proto);
- }
- }
-
- function memoizeSuper(method, name, proto) {
- // find and cache next prototype containing `name`
- // we need the prototype so we can do another lookup
- // from here
- method._super = nextSuper(proto, name, method);
- if (method._super) {
- // _super is a prototype, the actual method is _super[name]
- // tag super method with it's name for further lookups
- method._super[name].nom = name;
- }
- return method._super;
- }
-
- function nameInThis(value) {
- var p = this.__proto__;
- while (p && p !== HTMLElement.prototype) {
- // TODO(sjmiles): getOwnPropertyNames is absurdly expensive
- var n$ = Object.getOwnPropertyNames(p);
- for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {
- var d = Object.getOwnPropertyDescriptor(p, n);
- if (typeof d.value === 'function' && d.value === value) {
- return n;
- }
- }
- p = p.__proto__;
- }
- }
-
- // NOTE: In some platforms (IE10) the prototype chain is faked via
- // __proto__. Therefore, always get prototype via __proto__ instead of
- // the more standard Object.getPrototypeOf.
- function getPrototypeOf(prototype) {
- return prototype.__proto__;
- }
-
- // utility function to precompute name tags for functions
- // in a (unchained) prototype
- function hintSuper(prototype) {
- // tag functions with their prototype name to optimize
- // super call invocations
- for (var n in prototype) {
- var pd = Object.getOwnPropertyDescriptor(prototype, n);
- if (pd && typeof pd.value === 'function') {
- pd.value.nom = n;
- }
- }
- }
-
- // exports
-
- scope.super = $super;
-
-})(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) {
-
- var typeHandlers = {
- string: function(value) {
- return value;
- },
- date: function(value) {
- return new Date(Date.parse(value) || Date.now());
- },
- boolean: function(value) {
- if (value === '') {
- return true;
- }
- return value === 'false' ? false : !!value;
- },
- number: function(value) {
- var n = parseFloat(value);
- // hex values like "0xFFFF" parseFloat as 0
- if (n === 0) {
- n = parseInt(value);
- }
- return isNaN(n) ? value : n;
- // this code disabled because encoded values (like "0xFFFF")
- // do not round trip to their original format
- //return (String(floatVal) === value) ? floatVal : value;
- },
- object: function(value, currentValue) {
- if (currentValue === null) {
- return value;
- }
- try {
- // If the string is an object, we can parse is with the JSON library.
- // include convenience replace for single-quotes. If the author omits
- // quotes altogether, parse will fail.
- return JSON.parse(value.replace(/'/g, '"'));
- } catch(e) {
- // The object isn't valid JSON, return the raw value
- return value;
- }
- },
- // avoid deserialization of functions
- 'function': function(value, currentValue) {
- return currentValue;
- }
- };
-
- function deserializeValue(value, currentValue) {
- // attempt to infer type from default value
- var inferredType = typeof currentValue;
- // invent 'date' type value for Date
- if (currentValue instanceof Date) {
- inferredType = 'date';
- }
- // delegate deserialization via type string
- return typeHandlers[inferredType](value, currentValue);
- }
-
- // exports
-
- scope.deserializeValue = deserializeValue;
-
-})(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) {
-
- // imports
-
- var extend = scope.extend;
-
- // module
-
- var api = {};
-
- api.declaration = {};
- api.instance = {};
-
- api.publish = function(apis, prototype) {
- for (var n in apis) {
- extend(prototype, apis[n]);
- }
- }
-
- // exports
-
- scope.api = api;
-
-})(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) {
-
- var utils = {
- /**
- * Invokes a function asynchronously. The context of the callback
- * function is bound to 'this' automatically.
- * @method async
- * @param {Function|String} method
- * @param {any|Array} args
- * @param {number} timeout
- */
- async: function(method, args, timeout) {
- // when polyfilling Object.observe, ensure changes
- // propagate before executing the async method
- Platform.flush();
- // second argument to `apply` must be an array
- args = (args && args.length) ? args : [args];
- // function to invoke
- var fn = function() {
- (this[method] || method).apply(this, args);
- }.bind(this);
- // execute `fn` sooner or later
- var handle = timeout ? setTimeout(fn, timeout) :
- requestAnimationFrame(fn);
- // NOTE: switch on inverting handle to determine which time is used.
- return timeout ? handle : ~handle;
- },
- cancelAsync: function(handle) {
- if (handle < 0) {
- cancelAnimationFrame(~handle);
- } else {
- clearTimeout(handle);
- }
- },
- /**
- * Fire an event.
- * @method fire
- * @returns {Object} event
- * @param {string} type An event name.
- * @param {any} detail
- * @param {Node} onNode Target node.
- */
- fire: function(type, detail, onNode, bubbles, cancelable) {
- var node = onNode || this;
- var detail = detail || {};
- var event = new CustomEvent(type, {
- bubbles: (bubbles !== undefined ? bubbles : true),
- cancelable: (cancelable !== undefined ? cancelable : true),
- detail: detail
- });
- node.dispatchEvent(event);
- return event;
- },
- /**
- * Fire an event asynchronously.
- * @method asyncFire
- * @param {string} type An event name.
- * @param detail
- * @param {Node} toNode Target node.
- */
- asyncFire: function(/*inType, inDetail*/) {
- this.async("fire", arguments);
- },
- /**
- * Remove class from old, add class to anew, if they exist
- * @param classFollows
- * @param anew A node.
- * @param old A node
- * @param className
- */
- classFollows: function(anew, old, className) {
- if (old) {
- old.classList.remove(className);
- }
- if (anew) {
- anew.classList.add(className);
- }
- }
- };
-
- // no-operation function for handy stubs
- var nop = function() {};
-
- // null-object for handy stubs
- var nob = {};
-
- // deprecated
-
- utils.asyncMethod = utils.async;
-
- // exports
-
- scope.api.instance.utils = utils;
- scope.nop = nop;
- scope.nob = nob;
-
-})(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) {
-
- // imports
-
- var log = window.logFlags || {};
- var EVENT_PREFIX = 'on-';
-
- // instance events api
- var events = {
- // read-only
- EVENT_PREFIX: EVENT_PREFIX,
- // event listeners on host
- addHostListeners: function() {
- var events = this.eventDelegates;
- log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
- // NOTE: host events look like bindings but really are not;
- // (1) we don't want the attribute to be set and (2) we want to support
- // multiple event listeners ('host' and 'instance') and Node.bind
- // by default supports 1 thing being bound.
- // We do, however, leverage the event hookup code in PolymerExpressions
- // so that we have a common code path for handling declarative events.
- var self = this, bindable, eventName;
- for (var n in events) {
- eventName = EVENT_PREFIX + n;
- bindable = PolymerExpressions.prepareEventBinding(
- Path.get(events[n]),
- eventName,
- {
- resolveEventHandler: function(model, path, node) {
- var fn = path.getValueFrom(self);
- if (fn) {
- return fn.bind(self);
- }
- }
- }
- );
- bindable(this, this, false);
- }
- },
- // call 'method' or function method on 'obj' with 'args', if the method exists
- dispatchMethod: function(obj, method, args) {
- if (obj) {
- log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
- var fn = typeof method === 'function' ? method : obj[method];
- if (fn) {
- fn[args ? 'apply' : 'call'](obj, args);
- }
- log.events && console.groupEnd();
- Platform.flush();
- }
- }
- };
-
- // exports
-
- scope.api.instance.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) {
-
- // instance api for attributes
-
- var attributes = {
- 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<l; i++) {
- this.attributeToProperty(a.name, a.value);
- }
- }
- },
- // if attribute 'name' is mapped to a property, deserialize
- // 'value' into that property
- attributeToProperty: function(name, value) {
- // try to match this attribute to a property (attributes are
- // all lower-case, so this is case-insensitive search)
- var name = this.propertyForAttribute(name);
- if (name) {
- // filter out 'mustached' values, these are to be
- // replaced with bound-data and are not yet values
- // themselves
- if (value && value.search(scope.bindPattern) >= 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];
- //console.log('propertyForAttribute:', name, 'matches', match);
- return match;
- },
- // convert representation of 'stringValue' based on type of 'currentValue'
- deserializeValue: function(stringValue, currentValue) {
- return scope.deserializeValue(stringValue, currentValue);
- },
- serializeValue: function(value, inferredType) {
- if (inferredType === 'boolean') {
- return value ? '' : undefined;
- } else if (inferredType !== 'object' && inferredType !== 'function'
- && value !== undefined) {
- return value;
- }
- },
- 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);
-
-/*
- * 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) {
-
- // imports
-
- var log = window.logFlags || {};
-
- // magic words
-
- var OBSERVE_SUFFIX = 'Changed';
-
- // element api
-
- var empty = [];
-
- var properties = {
- observeProperties: function() {
- var n$ = this._observeNames, pn$ = this._publishNames;
- 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
- var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);
- if (pd && pd.value) {
- this.observeArrayValue(n, pd.value, null);
- }
- }
- for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {
- if (!this.observe || (this.observe[n] === undefined)) {
- o.addPath(this, n);
- }
- }
- o.open(this.notifyPropertyChanges, this);
- }
- },
- notifyPropertyChanges: function(newValues, oldValues, paths) {
- var name, method, called = {};
- for (var i in oldValues) {
- // note: paths is of form [object, path, object, path]
- name = paths[2 * i + 1];
- if (this.publish[name] !== undefined) {
- this.reflectPropertyToAttribute(name);
- }
- method = this.observe[name];
- if (method) {
- this.observeArrayValue(name, newValues[i], oldValues[i]);
- if (!called[method]) {
- called[method] = true;
- // observes the value if it is an array
- this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);
- }
- }
- }
- },
- observeArrayValue: function(name, value, old) {
- // we only care if there are registered side-effects
- var callbackName = this.observe[name];
- if (callbackName) {
- // 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');
- }
- // if the new value is an array, being observing it
- if (Array.isArray(value)) {
- log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
- var observer = new ArrayObserver(value);
- observer.open(function(value, old) {
- this.invokeMethod(callbackName, [old]);
- }, this);
- this.registerNamedObserver(name + '__array', observer);
- }
- }
- },
- bindProperty: function(property, observable) {
- // apply Polymer two-way reference binding
- return bindProperties(this, property, observable);
- },
- 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 = {});
- o$[name] = observer;
- },
- closeNamedObserver: function(name) {
- var o$ = this._namedObservers;
- if (o$ && o$[name]) {
- o$[name].close();
- o$[name] = null;
- return true;
- }
- },
- closeNamedObservers: function() {
- if (this._namedObservers) {
- var keys=Object.keys(this._namedObservers);
- for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
- o = this._namedObservers[k];
- o.close();
- }
- this._namedObservers = {};
- }
- }
- };
-
- // property binding
- // bind a property in A to a path in B by converting A[property] to a
- // getter/setter pair that accesses B[...path...]
- function bindProperties(inA, inProperty, observable) {
- log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);
- // capture A's value if B's value is null or undefined,
- // otherwise use B's value
- // TODO(sorvell): need to review, can do with ObserverTransform
- var v = observable.discardChanges();
- if (v === null || v === undefined) {
- observable.setValue(inA[inProperty]);
- }
- return Observer.defineComputedProperty(inA, inProperty, observable);
- }
-
- // logging
- var LOG_OBSERVE = '[%s] watching [%s]';
- var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
- var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
- var LOG_BIND_PROPS = "[%s]: bindProperties: [%s] to [%s].[%s]";
-
- // exports
-
- scope.api.instance.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) {
-
- // imports
-
- var log = window.logFlags || 0;
- var events = scope.api.instance.events;
-
- var syntax = new PolymerExpressions();
- syntax.resolveEventHandler = function(model, path, node) {
- var ctlr = findEventController(node);
- if (ctlr) {
- var fn = path.getValueFrom(ctlr);
- if (fn) {
- return fn.bind(ctlr);
- }
- }
- }
-
- // An event controller is the host element for the shadowRoot in which
- // the node exists, or the first ancestor with a 'lightDomController'
- // property.
- function findEventController(node) {
- while (node.parentNode) {
- if (node.lightDomController) {
- return node;
- }
- node = node.parentNode;
- }
- return node.host;
- };
-
- // element api supporting mdv
-
- var mdv = {
- syntax: syntax,
- instanceTemplate: function(template) {
- var dom = template.createInstance(this, this.syntax);
- this.registerObservers(dom.bindings_);
- return dom;
- },
- bind: function(name, observable, oneTime) {
- 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 {
- // use n-way Polymer binding
- var observer = this.bindProperty(property, observable);
- 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;
- }
- },
- // 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);
- this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
- }
- },
- unbindAll: function() {
- if (!this._unbound) {
- this.closeObservers();
- this.closeNamedObservers();
- this._unbound = true;
- }
- },
- cancelUnbindAll: function() {
- if (this._unbound) {
- log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
- return;
- }
- log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
- if (this._unbindAllJob) {
- this._unbindAllJob = this._unbindAllJob.stop();
- }
- }
- };
-
- function unbindNodeTree(node) {
- forNodeTree(node, _nodeUnbindAll);
- }
-
- function _nodeUnbindAll(node) {
- node.unbindAll();
- }
-
- function forNodeTree(node, callback) {
- if (node) {
- callback(node);
- for (var child = node.firstChild; child; child = child.nextSibling) {
- forNodeTree(child, callback);
- }
- }
- }
-
- var mustachePattern = /\{\{([^{}]*)}}/;
-
- // exports
-
- scope.bindPattern = mustachePattern;
- scope.api.instance.mdv = mdv;
-
-})(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) {
-
- 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);
- }
- },
- super: Polymer.super,
- // user entry point for element has had its createdCallback called
- created: function() {
- },
- // user entry point for element has shadowRoot and is ready for
- // api interaction
- 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();
- },
- // 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
- this.copyInstanceAttributes();
- // process input attributes
- this.takeAttributes();
- // add event listeners
- this.addHostListeners();
- // process declarative resources
- this.parseDeclarations(this.__proto__);
- // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
- // :unresolved; remove this attribute to be compatible with native
- // CE.
- this.removeAttribute('unresolved');
- // user entry point
- this.ready();
- },
- attachedCallback: function() {
- this.cancelUnbindAll();
- // invoke user action
- if (this.attached) {
- this.attached();
- }
- // TODO(sorvell): bc
- if (this.enteredView) {
- this.enteredView();
- }
- // NOTE: domReady can be used to access elements in dom (descendants,
- // ancestors, siblings) such that the developer is enured to upgrade
- // ordering. If the element definitions have loaded, domReady
- // can be used to access upgraded elements.
- if (!this.hasBeenAttached) {
- this.hasBeenAttached = true;
- if (this.domReady) {
- this.async('domReady');
- }
- }
- },
- detachedCallback: function() {
- if (!this.preventDispose) {
- this.asyncUnbindAll();
- }
- // invoke user action
- if (this.detached) {
- this.detached();
- }
- // TODO(sorvell): bc
- if (this.leftView) {
- this.leftView();
- }
- },
- // TODO(sorvell): bc
- enteredViewCallback: function() {
- this.attachedCallback();
- },
- // TODO(sorvell): bc
- leftViewCallback: function() {
- this.detachedCallback();
- },
- // TODO(sorvell): bc
- enteredDocumentCallback: function() {
- this.attachedCallback();
- },
- // TODO(sorvell): bc
- leftDocumentCallback: function() {
- this.detachedCallback();
- },
- // recursive ancestral <element> initialization, oldest first
- parseDeclarations: function(p) {
- if (p && p.element) {
- this.parseDeclarations(p.__proto__);
- p.parseDeclaration.call(this, p.element);
- }
- },
- // parse input <element> as needed, override for custom behavior
- parseDeclaration: function(elementElement) {
- var template = this.fetchTemplate(elementElement);
- if (template) {
- var root = this.shadowFromTemplate(template);
- this.shadowRoots[elementElement.name] = root;
- }
- },
- // return a shadow-root template (if desired), override for custom behavior
- fetchTemplate: function(elementElement) {
- return elementElement.querySelector('template');
- },
- // utility function that creates a shadow root from a <template>
- shadowFromTemplate: function(template) {
- if (template) {
- // make a shadow root
- var root = this.createShadowRoot();
- // stamp template
- // which includes parsing and applying MDV bindings before being
- // inserted (to avoid {{}} in attribute values)
- // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
- var dom = this.instanceTemplate(template);
- // append to shadow dom
- root.appendChild(dom);
- // perform post-construction initialization tasks on shadow root
- this.shadowRootReady(root, template);
- // return the created shadow root
- return root;
- }
- },
- // utility function that stamps a <template> into light-dom
- lightFromTemplate: function(template, refNode) {
- if (template) {
- // TODO(sorvell): mark this element as a lightDOMController so that
- // event listeners on bound nodes inside it will be called on it.
- // Note, the expectation here is that events on all descendants
- // should be handled by this element.
- this.lightDomController = true;
- // stamp template
- // which includes parsing and applying MDV bindings before being
- // inserted (to avoid {{}} in attribute values)
- // 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);
- }
- // perform post-construction initialization tasks on ahem, light root
- this.shadowRootReady(this);
- // return the created shadow root
- return dom;
- }
- },
- shadowRootReady: function(root) {
- // locate nodes with id and store references to them in this.$ hash
- this.marshalNodeReferences(root);
- // set up pointer gestures
- PointerGestures.register(root);
- },
- // locate nodes with id and store references to them in this.$ hash
- marshalNodeReferences: function(root) {
- // establish $ instance variable
- var $ = this.$ = this.$ || {};
- // populate $ from nodes with ID from the LOCAL tree
- if (root) {
- var n$ = root.querySelectorAll("[id]");
- for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
- $[n.id] = n;
- };
- }
- },
- attributeChangedCallback: function(name, oldValue) {
- // TODO(sjmiles): adhoc filter
- if (name !== 'class' && name !== 'style') {
- this.attributeToProperty(name, this.getAttribute(name));
- }
- if (this.attributeChanged) {
- this.attributeChanged.apply(this, arguments);
- }
- },
- onMutation: function(node, listener) {
- var observer = new MutationObserver(function(mutations) {
- listener.call(this, observer, mutations);
- observer.disconnect();
- }.bind(this));
- observer.observe(node, {childList: true, subtree: true});
- }
- };
-
- // true if object has own PolymerBase api
- function isBase(object) {
- return object.hasOwnProperty('PolymerBase')
- }
-
- // name a base constructor for dev tools
-
- function PolymerBase() {};
- PolymerBase.prototype = base;
- base.constructor = PolymerBase;
-
- // exports
-
- scope.Base = PolymerBase;
- scope.isBase = isBase;
- scope.api.instance.base = base;
-
-})(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) {
-
- // imports
-
- var log = window.logFlags || {};
-
- // magic words
-
- var STYLE_SCOPE_ATTRIBUTE = 'element';
- var STYLE_CONTROLLER_SCOPE = 'controller';
-
- var styles = {
- STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
- /**
- * 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.
- */
- installControllerStyles: function() {
- // apply controller styles, but only if they are not yet applied
- var scope = this.findStyleScope();
- if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
- // allow inherited controller styles
- var proto = getPrototypeOf(this), cssText = '';
- while (proto && proto.element) {
- cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
- 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;
- }
- this.installScopeCssText(cssText, scope, name);
- }
- },
- installScopeCssText: function(cssText, scope, name) {
- scope = scope || this.findStyleScope();
- name = name || '';
- if (!scope) {
- return;
- }
- 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 n;
- },
- scopeHasNamedStyle: function(scope, name) {
- scope._scopeStyles = scope._scopeStyles || {};
- return scope._scopeStyles[name];
- }
- };
-
- // NOTE: use raw prototype traversal so that we ensure correct traversal
- // on platforms where the protoype chain is simulated via __proto__ (IE10)
- function getPrototypeOf(prototype) {
- 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;
-
-})(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) {
-
- // imports
-
- var extend = scope.extend;
- var api = scope.api;
-
- // imperative implementation: Polymer()
-
- // 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;
- }
- // cache the prototype
- registerPrototype(name, prototype);
- // notify the registrar waiting for 'name', if any
- notifyPrototype(name);
- }
-
- // async prototype source
-
- function waitingForPrototype(name, client) {
- waitPrototype[name] = client;
- }
-
- var waitPrototype = {};
-
- function notifyPrototype(name) {
- if (waitPrototype[name]) {
- waitPrototype[name].registerWhenReady();
- delete waitPrototype[name];
- }
- }
-
- // utility and bookkeeping
-
- // maps tag names to prototypes, as registered with
- // Polymer. Prototypes associated with a tag name
- // using document.registerElement are available from
- // HTMLElement.getPrototypeForTag().
- // If an element was fully registered by Polymer, then
- // Polymer.getRegisteredPrototype(name) ===
- // HTMLElement.getPrototypeForTag(name)
-
- var prototypesByName = {};
-
- function registerPrototype(name, prototype) {
- return prototypesByName[name] = prototype || {};
- }
-
- function getRegisteredPrototype(name) {
- return prototypesByName[name];
- }
-
- // exports
-
- scope.getRegisteredPrototype = getRegisteredPrototype;
- scope.waitingForPrototype = waitingForPrototype;
-
- // namespace shenanigans so we can expose our scope on the registration
- // function
-
- // make window.Polymer reference `element()`
-
- window.Polymer = element;
-
- // TODO(sjmiles): find a way to do this that is less terrible
- // copy window.Polymer properties onto `element()`
-
- extend(Polymer, scope);
-
- // Under the HTMLImports polyfill, scripts in the main document
- // do not block on imports; we want to allow calls to Polymer in the main
- // document. Platform collects those calls until we can process them, which
- // we do here.
-
- var declarations = Platform.deliverDeclarations();
- if (declarations) {
- for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
- element.apply(null, d);
- }
- }
-
-})(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) {
-
-var path = {
- resolveElementPaths: function(node) {
- Platform.urlResolver.resolveDom(node);
- },
- addResolvePathApi: function() {
- // let assetpath attribute modify the resolve path
- var assetPath = this.getAttribute('assetpath') || '';
- var root = new URL(assetPath, this.ownerDocument.baseURI);
- this.prototype.resolvePath = function(urlPath, base) {
- var u = new URL(urlPath, base || root);
- return u.href;
- };
- }
-};
-
-// exports
-scope.api.declaration.path = path;
-
-})(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) {
-
- // imports
-
- var log = window.logFlags || {};
- var api = scope.api.instance.styles;
- var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
-
- // magic words
-
- var STYLE_SELECTOR = 'style';
- var STYLE_LOADABLE_MATCH = '@import';
- var SHEET_SELECTOR = 'link[rel=stylesheet]';
- var STYLE_GLOBAL_SCOPE = 'global';
- var SCOPE_ATTR = 'polymer-scope';
-
- var styles = {
- // returns true if resources are loading
- loadStyles: function(callback) {
- var content = this.templateContent();
- if (content) {
- this.convertSheetsToStyles(content);
- }
- var styles = this.findLoadableStyles(content);
- if (styles.length) {
- Platform.styleResolver.loadStyles(styles, callback);
- } else if (callback) {
- callback();
- }
- },
- convertSheetsToStyles: function(root) {
- var s$ = root.querySelectorAll(SHEET_SELECTOR);
- for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
- c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
- this.ownerDocument);
- this.copySheetAttributes(c, s);
- s.parentNode.replaceChild(c, s);
- }
- },
- 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') {
- style.setAttribute(a.name, a.value);
- }
- }
- },
- findLoadableStyles: function(root) {
- var loadables = [];
- if (root) {
- var s$ = root.querySelectorAll(STYLE_SELECTOR);
- for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
- if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
- loadables.push(s);
- }
- }
- }
- return loadables;
- },
- /**
- * Install external stylesheets loaded in <polymer-element> elements into the
- * element's template.
- * @param elementElement The <element> element to style.
- */
- installSheets: function() {
- this.cacheSheets();
- this.cacheStyles();
- this.installLocalSheets();
- this.installGlobalStyles();
- },
- /**
- * Remove all sheets from element and store for later use.
- */
- cacheSheets: function() {
- this.sheets = this.findNodes(SHEET_SELECTOR);
- this.sheets.forEach(function(s) {
- if (s.parentNode) {
- s.parentNode.removeChild(s);
- }
- });
- },
- cacheStyles: function() {
- this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
- this.styles.forEach(function(s) {
- if (s.parentNode) {
- s.parentNode.removeChild(s);
- }
- });
- },
- /**
- * Takes external stylesheets loaded in an <element> element and moves
- * their content into a <style> element inside the <element>'s template.
- * The sheet is then removed from the <element>. This is done only so
- * that if the element is loaded in the main document, the sheet does
- * not become active.
- * Note, ignores sheets with the attribute 'polymer-scope'.
- * @param elementElement The <element> element to style.
- */
- installLocalSheets: function () {
- var sheets = this.sheets.filter(function(s) {
- return !s.hasAttribute(SCOPE_ATTR);
- });
- var content = this.templateContent();
- if (content) {
- var cssText = '';
- sheets.forEach(function(sheet) {
- cssText += cssTextFromSheet(sheet) + '\n';
- });
- if (cssText) {
- var style = createStyleElement(cssText, this.ownerDocument);
- content.insertBefore(style, content.firstChild);
- }
- }
- },
- findNodes: function(selector, matcher) {
- var nodes = this.querySelectorAll(selector).array();
- var content = this.templateContent();
- if (content) {
- var templateNodes = content.querySelectorAll(selector).array();
- nodes = nodes.concat(templateNodes);
- }
- return matcher ? nodes.filter(matcher) : nodes;
- },
- templateContent: function() {
- var template = this.querySelector('template');
- return template && templateContent(template);
- },
- /**
- * Promotes external stylesheets and <style> elements with the attribute
- * polymer-scope='global' into global scope.
- * This is particularly useful for defining @keyframe rules which
- * currently do not function in scoped or shadow style elements.
- * (See wkb.ug/72462)
- * @param elementElement The <element> element to style.
- */
- // TODO(sorvell): remove when wkb.ug/72462 is addressed.
- installGlobalStyles: function() {
- var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
- applyStyleToScope(style, document.head);
- },
- cssTextForScope: function(scopeDescriptor) {
- var cssText = '';
- // handle stylesheets
- var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
- var matcher = function(s) {
- return matchesSelector(s, selector);
- };
- var sheets = this.sheets.filter(matcher);
- sheets.forEach(function(sheet) {
- cssText += cssTextFromSheet(sheet) + '\n\n';
- });
- // handle cached style elements
- var styles = this.styles.filter(matcher);
- styles.forEach(function(style) {
- cssText += style.textContent + '\n\n';
- });
- return cssText;
- },
- styleForScope: function(scopeDescriptor) {
- var cssText = this.cssTextForScope(scopeDescriptor);
- return this.cssTextToScopeStyle(cssText, scopeDescriptor);
- },
- cssTextToScopeStyle: function(cssText, scopeDescriptor) {
- if (cssText) {
- var style = createStyleElement(cssText);
- style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
- '-' + scopeDescriptor);
- return style;
- }
- }
- };
-
- function importRuleForSheet(sheet, baseUrl) {
- var href = new URL(sheet.getAttribute('href'), baseUrl).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
- // -unexpected-result#details
- // var clone = style.cloneNode(true);
- var clone = createStyleElement(style.textContent);
- var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
- 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);
- }
- }
-
- function createStyleElement(cssText, scope) {
- scope = scope || document;
- scope = scope.createElement ? scope : scope.ownerDocument;
- var style = scope.createElement('style');
- style.textContent = cssText;
- return style;
- }
-
- function cssTextFromSheet(sheet) {
- return (sheet && sheet.__resource) || '';
- }
-
- function matchesSelector(node, inSelector) {
- if (matches) {
- return matches.call(node, inSelector);
- }
- }
- var p = HTMLElement.prototype;
- var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector
- || p.mozMatchesSelector;
-
- // exports
-
- scope.api.declaration.styles = styles;
- scope.applyStyleToScope = applyStyleToScope;
-
-})(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) {
-
- // imports
-
- var log = window.logFlags || {};
- var api = scope.api.instance.events;
- var EVENT_PREFIX = api.EVENT_PREFIX;
- // polymer-element declarative api: events feature
-
- var events = {
- parseHostEvents: function() {
- // our delegates map
- var delegates = this.prototype.eventDelegates;
- // extract data from attributes into delegates
- this.addAttributeDelegates(delegates);
- },
- addAttributeDelegates: function(delegates) {
- // for each attribute
- for (var i=0, a; a=this.attributes[i]; i++) {
- // does it have magic marker identifying it as an event delegate?
- if (this.hasEventPrefix(a.name)) {
- // if so, add the info to delegates
- delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
- .replace('}}', '').trim();
- }
- }
- },
- // starts with 'on-'
- hasEventPrefix: function (n) {
- return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
- },
- removeEventPrefix: function(n) {
- return n.slice(prefixLength);
- }
- };
-
- var prefixLength = EVENT_PREFIX.length;
-
- // exports
- 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) {
-
- // magic words
-
- var ATTRIBUTES_ATTRIBUTE = 'attributes';
- var ATTRIBUTES_REGEX = /\s|,/;
-
- // attributes api
-
- var attributes = {
- inheritAttributesObjects: function(prototype) {
- // chain our lower-cased publish map to the inherited version
- this.inheritObject(prototype, 'publishLC');
- // chain our instance attributes map to the inherited version
- this.inheritObject(prototype, '_instanceAttributes');
- },
- publishAttributes: function(prototype, base) {
- // merge names from 'attributes' attribute
- var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
- if (attributes) {
- // get properties to publish
- var publish = prototype.publish || (prototype.publish = {});
- // names='a b c' or names='a,b,c'
- var names = attributes.split(ATTRIBUTES_REGEX);
- // record each name for publishing
- for (var i=0, l=names.length, n; i<l; i++) {
- // remove excess ws
- n = names[i].trim();
- // do not override explicit entries
- if (n && publish[n] === undefined && base[n] === undefined) {
- publish[n] = null;
- }
- }
- }
- },
- // record clonable attributes from <element>
- accumulateInstanceAttributes: function() {
- // inherit instance attributes
- var clonable = this.prototype._instanceAttributes;
- // merge attributes from element
- var a$ = this.attributes;
- for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {
- if (this.isInstanceAttribute(a.name)) {
- clonable[a.name] = a.value;
- }
- }
- },
- isInstanceAttribute: function(name) {
- return !this.blackList[name] && name.slice(0,3) !== 'on-';
- },
- // do not clone these attributes onto instances
- blackList: {
- name: 1,
- 'extends': 1,
- constructor: 1,
- noscript: 1,
- assetpath: 1,
- 'cache-csstext': 1
- }
- };
-
- // add ATTRIBUTES_ATTRIBUTE to the blacklist
- attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
-
- // exports
-
- scope.api.declaration.attributes = attributes;
-
-})(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) {
-
- // imports
-
- var api = scope.api;
- var isBase = scope.isBase;
- var extend = scope.extend;
-
- // prototype api
-
- var prototype = {
-
- register: function(name, extendeeName) {
- // build prototype combining extendee, Polymer base, and named api
- this.buildPrototype(name, extendeeName);
- // register our custom element with the platform
- this.registerPrototype(name, extendeeName);
- // reference constructor in a global named by 'constructor' attribute
- this.publishConstructor();
- },
-
- buildPrototype: function(name, extendeeName) {
- // get our custom prototype (before chaining)
- var extension = scope.getRegisteredPrototype(name);
- // get basal prototype
- var base = this.generateBasePrototype(extendeeName);
- // implement declarative features
- this.desugarBeforeChaining(extension, base);
- // join prototypes
- this.prototype = this.chainPrototypes(extension, base);
- // more declarative features
- this.desugarAfterChaining(name, extendeeName);
- },
-
- desugarBeforeChaining: function(prototype, base) {
- // back reference declaration element
- // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
- prototype.element = this;
- // transcribe `attributes` declarations onto own prototype's `publish`
- this.publishAttributes(prototype, base);
- // `publish` properties to the prototype and to attribute watch
- this.publishProperties(prototype, base);
- // infer observers for `observe` list based on method names
- this.inferObservers(prototype);
- // desugar compound observer syntax, e.g. 'a b c'
- this.explodeObservers(prototype);
- },
-
- chainPrototypes: function(prototype, base) {
- // chain various meta-data objects to inherited versions
- this.inheritMetaData(prototype, base);
- // chain custom api to inherited
- var chained = this.chainObject(prototype, base);
- // x-platform fixup
- ensurePrototypeTraversal(chained);
- return chained;
- },
-
- inheritMetaData: function(prototype, base) {
- // chain observe object to inherited
- this.inheritObject('observe', prototype, base);
- // chain publish object to inherited
- this.inheritObject('publish', prototype, base);
- // chain our lower-cased publish map to the inherited version
- this.inheritObject('_publishLC', prototype, base);
- // chain our instance attributes map to the inherited version
- this.inheritObject('_instanceAttributes', prototype, base);
- // chain our event delegates map to the inherited version
- this.inheritObject('eventDelegates', prototype, base);
- },
-
- // implement various declarative features
- desugarAfterChaining: function(name, extendee) {
- // build side-chained lists to optimize iterations
- this.optimizePropertyMaps(this.prototype);
- // install external stylesheets as if they are inline
- this.installSheets();
- // adjust any paths in dom from imports
- this.resolveElementPaths(this);
- // compile list of attributes to copy to instances
- this.accumulateInstanceAttributes();
- // parse on-* delegates declared on `this` element
- this.parseHostEvents();
- //
- // install a helper method this.resolvePath to aid in
- // setting resource urls. e.g.
- // this.$.image.src = this.resolvePath('images/foo.png')
- this.addResolvePathApi();
- // under ShadowDOMPolyfill, transforms to approximate missing CSS features
- if (window.ShadowDOMPolyfill) {
- Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);
- }
- // allow custom element access to the declarative context
- if (this.prototype.registerCallback) {
- this.prototype.registerCallback(this);
- }
- },
-
- // if a named constructor is requested in element, map a reference
- // to the constructor to the given symbol
- publishConstructor: function() {
- var symbol = this.getAttribute('constructor');
- if (symbol) {
- window[symbol] = this.ctor;
- }
- },
-
- // build prototype combining extendee, Polymer base, and named api
- generateBasePrototype: function(extnds) {
- var prototype = this.findBasePrototype(extnds);
- if (!prototype) {
- // create a prototype based on tag-name extension
- var prototype = HTMLElement.getPrototypeForTag(extnds);
- // insert base api in inheritance chain (if needed)
- prototype = this.ensureBaseApi(prototype);
- // memoize this base
- memoizedBases[extnds] = prototype;
- }
- return prototype;
- },
-
- findBasePrototype: function(name) {
- return memoizedBases[name];
- },
-
- // install Polymer instance api into prototype chain, as needed
- ensureBaseApi: function(prototype) {
- if (prototype.PolymerBase) {
- return prototype;
- }
- var extended = Object.create(prototype);
- // we need a unique copy of base api for each base prototype
- // therefore we 'extend' here instead of simply chaining
- api.publish(api.instance, extended);
- // TODO(sjmiles): sharing methods across prototype chains is
- // not supported by 'super' implementation which optimizes
- // by memoizing prototype relationships.
- // Probably we should have a version of 'extend' that is
- // share-aware: it could study the text of each function,
- // look for usage of 'super', and wrap those functions in
- // closures.
- // As of now, there is only one problematic method, so
- // we just patch it manually.
- // To avoid re-entrancy problems, the special super method
- // installed is called `mixinSuper` and the mixin method
- // must use this method instead of the default `super`.
- this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
- // return buffed-up prototype
- return extended;
- },
-
- mixinMethod: function(extended, prototype, api, name) {
- var $super = function(args) {
- return prototype[name].apply(this, args);
- };
- extended[name] = function() {
- this.mixinSuper = $super;
- return api[name].apply(this, arguments);
- }
- },
-
- // ensure prototype[name] inherits from a prototype.prototype[name]
- inheritObject: function(name, prototype, base) {
- // require an object
- var source = prototype[name] || {};
- // chain inherited properties onto a new object
- prototype[name] = this.chainObject(source, base[name]);
- },
-
- // register 'prototype' to custom element 'name', store constructor
- registerPrototype: function(name, extendee) {
- var info = {
- prototype: this.prototype
- }
- // native element must be specified in extends
- var typeExtension = this.findTypeExtension(extendee);
- if (typeExtension) {
- info.extends = typeExtension;
- }
- // register the prototype with HTMLElement for name lookup
- HTMLElement.register(name, this.prototype);
- // register the custom type
- this.ctor = document.registerElement(name, info);
- },
-
- findTypeExtension: function(name) {
- if (name && name.indexOf('-') < 0) {
- return name;
- } else {
- var p = this.findBasePrototype(name);
- if (p.element) {
- return this.findTypeExtension(p.element.extends);
- }
- }
- }
-
- };
-
- // memoize base prototypes
- var memoizedBases = {};
-
- // implementation of 'chainObject' depends on support for __proto__
- if (Object.__proto__) {
- prototype.chainObject = function(object, inherited) {
- if (object && inherited && object !== inherited) {
- object.__proto__ = inherited;
- }
- return object;
- }
- } else {
- prototype.chainObject = function(object, inherited) {
- if (object && inherited && object !== inherited) {
- var chained = Object.create(inherited);
- object = extend(chained, object);
- }
- return object;
- }
- }
-
- // On platforms that do not support __proto__ (versions of IE), the prototype
- // chain of a custom element is simulated via installation of __proto__.
- // Although custom elements manages this, we install it here so it's
- // available during desugaring.
- function ensurePrototypeTraversal(prototype) {
- if (!Object.__proto__) {
- var ancestor = Object.getPrototypeOf(prototype);
- prototype.__proto__ = ancestor;
- if (isBase(ancestor)) {
- ancestor.__proto__ = Object.getPrototypeOf(ancestor);
- }
- }
- }
-
- // exports
-
- api.declaration.prototype = prototype;
-
-})(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) {
-
- var queue = {
- // tell the queue to wait for an element to be ready
- wait: function(element, check, go) {
- if (this.indexOf(element) === -1) {
- this.add(element);
- element.__check = check;
- element.__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)) {
- i += (HTMLImports.useNative || HTMLImports.ready) ?
- importQueue.length : 1e9;
- }
- return i;
- },
- // tell the queue an element is ready to be registered
- go: function(element) {
- var readied = this.remove(element);
- if (readied) {
- readied.__go.call(readied);
- readied.__check = readied.__go = null;
- this.check();
- }
- },
- remove: function(element) {
- var i = this.indexOf(element);
- if (i !== 0) {
- //console.warn('queue order wrong', i);
- return;
- }
- return queueForElement(element).shift();
- },
- check: function() {
- // next
- var element = this.nextElement();
- if (element) {
- element.__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;
- },
- ready: function() {
- // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
- // while registering. This way we avoid having to upgrade each document
- // piecemeal per registration and can instead register all elements
- // and upgrade once in a batch. Without this optimization, upgrade time
- // degrades significantly when SD polyfill is used. This is mainly because
- // querying the document tree for elements is slow under the SD polyfill.
- if (CustomElements.ready === false) {
- CustomElements.upgradeDocumentTree(document);
- CustomElements.ready = true;
- }
- if (readyCallbacks) {
- var fn;
- while (readyCallbacks.length) {
- fn = readyCallbacks.shift();
- fn();
- }
- }
- },
- addReadyCallback: function(callback) {
- if (callback) {
- readyCallbacks.push(callback);
- }
- },
- waitToReady: true
- };
-
- var importQueue = [];
- var mainQueue = [];
- var readyCallbacks = [];
-
- function queueForElement(element) {
- return document.contains(element) ? mainQueue : importQueue;
- }
-
- function nextQueued() {
- return importQueue.length ? importQueue[0] : mainQueue[0];
- }
-
- var polymerReadied = false;
-
- document.addEventListener('WebComponentsReady', function() {
- CustomElements.ready = false;
- });
-
- function whenPolymerReady(callback) {
- queue.waitToReady = true;
- CustomElements.ready = false;
- HTMLImports.whenImportsReady(function() {
- queue.addReadyCallback(callback);
- queue.waitToReady = false;
- queue.check();
- });
- }
-
- // exports
- scope.queue = queue;
- scope.whenPolymerReady = whenPolymerReady;
-})(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) {
-
- var whenPolymerReady = scope.whenPolymerReady;
-
- function importElements(elementOrFragment, callback) {
- if (elementOrFragment) {
- document.head.appendChild(elementOrFragment);
- whenPolymerReady(callback);
- } else if (callback) {
- callback();
- }
- }
-
- function importUrls(urls, callback) {
- if (urls && urls.length) {
- var frag = document.createDocumentFragment();
- for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
- link = document.createElement('link');
- link.rel = 'import';
- link.href = url;
- frag.appendChild(link);
- }
- importElements(frag, callback);
- } else if (callback) {
- callback();
- }
- }
-
- // exports
- scope.import = importUrls;
- scope.importElements = importElements;
-
-})(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) {
-
- // imports
-
- var extend = scope.extend;
- var api = scope.api;
- var queue = scope.queue;
- var whenPolymerReady = scope.whenPolymerReady;
- var getRegisteredPrototype = scope.getRegisteredPrototype;
- var waitingForPrototype = scope.waitingForPrototype;
-
- // declarative implementation: <polymer-element>
-
- var prototype = extend(Object.create(HTMLElement.prototype), {
-
- createdCallback: function() {
- if (this.getAttribute('name')) {
- this.init();
- }
- },
-
- init: function() {
- // fetch declared values
- this.name = this.getAttribute('name');
- this.extends = this.getAttribute('extends');
- // initiate any async resource fetches
- this.loadResources();
- // register when all constraints are met
- this.registerWhenReady();
- },
-
- registerWhenReady: function() {
- if (this.registered
- || this.waitingForPrototype(this.name)
- || this.waitingForQueue()
- || 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 ' +
- 'or one that was not registered with Polymer.', this.name,
- this.extends);
- }
- this.register(this.name, this.extends);
- this.registered = true;
- //console.groupEnd();
- },
-
- waitingForPrototype: function(name) {
- if (!getRegisteredPrototype(name)) {
- // then wait for a prototype
- waitingForPrototype(name, this);
- // emulate script if user is not supplying one
- this.handleNoScript(name);
- // prototype not ready yet
- return true;
- }
- },
-
- handleNoScript: function(name) {
- // 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);
- }
- }
- },
-
- waitingForResources: function() {
- return this._needsResources;
- },
-
- // NOTE: Elements must be queued in proper order for inheritance/composition
- // 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);
- },
-
- loadResources: function() {
- this._needsResources = true;
- this.loadStyles(function() {
- this._needsResources = false;
- this.registerWhenReady();
- }.bind(this));
- }
-
- });
-
- // semi-pluggable APIs
-
- // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
- // the various plugins are allowed to depend on each other directly)
- api.publish(api.declaration, prototype);
-
- // utility and bookkeeping
-
- function isRegistered(name) {
- return Boolean(HTMLElement.getPrototypeForTag(name));
- }
-
- function isCustomTag(name) {
- return (name && name.indexOf('-') >= 0);
- }
-
- // exports
-
- scope.getRegisteredPrototype = getRegisteredPrototype;
-
- // boot tasks
-
- whenPolymerReady(function() {
- document.body.removeAttribute('unresolved');
- document.dispatchEvent(
- new CustomEvent('polymer-ready', {bubbles: true})
- );
- });
-
- // register polymer-element with document
-
- document.registerElement('polymer-element', {prototype: prototype});
-
-})(Polymer);
-
-//# sourceMappingURL=polymer.concat.js.map

Powered by Google App Engine
This is Rietveld 408576698