From f62bda0e31b3537b5bddadd3b9b77f5a0738779c Mon Sep 17 00:00:00 2001 From: cronon Date: Fri, 24 Mar 2017 12:02:45 +0300 Subject: [PATCH 1/3] call attrChangedCb even if value hasn't changed Spec says to call it even when the value hasn't changed. https://www.w3.org/TR/custom-elements/#concept-element-attributes-change https://bugs.chromium.org/p/chromium/issues/detail?id=676247 --- custom-elements.min.js | 2 +- custom-elements.min.js.map | 2 +- src/Patch/Element.js | 4 +--- tests/html/Element/setAttribute.html | 4 ++-- tests/js/reactions.js | 20 ++++++++++++++++++++ 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/custom-elements.min.js b/custom-elements.min.js index e93a91a..4d5d609 100644 --- a/custom-elements.min.js +++ b/custom-elements.min.js @@ -21,7 +21,7 @@ return a});q(Node.prototype,"removeChild",function(a){var c=l(a),d=J.call(this,a 0;b=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {!Set=} visitedImports\n */\n patchAndUpgradeTree(root, visitedImports = new Set()) {\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node && importNode.readyState === 'complete') {\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n visitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, visitedImports);\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n this.upgradeElement(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise}\n */\n toPromise() {\n return this._promise;\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array}\n */\n this._unflushedLocalNames = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n\n this._unflushedLocalNames.push(localName);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n\n this._flushPending = false;\n this._internals.patchAndUpgradeTree(document);\n\n while (this._unflushedLocalNames.length > 0) {\n const localName = this._unflushedLocalNames.shift();\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && this._unflushedLocalNames.indexOf(localName) === -1) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['prepend'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.prepend.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['append'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.append.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['before'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.before.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['after'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.after.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['replaceWith'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n destination['remove'] = function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n } else {\n console.warn('Custom Elements: `Element#attachShadow` was not patched.');\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n /** @type {HTMLDivElement} */\n const rawDiv = Native.Document_createElement.call(document, 'div');\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n /** @type {!Node} */\n const content = this.localName === 'template' ? (/** @type {!HTMLTemplateElement} */ (this)).content : this;\n rawDiv.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n while (rawDiv.childNodes.length > 0) {\n Native.Node_appendChild.call(content, rawDiv.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} where\n * @param {!Element} element\n * @return {?Element}\n */\n function(where, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, where, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n"]} \ No newline at end of file +{"version":3,"sources":["src/AlreadyConstructedMarker.js","src/Utilities.js","src/CustomElementInternals.js","src/CustomElementState.js","src/DocumentConstructionObserver.js","src/Deferred.js","src/CustomElementRegistry.js","src/Patch/Native.js","src/Patch/HTMLElement.js","src/custom-elements.js","src/Patch/Interface/ParentNode.js","src/Patch/Document.js","src/Patch/Node.js","src/Patch/Interface/ChildNode.js","src/Patch/Element.js"],"names":["$jscompDefaultExport","AlreadyConstructedMarker","reservedTagList","Set","isValidCustomElementName$$module$$src$Utilities","isValidCustomElementName","localName","reserved","has","validForm","test","isConnected$$module$$src$Utilities","isConnected","node","nativeValue","undefined","current","__CE_isImportDocument","Document","parentNode","window","ShadowRoot","host","nextSiblingOrAncestorSibling$$module$$src$Utilities","nextSiblingOrAncestorSibling","root","start","nextSibling","walkDeepDescendantElements$$module$$src$Utilities","walkDeepDescendantElements","callback","visitedImports","nodeType","Node","ELEMENT_NODE","element","getAttribute","importNode","import","add","child","firstChild","shadowRoot","__CE_shadowRoot","setPropertyUnchecked$$module$$src$Utilities","setPropertyUnchecked","destination","name","value","constructor","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","set","addPatch","listener","push","patchTree","patch","__CE_patched","i","length","connectTree","elements","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","gatherElements","readyState","__CE_hasRegistry","addEventListener","__CE_documentLoadHandled","delete","localNameToDefinition","get","constructionStack","result","Error","pop","e","failed","__CE_definition","attributeChangedCallback","observedAttributes","call","oldValue","newValue","namespace","indexOf","DocumentConstructionObserver","internals","doc","_internals","_document","_observer","MutationObserver","_handleMutations","bind","observe","childList","subtree","disconnect","mutations","addedNodes","j","Deferred","_resolve","_value","_promise","Promise","resolve","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","fn","_flushPending","_unflushedLocalNames","_documentConstructionObserver","document","define","Function","TypeError","SyntaxError","adoptedCallback","getCallback","callbackValue","prototype","Object","_flush","shift","deferred","whenDefined","reject","prior","polyfillWrapFlushCallback","outer","inner","flush","Document_createElement","createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","Node_cloneNode","cloneNode","Node_appendChild","appendChild","Node_insertBefore","insertBefore","Node_removeChild","removeChild","Node_replaceChild","replaceChild","Node_textContent","getOwnPropertyDescriptor","Element_attachShadow","Element","Element_innerHTML","Element_getAttribute","Element_setAttribute","setAttribute","Element_removeAttribute","removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$HTMLElement","$jscompDefaultExport$$module$$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement","$jscompDefaultExport$$module$$src$Patch$Interface$ParentNode","builtIn","connectedBefore","nodes","filter","prepend","apply","append","$jscompDefaultExport$$module$$src$Patch$Document","deep","clone","$jscompDefaultExport$$module$$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$$src$Patch$Native.Document_append","$jscompDefaultExport$$module$$src$Patch$Node","patch_textContent","baseDescriptor","defineProperty","enumerable","configurable","assignedValue","TEXT_NODE","removedNodes","childNodes","childNodesLength","Array","refNode","DocumentFragment","insertedNodes","slice","nativeResult","$jscompDefaultExport$$module$$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$$src$Patch$Native.Node_cloneNode.call","ownerDocument","$jscompDefaultExport$$module$$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$$src$Patch$Native.Node_textContent.get","parts","textContent","join","createTextNode","$jscompDefaultExport$$module$$src$Patch$Interface$ChildNode","$jscompDefaultExport$$module$$src$Patch$Native.Element_before","$jscompDefaultExport$$module$$src$Patch$Native.Element_after","wasConnected","$jscompDefaultExport$$module$$src$Patch$Native.Element_replaceWith","$jscompDefaultExport$$module$$src$Patch$Native.Element_remove","$jscompDefaultExport$$module$$src$Patch$Element","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","where","insertedElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$$src$Patch$Native.Element_attachShadow.call","console","warn","$jscompDefaultExport$$module$$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_innerHTML.get","rawDiv","innerHTML","content","$jscompDefaultExport$$module$$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$$src$Patch$Native.Element_append","priorCustomElements","customElements"],"mappings":"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","file":"custom-elements.min.js","sourcesContent":["/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","const reservedTagList = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n const reserved = reservedTagList.has(localName);\n const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n // Use `Node#isConnected`, if defined.\n const nativeValue = node.isConnected;\n if (nativeValue !== undefined) {\n return nativeValue;\n }\n\n /** @type {?Node|undefined} */\n let current = node;\n while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n }\n return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n let node = start;\n while (node && node !== root && !node.nextSibling) {\n node = node.parentNode;\n }\n return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {!Set=} visitedImports\n */\n patchAndUpgradeTree(root, visitedImports = new Set()) {\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node && importNode.readyState === 'complete') {\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n visitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, visitedImports);\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n this.upgradeElement(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise}\n */\n toPromise() {\n return this._promise;\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array}\n */\n this._unflushedLocalNames = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n\n this._unflushedLocalNames.push(localName);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n\n this._flushPending = false;\n this._internals.patchAndUpgradeTree(document);\n\n while (this._unflushedLocalNames.length > 0) {\n const localName = this._unflushedLocalNames.shift();\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && this._unflushedLocalNames.indexOf(localName) === -1) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['prepend'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.prepend.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['append'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.append.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['before'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.before.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['after'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.after.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['replaceWith'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n destination['remove'] = function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n } else {\n console.warn('Custom Elements: `Element#attachShadow` was not patched.');\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n /** @type {HTMLDivElement} */\n const rawDiv = Native.Document_createElement.call(document, 'div');\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n /** @type {!Node} */\n const content = this.localName === 'template' ? (/** @type {!HTMLTemplateElement} */ (this)).content : this;\n rawDiv.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n while (rawDiv.childNodes.length > 0) {\n Native.Node_appendChild.call(content, rawDiv.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} where\n * @param {!Element} element\n * @return {?Element}\n */\n function(where, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, where, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n"]} \ No newline at end of file diff --git a/src/Patch/Element.js b/src/Patch/Element.js index a43ecae..2be1282 100644 --- a/src/Patch/Element.js +++ b/src/Patch/Element.js @@ -131,9 +131,7 @@ export default function(internals) { const oldValue = Native.Element_getAttribute.call(this, name); Native.Element_setAttribute.call(this, name, newValue); newValue = Native.Element_getAttribute.call(this, name); - if (oldValue !== newValue) { - internals.attributeChangedCallback(this, name, oldValue, newValue, null); - } + internals.attributeChangedCallback(this, name, oldValue, newValue, null); }); Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS', diff --git a/tests/html/Element/setAttribute.html b/tests/html/Element/setAttribute.html index 0fed367..6be9a08 100644 --- a/tests/html/Element/setAttribute.html +++ b/tests/html/Element/setAttribute.html @@ -81,7 +81,7 @@ defineWithLocalName(localName, ['attr']); }); - test('Setting an observed attribute to its current value does not trigger a callback.', function() { + test('Setting an observed attribute to its current value does trigger a callback.', function() { const element = document.createElement(localName); assert.equal(element.attrCallbackArgs.length, 0); @@ -93,7 +93,7 @@ element.setAttribute('attr', 'abc'); - assert.equal(element.attrCallbackArgs.length, 1); + assert.equal(element.attrCallbackArgs.length, 2); }); test('Setting an observed attribute to a different value triggers a callback.', function() { diff --git a/tests/js/reactions.js b/tests/js/reactions.js index 9959b8e..f71d53f 100644 --- a/tests/js/reactions.js +++ b/tests/js/reactions.js @@ -240,6 +240,26 @@ suite('Custom Element Reactions', function() { assert.equal(changed[0].newValue, 'test1', 'newValue'); }); + test('called even if attribute value hasn\'t changed', function () { + var calls = 0; + class XBoo extends HTMLElement { + static get observedAttributes () { + return ['foo']; + } + attributeChangedCallback(name, oldValue, newValue) { + calls += 1; + } + } + var element = document.createElement('x-boo-at2'); + + customElements.define('x-boo-at2', XBoo); + work.appendChild(element); + element.setAttribute('foo', 'foo'); + element.setAttribute('foo', 'foo'); + + assert.equal(calls, 2); + }) + }); suite('connectedCallback', function() { From 49684dc3afbfdc25634cc48126eddf1c4f06db24 Mon Sep 17 00:00:00 2001 From: cronon Date: Tue, 4 Apr 2017 18:53:44 +0300 Subject: [PATCH 2/3] update setAttributeNS too --- src/Patch/Element.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Patch/Element.js b/src/Patch/Element.js index 2be1282..27781d0 100644 --- a/src/Patch/Element.js +++ b/src/Patch/Element.js @@ -150,9 +150,7 @@ export default function(internals) { const oldValue = Native.Element_getAttributeNS.call(this, namespace, name); Native.Element_setAttributeNS.call(this, namespace, name, newValue); newValue = Native.Element_getAttributeNS.call(this, namespace, name); - if (oldValue !== newValue) { - internals.attributeChangedCallback(this, name, oldValue, newValue, namespace); - } + internals.attributeChangedCallback(this, name, oldValue, newValue, namespace); }); Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute', From 07a88c3ffec288269b9bc36875733e3793a3f81e Mon Sep 17 00:00:00 2001 From: cronon Date: Tue, 4 Apr 2017 19:03:52 +0300 Subject: [PATCH 3/3] update tests and build --- custom-elements.min.js | 4 ++-- custom-elements.min.js.map | 2 +- tests/html/Element/setAttributeNS.html | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/custom-elements.min.js b/custom-elements.min.js index 4d5d609..a80119f 100644 --- a/custom-elements.min.js +++ b/custom-elements.min.js @@ -21,8 +21,8 @@ return a});q(Node.prototype,"removeChild",function(a){var c=l(a),d=J.call(this,a 0;b=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {!Set=} visitedImports\n */\n patchAndUpgradeTree(root, visitedImports = new Set()) {\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node && importNode.readyState === 'complete') {\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n visitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, visitedImports);\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n this.upgradeElement(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise}\n */\n toPromise() {\n return this._promise;\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array}\n */\n this._unflushedLocalNames = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n\n this._unflushedLocalNames.push(localName);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n\n this._flushPending = false;\n this._internals.patchAndUpgradeTree(document);\n\n while (this._unflushedLocalNames.length > 0) {\n const localName = this._unflushedLocalNames.shift();\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && this._unflushedLocalNames.indexOf(localName) === -1) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['prepend'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.prepend.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['append'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.append.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['before'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.before.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['after'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.after.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['replaceWith'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n destination['remove'] = function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n } else {\n console.warn('Custom Elements: `Element#attachShadow` was not patched.');\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n /** @type {HTMLDivElement} */\n const rawDiv = Native.Document_createElement.call(document, 'div');\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n /** @type {!Node} */\n const content = this.localName === 'template' ? (/** @type {!HTMLTemplateElement} */ (this)).content : this;\n rawDiv.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n while (rawDiv.childNodes.length > 0) {\n Native.Node_appendChild.call(content, rawDiv.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} where\n * @param {!Element} element\n * @return {?Element}\n */\n function(where, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, where, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n"]} \ No newline at end of file +{"version":3,"sources":["src/AlreadyConstructedMarker.js","src/Utilities.js","src/CustomElementInternals.js","src/CustomElementState.js","src/DocumentConstructionObserver.js","src/Deferred.js","src/CustomElementRegistry.js","src/Patch/Native.js","src/Patch/HTMLElement.js","src/custom-elements.js","src/Patch/Interface/ParentNode.js","src/Patch/Document.js","src/Patch/Node.js","src/Patch/Interface/ChildNode.js","src/Patch/Element.js"],"names":["$jscompDefaultExport","AlreadyConstructedMarker","reservedTagList","Set","isValidCustomElementName$$module$$src$Utilities","isValidCustomElementName","localName","reserved","has","validForm","test","isConnected$$module$$src$Utilities","isConnected","node","nativeValue","undefined","current","__CE_isImportDocument","Document","parentNode","window","ShadowRoot","host","nextSiblingOrAncestorSibling$$module$$src$Utilities","nextSiblingOrAncestorSibling","root","start","nextSibling","walkDeepDescendantElements$$module$$src$Utilities","walkDeepDescendantElements","callback","visitedImports","nodeType","Node","ELEMENT_NODE","element","getAttribute","importNode","import","add","child","firstChild","shadowRoot","__CE_shadowRoot","setPropertyUnchecked$$module$$src$Utilities","setPropertyUnchecked","destination","name","value","constructor","CustomElementInternals","_localNameToDefinition","Map","_constructorToDefinition","_patches","_hasPatches","setDefinition","definition","set","addPatch","listener","push","patchTree","patch","__CE_patched","i","length","connectTree","elements","custom","__CE_state","connectedCallback","upgradeElement","disconnectTree","disconnectedCallback","patchAndUpgradeTree","gatherElements","readyState","__CE_hasRegistry","addEventListener","__CE_documentLoadHandled","delete","localNameToDefinition","get","constructionStack","result","Error","pop","e","failed","__CE_definition","attributeChangedCallback","observedAttributes","call","oldValue","newValue","namespace","indexOf","DocumentConstructionObserver","internals","doc","_internals","_document","_observer","MutationObserver","_handleMutations","bind","observe","childList","subtree","disconnect","mutations","addedNodes","j","Deferred","_resolve","_value","_promise","Promise","resolve","CustomElementRegistry","_elementDefinitionIsRunning","_whenDefinedDeferred","_flushCallback","this._flushCallback","fn","_flushPending","_unflushedLocalNames","_documentConstructionObserver","document","define","Function","TypeError","SyntaxError","adoptedCallback","getCallback","callbackValue","prototype","Object","_flush","shift","deferred","whenDefined","reject","prior","polyfillWrapFlushCallback","outer","inner","flush","Document_createElement","createElement","Document_createElementNS","createElementNS","Document_importNode","Document_prepend","Document_append","Node_cloneNode","cloneNode","Node_appendChild","appendChild","Node_insertBefore","insertBefore","Node_removeChild","removeChild","Node_replaceChild","replaceChild","Node_textContent","getOwnPropertyDescriptor","Element_attachShadow","Element","Element_innerHTML","Element_getAttribute","Element_setAttribute","setAttribute","Element_removeAttribute","removeAttribute","Element_getAttributeNS","getAttributeNS","Element_setAttributeNS","setAttributeNS","Element_removeAttributeNS","removeAttributeNS","Element_insertAdjacentElement","Element_prepend","Element_append","Element_before","Element_after","Element_replaceWith","Element_remove","HTMLElement","HTMLElement_innerHTML","HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$HTMLElement","$jscompDefaultExport$$module$$src$Patch$Native.Document_createElement.call","setPrototypeOf","lastIndex","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement","$jscompDefaultExport$$module$$src$Patch$Interface$ParentNode","builtIn","connectedBefore","nodes","filter","prepend","apply","append","$jscompDefaultExport$$module$$src$Patch$Document","deep","clone","$jscompDefaultExport$$module$$src$Patch$Native.Document_importNode.call","NS_HTML","$jscompDefaultExport$$module$$src$Patch$Native.Document_createElementNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Document_prepend","$jscompDefaultExport$$module$$src$Patch$Native.Document_append","$jscompDefaultExport$$module$$src$Patch$Node","patch_textContent","baseDescriptor","defineProperty","enumerable","configurable","assignedValue","TEXT_NODE","removedNodes","childNodes","childNodesLength","Array","refNode","DocumentFragment","insertedNodes","slice","nativeResult","$jscompDefaultExport$$module$$src$Patch$Native.Node_insertBefore.call","nodeWasConnected","$jscompDefaultExport$$module$$src$Patch$Native.Node_appendChild.call","$jscompDefaultExport$$module$$src$Patch$Native.Node_cloneNode.call","ownerDocument","$jscompDefaultExport$$module$$src$Patch$Native.Node_removeChild.call","nodeToInsert","nodeToRemove","$jscompDefaultExport$$module$$src$Patch$Native.Node_replaceChild.call","nodeToInsertWasConnected","thisIsConnected","$jscompDefaultExport$$module$$src$Patch$Native.Node_textContent","$jscompDefaultExport$$module$$src$Patch$Native.Node_textContent.get","parts","textContent","join","createTextNode","$jscompDefaultExport$$module$$src$Patch$Interface$ChildNode","$jscompDefaultExport$$module$$src$Patch$Native.Element_before","$jscompDefaultExport$$module$$src$Patch$Native.Element_after","wasConnected","$jscompDefaultExport$$module$$src$Patch$Native.Element_replaceWith","$jscompDefaultExport$$module$$src$Patch$Native.Element_remove","$jscompDefaultExport$$module$$src$Patch$Element","patch_innerHTML","htmlString","removedElements","patch_insertAdjacentElement","baseMethod","where","insertedElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_attachShadow","init","$jscompDefaultExport$$module$$src$Patch$Native.Element_attachShadow.call","console","warn","$jscompDefaultExport$$module$$src$Patch$Native.Element_innerHTML","$jscompDefaultExport$$module$$src$Patch$Native.Element_innerHTML.get","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_innerHTML","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_innerHTML.get","rawDiv","innerHTML","content","$jscompDefaultExport$$module$$src$Patch$Native.Element_setAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_getAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_setAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_getAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_removeAttribute.call","$jscompDefaultExport$$module$$src$Patch$Native.Element_removeAttributeNS.call","$jscompDefaultExport$$module$$src$Patch$Native.HTMLElement_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_insertAdjacentElement","$jscompDefaultExport$$module$$src$Patch$Native.Element_prepend","$jscompDefaultExport$$module$$src$Patch$Native.Element_append","priorCustomElements","customElements"],"mappings":"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","file":"custom-elements.min.js","sourcesContent":["/**\n * This class exists only to work around Closure's lack of a way to describe\n * singletons. It represents the 'already constructed marker' used in custom\n * element construction stacks.\n *\n * https://html.spec.whatwg.org/#concept-already-constructed-marker\n */\nclass AlreadyConstructedMarker {}\n\nexport default new AlreadyConstructedMarker();\n","const reservedTagList = new Set([\n 'annotation-xml',\n 'color-profile',\n 'font-face',\n 'font-face-src',\n 'font-face-uri',\n 'font-face-format',\n 'font-face-name',\n 'missing-glyph',\n]);\n\n/**\n * @param {string} localName\n * @returns {boolean}\n */\nexport function isValidCustomElementName(localName) {\n const reserved = reservedTagList.has(localName);\n const validForm = /^[a-z][.0-9_a-z]*-[\\-.0-9_a-z]*$/.test(localName);\n return !reserved && validForm;\n}\n\n/**\n * @private\n * @param {!Node} node\n * @return {boolean}\n */\nexport function isConnected(node) {\n // Use `Node#isConnected`, if defined.\n const nativeValue = node.isConnected;\n if (nativeValue !== undefined) {\n return nativeValue;\n }\n\n /** @type {?Node|undefined} */\n let current = node;\n while (current && !(current.__CE_isImportDocument || current instanceof Document)) {\n current = current.parentNode || (window.ShadowRoot && current instanceof ShadowRoot ? current.host : undefined);\n }\n return !!(current && (current.__CE_isImportDocument || current instanceof Document));\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextSiblingOrAncestorSibling(root, start) {\n let node = start;\n while (node && node !== root && !node.nextSibling) {\n node = node.parentNode;\n }\n return (!node || node === root) ? null : node.nextSibling;\n}\n\n/**\n * @param {!Node} root\n * @param {!Node} start\n * @return {?Node}\n */\nfunction nextNode(root, start) {\n return start.firstChild ? start.firstChild : nextSiblingOrAncestorSibling(root, start);\n}\n\n/**\n * @param {!Node} root\n * @param {!function(!Element)} callback\n * @param {!Set=} visitedImports\n */\nexport function walkDeepDescendantElements(root, callback, visitedImports = new Set()) {\n let node = root;\n while (node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = /** @type {!Element} */(node);\n\n callback(element);\n\n const localName = element.localName;\n if (localName === 'link' && element.getAttribute('rel') === 'import') {\n // If this import (polyfilled or not) has it's root node available,\n // walk it.\n const importNode = /** @type {!Node} */ (element.import);\n if (importNode instanceof Node && !visitedImports.has(importNode)) {\n // Prevent multiple walks of the same import root.\n visitedImports.add(importNode);\n\n for (let child = importNode.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n\n // Ignore descendants of import links to prevent attempting to walk the\n // elements created by the HTML Imports polyfill that we just walked\n // above.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n } else if (localName === 'template') {\n // Ignore descendants of templates. There shouldn't be any descendants\n // because they will be moved into `.content` during construction in\n // browsers that support template but, in case they exist and are still\n // waiting to be moved by a polyfill, they will be ignored.\n node = nextSiblingOrAncestorSibling(root, element);\n continue;\n }\n\n // Walk shadow roots.\n const shadowRoot = element.__CE_shadowRoot;\n if (shadowRoot) {\n for (let child = shadowRoot.firstChild; child; child = child.nextSibling) {\n walkDeepDescendantElements(child, callback, visitedImports);\n }\n }\n }\n\n node = nextNode(root, node);\n }\n}\n\n/**\n * Used to suppress Closure's \"Modifying the prototype is only allowed if the\n * constructor is in the same scope\" warning without using\n * `@suppress {newCheckTypes, duplicate}` because `newCheckTypes` is too broad.\n *\n * @param {!Object} destination\n * @param {string} name\n * @param {*} value\n */\nexport function setPropertyUnchecked(destination, name, value) {\n destination[name] = value;\n}\n","import * as Utilities from './Utilities.js';\nimport CEState from './CustomElementState.js';\n\nexport default class CustomElementInternals {\n constructor() {\n /** @type {!Map} */\n this._localNameToDefinition = new Map();\n\n /** @type {!Map} */\n this._constructorToDefinition = new Map();\n\n /** @type {!Array} */\n this._patches = [];\n\n /** @type {boolean} */\n this._hasPatches = false;\n }\n\n /**\n * @param {string} localName\n * @param {!CustomElementDefinition} definition\n */\n setDefinition(localName, definition) {\n this._localNameToDefinition.set(localName, definition);\n this._constructorToDefinition.set(definition.constructor, definition);\n }\n\n /**\n * @param {string} localName\n * @return {!CustomElementDefinition|undefined}\n */\n localNameToDefinition(localName) {\n return this._localNameToDefinition.get(localName);\n }\n\n /**\n * @param {!Function} constructor\n * @return {!CustomElementDefinition|undefined}\n */\n constructorToDefinition(constructor) {\n return this._constructorToDefinition.get(constructor);\n }\n\n /**\n * @param {!function(!Node)} listener\n */\n addPatch(listener) {\n this._hasPatches = true;\n this._patches.push(listener);\n }\n\n /**\n * @param {!Node} node\n */\n patchTree(node) {\n if (!this._hasPatches) return;\n\n Utilities.walkDeepDescendantElements(node, element => this.patch(element));\n }\n\n /**\n * @param {!Node} node\n */\n patch(node) {\n if (!this._hasPatches) return;\n\n if (node.__CE_patched) return;\n node.__CE_patched = true;\n\n for (let i = 0; i < this._patches.length; i++) {\n this._patches[i](node);\n }\n }\n\n /**\n * @param {!Node} root\n */\n connectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.connectedCallback(element);\n } else {\n this.upgradeElement(element);\n }\n }\n }\n\n /**\n * @param {!Node} root\n */\n disconnectTree(root) {\n const elements = [];\n\n Utilities.walkDeepDescendantElements(root, element => elements.push(element));\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element.__CE_state === CEState.custom) {\n this.disconnectedCallback(element);\n }\n }\n }\n\n /**\n * Upgrades all uncustomized custom elements at and below a root node for\n * which there is a definition. When custom element reaction callbacks are\n * assumed to be called synchronously (which, by the current DOM / HTML spec\n * definitions, they are *not*), callbacks for both elements customized\n * synchronously by the parser and elements being upgraded occur in the same\n * relative order.\n *\n * NOTE: This function, when used to simulate the construction of a tree that\n * is already created but not customized (i.e. by the parser), does *not*\n * prevent the element from reading the 'final' (true) state of the tree. For\n * example, the element, during truly synchronous parsing / construction would\n * see that it contains no children as they have not yet been inserted.\n * However, this function does not modify the tree, the element will\n * (incorrectly) have children. Additionally, self-modification restrictions\n * for custom element constructors imposed by the DOM spec are *not* enforced.\n *\n *\n * The following nested list shows the steps extending down from the HTML\n * spec's parsing section that cause elements to be synchronously created and\n * upgraded:\n *\n * The \"in body\" insertion mode:\n * https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n * - Switch on token:\n * .. other cases ..\n * -> Any other start tag\n * - [Insert an HTML element](below) for the token.\n *\n * Insert an HTML element:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element\n * - Insert a foreign element for the token in the HTML namespace:\n * https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element\n * - Create an element for a token:\n * https://html.spec.whatwg.org/multipage/syntax.html#create-an-element-for-the-token\n * - Will execute script flag is true?\n * - (Element queue pushed to the custom element reactions stack.)\n * - Create an element:\n * https://dom.spec.whatwg.org/#concept-create-element\n * - Sync CE flag is true?\n * - Constructor called.\n * - Self-modification restrictions enforced.\n * - Sync CE flag is false?\n * - (Upgrade reaction enqueued.)\n * - Attributes appended to element.\n * (`attributeChangedCallback` reactions enqueued.)\n * - Will execute script flag is true?\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n * - (Element queue pushed to the custom element reactions stack.)\n * - Insert the element:\n * https://dom.spec.whatwg.org/#concept-node-insert\n * - Shadow-including descendants are connected. During parsing\n * construction, there are no shadow-*excluding* descendants.\n * However, the constructor may have validly attached a shadow\n * tree to itself and added descendants to that shadow tree.\n * (`connectedCallback` reactions enqueued.)\n * - (Element queue popped from the custom element reactions stack.\n * Reactions in the popped stack are invoked.)\n *\n * @param {!Node} root\n * @param {!Set=} visitedImports\n */\n patchAndUpgradeTree(root, visitedImports = new Set()) {\n const elements = [];\n\n const gatherElements = element => {\n if (element.localName === 'link' && element.getAttribute('rel') === 'import') {\n // The HTML Imports polyfill sets a descendant element of the link to\n // the `import` property, specifically this is *not* a Document.\n const importNode = /** @type {?Node} */ (element.import);\n\n if (importNode instanceof Node && importNode.readyState === 'complete') {\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n } else {\n // If this link's import root is not available, its contents can't be\n // walked. Wait for 'load' and walk it when it's ready.\n element.addEventListener('load', () => {\n const importNode = /** @type {!Node} */ (element.import);\n\n if (importNode.__CE_documentLoadHandled) return;\n importNode.__CE_documentLoadHandled = true;\n\n importNode.__CE_isImportDocument = true;\n\n // Connected links are associated with the registry.\n importNode.__CE_hasRegistry = true;\n\n // Clone the `visitedImports` set that was populated sync during\n // the `patchAndUpgradeTree` call that caused this 'load' handler to\n // be added. Then, remove *this* link's import node so that we can\n // walk that import again, even if it was partially walked later\n // during the same `patchAndUpgradeTree` call.\n const clonedVisitedImports = new Set(visitedImports);\n visitedImports.delete(importNode);\n\n this.patchAndUpgradeTree(importNode, visitedImports);\n });\n }\n } else {\n elements.push(element);\n }\n };\n\n // `walkDeepDescendantElements` populates (and internally checks against)\n // `visitedImports` when traversing a loaded import.\n Utilities.walkDeepDescendantElements(root, gatherElements, visitedImports);\n\n if (this._hasPatches) {\n for (let i = 0; i < elements.length; i++) {\n this.patch(elements[i]);\n }\n }\n\n for (let i = 0; i < elements.length; i++) {\n this.upgradeElement(elements[i]);\n }\n }\n\n /**\n * @param {!Element} element\n */\n upgradeElement(element) {\n const currentState = element.__CE_state;\n if (currentState !== undefined) return;\n\n const definition = this.localNameToDefinition(element.localName);\n if (!definition) return;\n\n definition.constructionStack.push(element);\n\n const constructor = definition.constructor;\n try {\n try {\n let result = new (constructor)();\n if (result !== element) {\n throw new Error('The custom element constructor did not produce the element being upgraded.');\n }\n } finally {\n definition.constructionStack.pop();\n }\n } catch (e) {\n element.__CE_state = CEState.failed;\n throw e;\n }\n\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n\n if (definition.attributeChangedCallback) {\n const observedAttributes = definition.observedAttributes;\n for (let i = 0; i < observedAttributes.length; i++) {\n const name = observedAttributes[i];\n const value = element.getAttribute(name);\n if (value !== null) {\n this.attributeChangedCallback(element, name, null, value, null);\n }\n }\n }\n\n if (Utilities.isConnected(element)) {\n this.connectedCallback(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n connectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.connectedCallback) {\n definition.connectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n */\n disconnectedCallback(element) {\n const definition = element.__CE_definition;\n if (definition.disconnectedCallback) {\n definition.disconnectedCallback.call(element);\n }\n }\n\n /**\n * @param {!Element} element\n * @param {string} name\n * @param {?string} oldValue\n * @param {?string} newValue\n * @param {?string} namespace\n */\n attributeChangedCallback(element, name, oldValue, newValue, namespace) {\n const definition = element.__CE_definition;\n if (\n definition.attributeChangedCallback &&\n definition.observedAttributes.indexOf(name) > -1\n ) {\n definition.attributeChangedCallback.call(element, name, oldValue, newValue, namespace);\n }\n }\n}\n","/**\n * @enum {number}\n */\nconst CustomElementState = {\n custom: 1,\n failed: 2,\n};\n\nexport default CustomElementState;\n","import CustomElementInternals from './CustomElementInternals.js';\n\nexport default class DocumentConstructionObserver {\n constructor(internals, doc) {\n /**\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @type {!Document}\n */\n this._document = doc;\n\n /**\n * @type {MutationObserver|undefined}\n */\n this._observer = undefined;\n\n\n // Simulate tree construction for all currently accessible nodes in the\n // document.\n this._internals.patchAndUpgradeTree(this._document);\n\n if (this._document.readyState === 'loading') {\n this._observer = new MutationObserver(this._handleMutations.bind(this));\n\n // Nodes created by the parser are given to the observer *before* the next\n // task runs. Inline scripts are run in a new task. This means that the\n // observer will be able to handle the newly parsed nodes before the inline\n // script is run.\n this._observer.observe(this._document, {\n childList: true,\n subtree: true,\n });\n }\n }\n\n disconnect() {\n if (this._observer) {\n this._observer.disconnect();\n }\n }\n\n /**\n * @param {!Array} mutations\n */\n _handleMutations(mutations) {\n // Once the document's `readyState` is 'interactive' or 'complete', all new\n // nodes created within that document will be the result of script and\n // should be handled by patching.\n const readyState = this._document.readyState;\n if (readyState === 'interactive' || readyState === 'complete') {\n this.disconnect();\n }\n\n for (let i = 0; i < mutations.length; i++) {\n const addedNodes = mutations[i].addedNodes;\n for (let j = 0; j < addedNodes.length; j++) {\n const node = addedNodes[j];\n this._internals.patchAndUpgradeTree(node);\n }\n }\n }\n}\n","/**\n * @template T\n */\nexport default class Deferred {\n constructor() {\n /**\n * @private\n * @type {T|undefined}\n */\n this._value = undefined;\n\n /**\n * @private\n * @type {Function|undefined}\n */\n this._resolve = undefined;\n\n /**\n * @private\n * @type {!Promise}\n */\n this._promise = new Promise(resolve => {\n this._resolve = resolve;\n\n if (this._value) {\n resolve(this._value);\n }\n });\n }\n\n /**\n * @param {T} value\n */\n resolve(value) {\n if (this._value) {\n throw new Error('Already resolved.');\n }\n\n this._value = value;\n\n if (this._resolve) {\n this._resolve(value);\n }\n }\n\n /**\n * @return {!Promise}\n */\n toPromise() {\n return this._promise;\n }\n}\n","import CustomElementInternals from './CustomElementInternals.js';\nimport DocumentConstructionObserver from './DocumentConstructionObserver.js';\nimport Deferred from './Deferred.js';\nimport * as Utilities from './Utilities.js';\n\n/**\n * @unrestricted\n */\nexport default class CustomElementRegistry {\n\n /**\n * @param {!CustomElementInternals} internals\n */\n constructor(internals) {\n /**\n * @private\n * @type {boolean}\n */\n this._elementDefinitionIsRunning = false;\n\n /**\n * @private\n * @type {!CustomElementInternals}\n */\n this._internals = internals;\n\n /**\n * @private\n * @type {!Map>}\n */\n this._whenDefinedDeferred = new Map();\n\n /**\n * The default flush callback triggers the document walk synchronously.\n * @private\n * @type {!Function}\n */\n this._flushCallback = fn => fn();\n\n /**\n * @private\n * @type {boolean}\n */\n this._flushPending = false;\n\n /**\n * @private\n * @type {!Array}\n */\n this._unflushedLocalNames = [];\n\n /**\n * @private\n * @type {!DocumentConstructionObserver}\n */\n this._documentConstructionObserver = new DocumentConstructionObserver(internals, document);\n }\n\n /**\n * @param {string} localName\n * @param {!Function} constructor\n */\n define(localName, constructor) {\n if (!(constructor instanceof Function)) {\n throw new TypeError('Custom element constructors must be functions.');\n }\n\n if (!Utilities.isValidCustomElementName(localName)) {\n throw new SyntaxError(`The element name '${localName}' is not valid.`);\n }\n\n if (this._internals.localNameToDefinition(localName)) {\n throw new Error(`A custom element with name '${localName}' has already been defined.`);\n }\n\n if (this._elementDefinitionIsRunning) {\n throw new Error('A custom element is already being defined.');\n }\n this._elementDefinitionIsRunning = true;\n\n let connectedCallback;\n let disconnectedCallback;\n let adoptedCallback;\n let attributeChangedCallback;\n let observedAttributes;\n try {\n /** @type {!Object} */\n const prototype = constructor.prototype;\n if (!(prototype instanceof Object)) {\n throw new TypeError('The custom element constructor\\'s prototype is not an object.');\n }\n\n function getCallback(name) {\n const callbackValue = prototype[name];\n if (callbackValue !== undefined && !(callbackValue instanceof Function)) {\n throw new Error(`The '${name}' callback must be a function.`);\n }\n return callbackValue;\n }\n\n connectedCallback = getCallback('connectedCallback');\n disconnectedCallback = getCallback('disconnectedCallback');\n adoptedCallback = getCallback('adoptedCallback');\n attributeChangedCallback = getCallback('attributeChangedCallback');\n observedAttributes = constructor['observedAttributes'] || [];\n } catch (e) {\n return;\n } finally {\n this._elementDefinitionIsRunning = false;\n }\n\n const definition = {\n localName,\n constructor,\n connectedCallback,\n disconnectedCallback,\n adoptedCallback,\n attributeChangedCallback,\n observedAttributes,\n constructionStack: [],\n };\n\n this._internals.setDefinition(localName, definition);\n\n this._unflushedLocalNames.push(localName);\n\n // If we've already called the flush callback and it hasn't called back yet,\n // don't call it again.\n if (!this._flushPending) {\n this._flushPending = true;\n this._flushCallback(() => this._flush());\n }\n }\n\n _flush() {\n // If no new definitions were defined, don't attempt to flush. This could\n // happen if a flush callback keeps the function it is given and calls it\n // multiple times.\n if (this._flushPending === false) return;\n\n this._flushPending = false;\n this._internals.patchAndUpgradeTree(document);\n\n while (this._unflushedLocalNames.length > 0) {\n const localName = this._unflushedLocalNames.shift();\n const deferred = this._whenDefinedDeferred.get(localName);\n if (deferred) {\n deferred.resolve(undefined);\n }\n }\n }\n\n /**\n * @param {string} localName\n * @return {Function|undefined}\n */\n get(localName) {\n const definition = this._internals.localNameToDefinition(localName);\n if (definition) {\n return definition.constructor;\n }\n\n return undefined;\n }\n\n /**\n * @param {string} localName\n * @return {!Promise}\n */\n whenDefined(localName) {\n if (!Utilities.isValidCustomElementName(localName)) {\n return Promise.reject(new SyntaxError(`'${localName}' is not a valid custom element name.`));\n }\n\n const prior = this._whenDefinedDeferred.get(localName);\n if (prior) {\n return prior.toPromise();\n }\n\n const deferred = new Deferred();\n this._whenDefinedDeferred.set(localName, deferred);\n\n const definition = this._internals.localNameToDefinition(localName);\n // Resolve immediately only if the given local name has a definition *and*\n // the full document walk to upgrade elements with that local name has\n // already happened.\n if (definition && this._unflushedLocalNames.indexOf(localName) === -1) {\n deferred.resolve(undefined);\n }\n\n return deferred.toPromise();\n }\n\n polyfillWrapFlushCallback(outer) {\n this._documentConstructionObserver.disconnect();\n const inner = this._flushCallback;\n this._flushCallback = flush => outer(() => inner(flush));\n }\n}\n\n// Closure compiler exports.\nwindow['CustomElementRegistry'] = CustomElementRegistry;\nCustomElementRegistry.prototype['define'] = CustomElementRegistry.prototype.define;\nCustomElementRegistry.prototype['get'] = CustomElementRegistry.prototype.get;\nCustomElementRegistry.prototype['whenDefined'] = CustomElementRegistry.prototype.whenDefined;\nCustomElementRegistry.prototype['polyfillWrapFlushCallback'] = CustomElementRegistry.prototype.polyfillWrapFlushCallback;\n","export default {\n Document_createElement: window.Document.prototype.createElement,\n Document_createElementNS: window.Document.prototype.createElementNS,\n Document_importNode: window.Document.prototype.importNode,\n Document_prepend: window.Document.prototype['prepend'],\n Document_append: window.Document.prototype['append'],\n Node_cloneNode: window.Node.prototype.cloneNode,\n Node_appendChild: window.Node.prototype.appendChild,\n Node_insertBefore: window.Node.prototype.insertBefore,\n Node_removeChild: window.Node.prototype.removeChild,\n Node_replaceChild: window.Node.prototype.replaceChild,\n Node_textContent: Object.getOwnPropertyDescriptor(window.Node.prototype, 'textContent'),\n Element_attachShadow: window.Element.prototype['attachShadow'],\n Element_innerHTML: Object.getOwnPropertyDescriptor(window.Element.prototype, 'innerHTML'),\n Element_getAttribute: window.Element.prototype.getAttribute,\n Element_setAttribute: window.Element.prototype.setAttribute,\n Element_removeAttribute: window.Element.prototype.removeAttribute,\n Element_getAttributeNS: window.Element.prototype.getAttributeNS,\n Element_setAttributeNS: window.Element.prototype.setAttributeNS,\n Element_removeAttributeNS: window.Element.prototype.removeAttributeNS,\n Element_insertAdjacentElement: window.Element.prototype['insertAdjacentElement'],\n Element_prepend: window.Element.prototype['prepend'],\n Element_append: window.Element.prototype['append'],\n Element_before: window.Element.prototype['before'],\n Element_after: window.Element.prototype['after'],\n Element_replaceWith: window.Element.prototype['replaceWith'],\n Element_remove: window.Element.prototype['remove'],\n HTMLElement: window.HTMLElement,\n HTMLElement_innerHTML: Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, 'innerHTML'),\n HTMLElement_insertAdjacentElement: window.HTMLElement.prototype['insertAdjacentElement'],\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport AlreadyConstructedMarker from '../AlreadyConstructedMarker.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n window['HTMLElement'] = (function() {\n /**\n * @type {function(new: HTMLElement): !HTMLElement}\n */\n function HTMLElement() {\n // This should really be `new.target` but `new.target` can't be emulated\n // in ES5. Assuming the user keeps the default value of the constructor's\n // prototype's `constructor` property, this is equivalent.\n /** @type {!Function} */\n const constructor = this.constructor;\n\n const definition = internals.constructorToDefinition(constructor);\n if (!definition) {\n throw new Error('The custom element being constructed was not registered with `customElements`.');\n }\n\n const constructionStack = definition.constructionStack;\n\n if (constructionStack.length === 0) {\n const element = Native.Document_createElement.call(document, definition.localName);\n Object.setPrototypeOf(element, constructor.prototype);\n element.__CE_state = CEState.custom;\n element.__CE_definition = definition;\n internals.patch(element);\n return element;\n }\n\n const lastIndex = constructionStack.length - 1;\n const element = constructionStack[lastIndex];\n if (element === AlreadyConstructedMarker) {\n throw new Error('The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.');\n }\n constructionStack[lastIndex] = AlreadyConstructedMarker;\n\n Object.setPrototypeOf(element, constructor.prototype);\n internals.patch(/** @type {!HTMLElement} */ (element));\n\n return element;\n }\n\n HTMLElement.prototype = Native.HTMLElement.prototype;\n\n return HTMLElement;\n })();\n};\n","/**\n * @license\n * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nimport CustomElementInternals from './CustomElementInternals.js';\nimport CustomElementRegistry from './CustomElementRegistry.js';\n\nimport PatchHTMLElement from './Patch/HTMLElement.js';\nimport PatchDocument from './Patch/Document.js';\nimport PatchNode from './Patch/Node.js';\nimport PatchElement from './Patch/Element.js';\n\nconst priorCustomElements = window['customElements'];\n\nif (!priorCustomElements ||\n priorCustomElements['forcePolyfill'] ||\n (typeof priorCustomElements['define'] != 'function') ||\n (typeof priorCustomElements['get'] != 'function')) {\n /** @type {!CustomElementInternals} */\n const internals = new CustomElementInternals();\n\n PatchHTMLElement(internals);\n PatchDocument(internals);\n PatchNode(internals);\n PatchElement(internals);\n\n // The main document is always associated with the registry.\n document.__CE_hasRegistry = true;\n\n /** @type {!CustomElementRegistry} */\n const customElements = new CustomElementRegistry(internals);\n\n Object.defineProperty(window, 'customElements', {\n configurable: true,\n enumerable: true,\n value: customElements,\n });\n}\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * prepend: !function(...(!Node|string)),\n * append: !function(...(!Node|string)),\n * }}\n */\nlet ParentNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ParentNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['prepend'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.prepend.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['append'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.append.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n Utilities.setPropertyUnchecked(Document.prototype, 'createElement',\n /**\n * @this {Document}\n * @param {string} localName\n * @return {!Element}\n */\n function(localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElement.call(this, localName));\n internals.patch(result);\n return result;\n });\n\n Utilities.setPropertyUnchecked(Document.prototype, 'importNode',\n /**\n * @this {Document}\n * @param {!Node} node\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(node, deep) {\n const clone = Native.Document_importNode.call(this, node, deep);\n // Only create custom elements if this document is associated with the registry.\n if (!this.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n const NS_HTML = \"http://www.w3.org/1999/xhtml\";\n\n Utilities.setPropertyUnchecked(Document.prototype, 'createElementNS',\n /**\n * @this {Document}\n * @param {?string} namespace\n * @param {string} localName\n * @return {!Element}\n */\n function(namespace, localName) {\n // Only create custom elements if this document is associated with the registry.\n if (this.__CE_hasRegistry && (namespace === null || namespace === NS_HTML)) {\n const definition = internals.localNameToDefinition(localName);\n if (definition) {\n return new (definition.constructor)();\n }\n }\n\n const result = /** @type {!Element} */\n (Native.Document_createElementNS.call(this, namespace, localName));\n internals.patch(result);\n return result;\n });\n\n PatchParentNode(internals, Document.prototype, {\n prepend: Native.Document_prepend,\n append: Native.Document_append,\n });\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport * as Utilities from '../Utilities.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n // `Node#nodeValue` is implemented on `Attr`.\n // `Node#textContent` is implemented on `Attr`, `Element`.\n\n Utilities.setPropertyUnchecked(Node.prototype, 'insertBefore',\n /**\n * @this {Node}\n * @param {!Node} node\n * @param {?Node} refNode\n * @return {!Node}\n */\n function(node, refNode) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_insertBefore.call(this, node, refNode);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'appendChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n if (node instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(node.childNodes);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_appendChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n if (Utilities.isConnected(this)) {\n internals.connectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'cloneNode',\n /**\n * @this {Node}\n * @param {boolean=} deep\n * @return {!Node}\n */\n function(deep) {\n const clone = Native.Node_cloneNode.call(this, deep);\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(clone);\n } else {\n internals.patchAndUpgradeTree(clone);\n }\n return clone;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'removeChild',\n /**\n * @this {Node}\n * @param {!Node} node\n * @return {!Node}\n */\n function(node) {\n const nodeWasConnected = Utilities.isConnected(node);\n const nativeResult = Native.Node_removeChild.call(this, node);\n\n if (nodeWasConnected) {\n internals.disconnectTree(node);\n }\n\n return nativeResult;\n });\n\n Utilities.setPropertyUnchecked(Node.prototype, 'replaceChild',\n /**\n * @this {Node}\n * @param {!Node} nodeToInsert\n * @param {!Node} nodeToRemove\n * @return {!Node}\n */\n function(nodeToInsert, nodeToRemove) {\n if (nodeToInsert instanceof DocumentFragment) {\n const insertedNodes = Array.prototype.slice.apply(nodeToInsert.childNodes);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n\n // DocumentFragments can't be connected, so `disconnectTree` will never\n // need to be called on a DocumentFragment's children after inserting it.\n\n if (Utilities.isConnected(this)) {\n internals.disconnectTree(nodeToRemove);\n for (let i = 0; i < insertedNodes.length; i++) {\n internals.connectTree(insertedNodes[i]);\n }\n }\n\n return nativeResult;\n }\n\n const nodeToInsertWasConnected = Utilities.isConnected(nodeToInsert);\n const nativeResult = Native.Node_replaceChild.call(this, nodeToInsert, nodeToRemove);\n const thisIsConnected = Utilities.isConnected(this);\n\n if (thisIsConnected) {\n internals.disconnectTree(nodeToRemove);\n }\n\n if (nodeToInsertWasConnected) {\n internals.disconnectTree(nodeToInsert);\n }\n\n if (thisIsConnected) {\n internals.connectTree(nodeToInsert);\n }\n\n return nativeResult;\n });\n\n\n function patch_textContent(destination, baseDescriptor) {\n Object.defineProperty(destination, 'textContent', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Node} */ function(assignedValue) {\n // If this is a text node then there are no nodes to disconnect.\n if (this.nodeType === Node.TEXT_NODE) {\n baseDescriptor.set.call(this, assignedValue);\n return;\n }\n\n let removedNodes = undefined;\n // Checking for `firstChild` is faster than reading `childNodes.length`\n // to compare with 0.\n if (this.firstChild) {\n // Using `childNodes` is faster than `children`, even though we only\n // care about elements.\n const childNodes = this.childNodes;\n const childNodesLength = childNodes.length;\n if (childNodesLength > 0 && Utilities.isConnected(this)) {\n // Copying an array by iterating is faster than using slice.\n removedNodes = new Array(childNodesLength);\n for (let i = 0; i < childNodesLength; i++) {\n removedNodes[i] = childNodes[i];\n }\n }\n }\n\n baseDescriptor.set.call(this, assignedValue);\n\n if (removedNodes) {\n for (let i = 0; i < removedNodes.length; i++) {\n internals.disconnectTree(removedNodes[i]);\n }\n }\n },\n });\n }\n\n if (Native.Node_textContent && Native.Node_textContent.get) {\n patch_textContent(Node.prototype, Native.Node_textContent);\n } else {\n internals.addPatch(function(element) {\n patch_textContent(element, {\n enumerable: true,\n configurable: true,\n // NOTE: This implementation of the `textContent` getter assumes that\n // text nodes' `textContent` getter will not be patched.\n get: /** @this {Node} */ function() {\n /** @type {!Array} */\n const parts = [];\n\n for (let i = 0; i < this.childNodes.length; i++) {\n parts.push(this.childNodes[i].textContent);\n }\n\n return parts.join('');\n },\n set: /** @this {Node} */ function(assignedValue) {\n while (this.firstChild) {\n Native.Node_removeChild.call(this, this.firstChild);\n }\n Native.Node_appendChild.call(this, document.createTextNode(assignedValue));\n },\n });\n });\n }\n};\n","import CustomElementInternals from '../../CustomElementInternals.js';\nimport * as Utilities from '../../Utilities.js';\n\n/**\n * @typedef {{\n * before: !function(...(!Node|string)),\n * after: !function(...(!Node|string)),\n * replaceWith: !function(...(!Node|string)),\n * remove: !function(),\n * }}\n */\nlet ChildNodeNativeMethods;\n\n/**\n * @param {!CustomElementInternals} internals\n * @param {!Object} destination\n * @param {!ChildNodeNativeMethods} builtIn\n */\nexport default function(internals, destination, builtIn) {\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['before'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.before.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['after'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n builtIn.after.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (Utilities.isConnected(this)) {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n /**\n * @param {...(!Node|string)} nodes\n */\n destination['replaceWith'] = function(...nodes) {\n // TODO: Fix this for when one of `nodes` is a DocumentFragment!\n const connectedBefore = /** @type {!Array} */ (nodes.filter(node => {\n // DocumentFragments are not connected and will not be added to the list.\n return node instanceof Node && Utilities.isConnected(node);\n }));\n\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.replaceWith.apply(this, nodes);\n\n for (let i = 0; i < connectedBefore.length; i++) {\n internals.disconnectTree(connectedBefore[i]);\n }\n\n if (wasConnected) {\n internals.disconnectTree(this);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n if (node instanceof Element) {\n internals.connectTree(node);\n }\n }\n }\n };\n\n destination['remove'] = function() {\n const wasConnected = Utilities.isConnected(this);\n\n builtIn.remove.call(this);\n\n if (wasConnected) {\n internals.disconnectTree(this);\n }\n };\n};\n","import Native from './Native.js';\nimport CustomElementInternals from '../CustomElementInternals.js';\nimport CEState from '../CustomElementState.js';\nimport * as Utilities from '../Utilities.js';\n\nimport PatchParentNode from './Interface/ParentNode.js';\nimport PatchChildNode from './Interface/ChildNode.js';\n\n/**\n * @param {!CustomElementInternals} internals\n */\nexport default function(internals) {\n if (Native.Element_attachShadow) {\n Utilities.setPropertyUnchecked(Element.prototype, 'attachShadow',\n /**\n * @this {Element}\n * @param {!{mode: string}} init\n * @return {ShadowRoot}\n */\n function(init) {\n const shadowRoot = Native.Element_attachShadow.call(this, init);\n this.__CE_shadowRoot = shadowRoot;\n return shadowRoot;\n });\n } else {\n console.warn('Custom Elements: `Element#attachShadow` was not patched.');\n }\n\n\n function patch_innerHTML(destination, baseDescriptor) {\n Object.defineProperty(destination, 'innerHTML', {\n enumerable: baseDescriptor.enumerable,\n configurable: true,\n get: baseDescriptor.get,\n set: /** @this {Element} */ function(htmlString) {\n const isConnected = Utilities.isConnected(this);\n\n // NOTE: In IE11, when using the native `innerHTML` setter, all nodes\n // that were previously descendants of the context element have all of\n // their children removed as part of the set - the entire subtree is\n // 'disassembled'. This work around walks the subtree *before* using the\n // native setter.\n /** @type {!Array|undefined} */\n let removedElements = undefined;\n if (isConnected) {\n removedElements = [];\n Utilities.walkDeepDescendantElements(this, element => {\n if (element !== this) {\n removedElements.push(element);\n }\n });\n }\n\n baseDescriptor.set.call(this, htmlString);\n\n if (removedElements) {\n for (let i = 0; i < removedElements.length; i++) {\n const element = removedElements[i];\n if (element.__CE_state === CEState.custom) {\n internals.disconnectedCallback(element);\n }\n }\n }\n\n // Only create custom elements if this element's owner document is\n // associated with the registry.\n if (!this.ownerDocument.__CE_hasRegistry) {\n internals.patchTree(this);\n } else {\n internals.patchAndUpgradeTree(this);\n }\n return htmlString;\n },\n });\n }\n\n if (Native.Element_innerHTML && Native.Element_innerHTML.get) {\n patch_innerHTML(Element.prototype, Native.Element_innerHTML);\n } else if (Native.HTMLElement_innerHTML && Native.HTMLElement_innerHTML.get) {\n patch_innerHTML(HTMLElement.prototype, Native.HTMLElement_innerHTML);\n } else {\n\n /** @type {HTMLDivElement} */\n const rawDiv = Native.Document_createElement.call(document, 'div');\n\n internals.addPatch(function(element) {\n patch_innerHTML(element, {\n enumerable: true,\n configurable: true,\n // Implements getting `innerHTML` by performing an unpatched `cloneNode`\n // of the element and returning the resulting element's `innerHTML`.\n // TODO: Is this too expensive?\n get: /** @this {Element} */ function() {\n return Native.Node_cloneNode.call(this, true).innerHTML;\n },\n // Implements setting `innerHTML` by creating an unpatched element,\n // setting `innerHTML` of that element and replacing the target\n // element's children with those of the unpatched element.\n set: /** @this {Element} */ function(assignedValue) {\n // NOTE: re-route to `content` for `template` elements.\n // We need to do this because `template.appendChild` does not\n // route into `template.content`.\n /** @type {!Node} */\n const content = this.localName === 'template' ? (/** @type {!HTMLTemplateElement} */ (this)).content : this;\n rawDiv.innerHTML = assignedValue;\n\n while (content.childNodes.length > 0) {\n Native.Node_removeChild.call(content, content.childNodes[0]);\n }\n while (rawDiv.childNodes.length > 0) {\n Native.Node_appendChild.call(content, rawDiv.childNodes[0]);\n }\n },\n });\n });\n }\n\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttribute',\n /**\n * @this {Element}\n * @param {string} name\n * @param {string} newValue\n */\n function(name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttribute.call(this, name, newValue);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_setAttribute.call(this, name, newValue);\n newValue = Native.Element_getAttribute.call(this, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, null);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'setAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n * @param {string} newValue\n */\n function(namespace, name, newValue) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_setAttributeNS.call(this, namespace, name, newValue);\n newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttribute',\n /**\n * @this {Element}\n * @param {string} name\n */\n function(name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttribute.call(this, name);\n }\n\n const oldValue = Native.Element_getAttribute.call(this, name);\n Native.Element_removeAttribute.call(this, name);\n if (oldValue !== null) {\n internals.attributeChangedCallback(this, name, oldValue, null, null);\n }\n });\n\n Utilities.setPropertyUnchecked(Element.prototype, 'removeAttributeNS',\n /**\n * @this {Element}\n * @param {?string} namespace\n * @param {string} name\n */\n function(namespace, name) {\n // Fast path for non-custom elements.\n if (this.__CE_state !== CEState.custom) {\n return Native.Element_removeAttributeNS.call(this, namespace, name);\n }\n\n const oldValue = Native.Element_getAttributeNS.call(this, namespace, name);\n Native.Element_removeAttributeNS.call(this, namespace, name);\n // In older browsers, `Element#getAttributeNS` may return the empty string\n // instead of null if the attribute does not exist. For details, see;\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNS#Notes\n const newValue = Native.Element_getAttributeNS.call(this, namespace, name);\n if (oldValue !== newValue) {\n internals.attributeChangedCallback(this, name, oldValue, newValue, namespace);\n }\n });\n\n\n function patch_insertAdjacentElement(destination, baseMethod) {\n Utilities.setPropertyUnchecked(destination, 'insertAdjacentElement',\n /**\n * @this {Element}\n * @param {string} where\n * @param {!Element} element\n * @return {?Element}\n */\n function(where, element) {\n const wasConnected = Utilities.isConnected(element);\n const insertedElement = /** @type {!Element} */\n (baseMethod.call(this, where, element));\n\n if (wasConnected) {\n internals.disconnectTree(element);\n }\n\n if (Utilities.isConnected(insertedElement)) {\n internals.connectTree(element);\n }\n return insertedElement;\n });\n }\n\n if (Native.HTMLElement_insertAdjacentElement) {\n patch_insertAdjacentElement(HTMLElement.prototype, Native.HTMLElement_insertAdjacentElement);\n } else if (Native.Element_insertAdjacentElement) {\n patch_insertAdjacentElement(Element.prototype, Native.Element_insertAdjacentElement);\n } else {\n console.warn('Custom Elements: `Element#insertAdjacentElement` was not patched.');\n }\n\n\n PatchParentNode(internals, Element.prototype, {\n prepend: Native.Element_prepend,\n append: Native.Element_append,\n });\n\n PatchChildNode(internals, Element.prototype, {\n before: Native.Element_before,\n after: Native.Element_after,\n replaceWith: Native.Element_replaceWith,\n remove: Native.Element_remove,\n });\n};\n"]} \ No newline at end of file diff --git a/tests/html/Element/setAttributeNS.html b/tests/html/Element/setAttributeNS.html index 8a26347..ddb79d5 100644 --- a/tests/html/Element/setAttributeNS.html +++ b/tests/html/Element/setAttributeNS.html @@ -86,7 +86,7 @@ defineWithLocalName(localName, ['attr']); }); - test('Setting an observed attribute to its current value does not trigger a callback.', function() { + test('Setting an observed attribute to its current value triggers a callback.', function() { const element = document.createElement(localName); assert.equal(element.attrCallbackArgs.length, 0); @@ -98,7 +98,8 @@ element.setAttributeNS('ns', 'attr', 'abc'); - assert.equal(element.attrCallbackArgs.length, 1); + assert.equal(element.attrCallbackArgs.length, 2); + assert.deepEqual(element.attrCallbackArgs[0], ['attr', NON_EXISTANT_VALUE, 'abc', 'ns']); }); test('Setting an observed attribute to a different value triggers a callback.', function() {