diff options
Diffstat (limited to 'chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js')
-rw-r--r-- | chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js new file mode 100644 index 00000000000..512e01c9733 --- /dev/null +++ b/chromium/third_party/catapult/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js @@ -0,0 +1,127 @@ +/** +@license +Copyright (c) 2017 The Polymer Project Authors. All rights reserved. +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt +Code distributed by Google as part of the polymer project is also +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ +import '../utils/boot.js'; + +import { PropertyEffects } from '../mixins/property-effects.js'; +import { OptionalMutableData } from '../mixins/mutable-data.js'; +import { GestureEventListeners } from '../mixins/gesture-event-listeners.js'; + +/** + * @constructor + * @extends {HTMLElement} + * @implements {Polymer_PropertyEffects} + * @implements {Polymer_OptionalMutableData} + * @implements {Polymer_GestureEventListeners} + */ +const domBindBase = + GestureEventListeners( + OptionalMutableData( + PropertyEffects(HTMLElement))); + +/** + * Custom element to allow using Polymer's template features (data binding, + * declarative event listeners, etc.) in the main document without defining + * a new custom element. + * + * `<template>` tags utilizing bindings may be wrapped with the `<dom-bind>` + * element, which will immediately stamp the wrapped template into the main + * document and bind elements to the `dom-bind` element itself as the + * binding scope. + * + * @polymer + * @customElement + * @appliesMixin PropertyEffects + * @appliesMixin OptionalMutableData + * @appliesMixin GestureEventListeners + * @extends {domBindBase} + * @summary Custom element to allow using Polymer's template features (data + * binding, declarative event listeners, etc.) in the main document. + */ +export class DomBind extends domBindBase { + + static get observedAttributes() { return ['mutable-data']; } + + constructor() { + super(); + this.root = null; + this.$ = null; + this.__children = null; + } + + /** @return {void} */ + attributeChangedCallback() { + // assumes only one observed attribute + this.mutableData = true; + } + + /** @return {void} */ + connectedCallback() { + this.style.display = 'none'; + this.render(); + } + + /** @return {void} */ + disconnectedCallback() { + this.__removeChildren(); + } + + __insertChildren() { + this.parentNode.insertBefore(this.root, this); + } + + __removeChildren() { + if (this.__children) { + for (let i=0; i<this.__children.length; i++) { + this.root.appendChild(this.__children[i]); + } + } + } + + /** + * Forces the element to render its content. This is typically only + * necessary to call if HTMLImports with the async attribute are used. + * @return {void} + */ + render() { + let template; + if (!this.__children) { + template = /** @type {HTMLTemplateElement} */(template || this.querySelector('template')); + if (!template) { + // Wait until childList changes and template should be there by then + let observer = new MutationObserver(() => { + template = /** @type {HTMLTemplateElement} */(this.querySelector('template')); + if (template) { + observer.disconnect(); + this.render(); + } else { + throw new Error('dom-bind requires a <template> child'); + } + }); + observer.observe(this, {childList: true}); + return; + } + this.root = this._stampTemplate(template); + this.$ = this.root.$; + this.__children = []; + for (let n=this.root.firstChild; n; n=n.nextSibling) { + this.__children[this.__children.length] = n; + } + this._enableProperties(); + } + this.__insertChildren(); + this.dispatchEvent(new CustomEvent('dom-change', { + bubbles: true, + composed: true + })); + } + +} + +customElements.define('dom-bind', DomBind); |