/* * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ (function(scope) { // imports var extend = scope.extend; var api = scope.api; // imperative implementation: Polymer() // specify an 'own' prototype for tag `name` function element(name, prototype) { if (typeof name !== 'string') { var script = prototype || document._currentScript; prototype = name; 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]; } function instanceOfType(element, type) { if (typeof type !== 'string') { return false; } var proto = HTMLElement.getPrototypeForTag(type); var ctor = proto && proto.constructor; if (!ctor) { return false; } if (CustomElements.instanceof) { return CustomElements.instanceof(element, ctor); } return element instanceof ctor; } // exports scope.getRegisteredPrototype = getRegisteredPrototype; scope.waitingForPrototype = waitingForPrototype; scope.instanceOfType = instanceOfType; // 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. WebComponents collects those calls until we can process them, which // we do here. if (WebComponents.consumeDeclarations) { WebComponents.consumeDeclarations(function(declarations) { if (declarations) { for (var i=0, l=declarations.length, d; (i