/*! ISC License Copyright (c) 2014-2018, Andrea Giammarchi, @WebReflection Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ (function(window, polyfill){'use strict'; // DO NOT USE THIS FILE DIRECTLY, IT WON'T WORK // THIS IS A PROJECT BASED ON A BUILD SYSTEM // THIS FILE IS JUST WRAPPED UP RESULTING IN // build/document-register-element.js // and its .max.js counter part var document = window.document, Object = window.Object ; var htmlClass = (function (info) { // (C) Andrea Giammarchi - @WebReflection - MIT Style var catchClass = /^[A-Z]+[a-z]/, filterBy = function (re) { var arr = [], tag; for (tag in register) { if (re.test(tag)) arr.push(tag); } return arr; }, add = function (Class, tag) { tag = tag.toLowerCase(); if (!(tag in register)) { register[Class] = (register[Class] || []).concat(tag); register[tag] = (register[tag.toUpperCase()] = Class); } }, register = (Object.create || Object)(null), htmlClass = {}, i, section, tags, Class ; for (section in info) { for (Class in info[section]) { tags = info[section][Class]; register[Class] = tags; for (i = 0; i < tags.length; i++) { register[tags[i].toLowerCase()] = register[tags[i].toUpperCase()] = Class; } } } htmlClass.get = function get(tagOrClass) { return typeof tagOrClass === 'string' ? (register[tagOrClass] || (catchClass.test(tagOrClass) ? [] : '')) : filterBy(tagOrClass); }; htmlClass.set = function set(tag, Class) { return (catchClass.test(tag) ? add(tag, Class) : add(Class, tag) ), htmlClass; }; return htmlClass; }({ "collections": { "HTMLAllCollection": [ "all" ], "HTMLCollection": [ "forms" ], "HTMLFormControlsCollection": [ "elements" ], "HTMLOptionsCollection": [ "options" ] }, "elements": { "Element": [ "element" ], "HTMLAnchorElement": [ "a" ], "HTMLAppletElement": [ "applet" ], "HTMLAreaElement": [ "area" ], "HTMLAttachmentElement": [ "attachment" ], "HTMLAudioElement": [ "audio" ], "HTMLBRElement": [ "br" ], "HTMLBaseElement": [ "base" ], "HTMLBodyElement": [ "body" ], "HTMLButtonElement": [ "button" ], "HTMLCanvasElement": [ "canvas" ], "HTMLContentElement": [ "content" ], "HTMLDListElement": [ "dl" ], "HTMLDataElement": [ "data" ], "HTMLDataListElement": [ "datalist" ], "HTMLDetailsElement": [ "details" ], "HTMLDialogElement": [ "dialog" ], "HTMLDirectoryElement": [ "dir" ], "HTMLDivElement": [ "div" ], "HTMLDocument": [ "document" ], "HTMLElement": [ "element", "abbr", "address", "article", "aside", "b", "bdi", "bdo", "cite", "code", "command", "dd", "dfn", "dt", "em", "figcaption", "figure", "footer", "header", "i", "kbd", "mark", "nav", "noscript", "rp", "rt", "ruby", "s", "samp", "section", "small", "strong", "sub", "summary", "sup", "u", "var", "wbr" ], "HTMLEmbedElement": [ "embed" ], "HTMLFieldSetElement": [ "fieldset" ], "HTMLFontElement": [ "font" ], "HTMLFormElement": [ "form" ], "HTMLFrameElement": [ "frame" ], "HTMLFrameSetElement": [ "frameset" ], "HTMLHRElement": [ "hr" ], "HTMLHeadElement": [ "head" ], "HTMLHeadingElement": [ "h1", "h2", "h3", "h4", "h5", "h6" ], "HTMLHtmlElement": [ "html" ], "HTMLIFrameElement": [ "iframe" ], "HTMLImageElement": [ "img" ], "HTMLInputElement": [ "input" ], "HTMLKeygenElement": [ "keygen" ], "HTMLLIElement": [ "li" ], "HTMLLabelElement": [ "label" ], "HTMLLegendElement": [ "legend" ], "HTMLLinkElement": [ "link" ], "HTMLMapElement": [ "map" ], "HTMLMarqueeElement": [ "marquee" ], "HTMLMediaElement": [ "media" ], "HTMLMenuElement": [ "menu" ], "HTMLMenuItemElement": [ "menuitem" ], "HTMLMetaElement": [ "meta" ], "HTMLMeterElement": [ "meter" ], "HTMLModElement": [ "del", "ins" ], "HTMLOListElement": [ "ol" ], "HTMLObjectElement": [ "object" ], "HTMLOptGroupElement": [ "optgroup" ], "HTMLOptionElement": [ "option" ], "HTMLOutputElement": [ "output" ], "HTMLParagraphElement": [ "p" ], "HTMLParamElement": [ "param" ], "HTMLPictureElement": [ "picture" ], "HTMLPreElement": [ "pre" ], "HTMLProgressElement": [ "progress" ], "HTMLQuoteElement": [ "blockquote", "q", "quote" ], "HTMLScriptElement": [ "script" ], "HTMLSelectElement": [ "select" ], "HTMLShadowElement": [ "shadow" ], "HTMLSlotElement": [ "slot" ], "HTMLSourceElement": [ "source" ], "HTMLSpanElement": [ "span" ], "HTMLStyleElement": [ "style" ], "HTMLTableCaptionElement": [ "caption" ], "HTMLTableCellElement": [ "td", "th" ], "HTMLTableColElement": [ "col", "colgroup" ], "HTMLTableElement": [ "table" ], "HTMLTableRowElement": [ "tr" ], "HTMLTableSectionElement": [ "thead", "tbody", "tfoot" ], "HTMLTemplateElement": [ "template" ], "HTMLTextAreaElement": [ "textarea" ], "HTMLTimeElement": [ "time" ], "HTMLTitleElement": [ "title" ], "HTMLTrackElement": [ "track" ], "HTMLUListElement": [ "ul" ], "HTMLUnknownElement": [ "unknown", "vhgroupv", "vkeygen" ], "HTMLVideoElement": [ "video" ] }, "nodes": { "Attr": [ "node" ], "Audio": [ "audio" ], "CDATASection": [ "node" ], "CharacterData": [ "node" ], "Comment": [ "#comment" ], "Document": [ "#document" ], "DocumentFragment": [ "#document-fragment" ], "DocumentType": [ "node" ], "HTMLDocument": [ "#document" ], "Image": [ "img" ], "Option": [ "option" ], "ProcessingInstruction": [ "node" ], "ShadowRoot": [ "#shadow-root" ], "Text": [ "#text" ], "XMLDocument": [ "xml" ] } })); // passed at runtime, configurable via nodejs module if (typeof polyfill !== 'object') polyfill = {type: polyfill || 'auto'}; var // V0 polyfill entry REGISTER_ELEMENT = 'registerElement', // IE < 11 only + old WebKit for attributes + feature detection EXPANDO_UID = '__' + REGISTER_ELEMENT + (window.Math.random() * 10e4 >> 0), // shortcuts and costants ADD_EVENT_LISTENER = 'addEventListener', ATTACHED = 'attached', CALLBACK = 'Callback', DETACHED = 'detached', EXTENDS = 'extends', ATTRIBUTE_CHANGED_CALLBACK = 'attributeChanged' + CALLBACK, ATTACHED_CALLBACK = ATTACHED + CALLBACK, CONNECTED_CALLBACK = 'connected' + CALLBACK, DISCONNECTED_CALLBACK = 'disconnected' + CALLBACK, CREATED_CALLBACK = 'created' + CALLBACK, DETACHED_CALLBACK = DETACHED + CALLBACK, ADDITION = 'ADDITION', MODIFICATION = 'MODIFICATION', REMOVAL = 'REMOVAL', DOM_ATTR_MODIFIED = 'DOMAttrModified', DOM_CONTENT_LOADED = 'DOMContentLoaded', DOM_SUBTREE_MODIFIED = 'DOMSubtreeModified', PREFIX_TAG = '<', PREFIX_IS = '=', // valid and invalid node names validName = /^[A-Z][._A-Z0-9]*-[-._A-Z0-9]*$/, invalidNames = [ 'ANNOTATION-XML', 'COLOR-PROFILE', 'FONT-FACE', 'FONT-FACE-SRC', 'FONT-FACE-URI', 'FONT-FACE-FORMAT', 'FONT-FACE-NAME', 'MISSING-GLYPH' ], // registered types and their prototypes types = [], protos = [], // to query subnodes query = '', // html shortcut used to feature detect documentElement = document.documentElement, // ES5 inline helpers || basic patches indexOf = types.indexOf || function (v) { for(var i = this.length; i-- && this[i] !== v;){} return i; }, // other helpers / shortcuts OP = Object.prototype, hOP = OP.hasOwnProperty, iPO = OP.isPrototypeOf, defineProperty = Object.defineProperty, empty = [], gOPD = Object.getOwnPropertyDescriptor, gOPN = Object.getOwnPropertyNames, gPO = Object.getPrototypeOf, sPO = Object.setPrototypeOf, // jshint proto: true hasProto = !!Object.__proto__, // V1 helpers fixGetClass = false, DRECEV1 = '__dreCEv1', customElements = window.customElements, usableCustomElements = !/^force/.test(polyfill.type) && !!( customElements && customElements.define && customElements.get && customElements.whenDefined ), Dict = Object.create || Object, Map = window.Map || function Map() { var K = [], V = [], i; return { get: function (k) { return V[indexOf.call(K, k)]; }, set: function (k, v) { i = indexOf.call(K, k); if (i < 0) V[K.push(k) - 1] = v; else V[i] = v; } }; }, Promise = window.Promise || function (fn) { var notify = [], done = false, p = { 'catch': function () { return p; }, 'then': function (cb) { notify.push(cb); if (done) setTimeout(resolve, 1); return p; } } ; function resolve(value) { done = true; while (notify.length) notify.shift()(value); } fn(resolve); return p; }, justCreated = false, constructors = Dict(null), waitingList = Dict(null), nodeNames = new Map(), secondArgument = function (is) { return is.toLowerCase(); }, // used to create unique instances create = Object.create || function Bridge(proto) { // silly broken polyfill probably ever used but short enough to work return proto ? ((Bridge.prototype = proto), new Bridge()) : this; }, // will set the prototype if possible // or copy over all properties setPrototype = sPO || ( hasProto ? function (o, p) { o.__proto__ = p; return o; } : ( (gOPN && gOPD) ? (function(){ function setProperties(o, p) { for (var key, names = gOPN(p), i = 0, length = names.length; i < length; i++ ) { key = names[i]; if (!hOP.call(o, key)) { defineProperty(o, key, gOPD(p, key)); } } } return function (o, p) { do { setProperties(o, p); } while ((p = gPO(p)) && !iPO.call(p, o)); return o; }; }()) : function (o, p) { for (var key in p) { o[key] = p[key]; } return o; } )), // DOM shortcuts and helpers, if any MutationObserver = window.MutationObserver || window.WebKitMutationObserver, HTMLAnchorElement = window.HTMLAnchorElement, HTMLElementPrototype = ( window.HTMLElement || window.Element || window.Node ).prototype, IE8 = !iPO.call(HTMLElementPrototype, documentElement), safeProperty = IE8 ? function (o, k, d) { o[k] = d.value; return o; } : defineProperty, isValidNode = IE8 ? function (node) { return node.nodeType === 1; } : function (node) { return iPO.call(HTMLElementPrototype, node); }, targets = IE8 && [], attachShadow = HTMLElementPrototype.attachShadow, cloneNode = HTMLElementPrototype.cloneNode, closest = HTMLElementPrototype.closest || function (name) { var self = this; while (self && self.nodeName !== name) self = self.parentNode; return self; }, dispatchEvent = HTMLElementPrototype.dispatchEvent, getAttribute = HTMLElementPrototype.getAttribute, hasAttribute = HTMLElementPrototype.hasAttribute, removeAttribute = HTMLElementPrototype.removeAttribute, setAttribute = HTMLElementPrototype.setAttribute, // replaced later on createElement = document.createElement, importNode = document.importNode, patchedCreateElement = createElement, // shared observer for all attributes attributesObserver = MutationObserver && { attributes: true, characterData: true, attributeOldValue: true }, // useful to detect only if there's no MutationObserver DOMAttrModified = MutationObserver || function(e) { doesNotSupportDOMAttrModified = false; documentElement.removeEventListener( DOM_ATTR_MODIFIED, DOMAttrModified ); }, // will both be used to make DOMNodeInserted asynchronous asapQueue, asapTimer = 0, // internal flags V0 = REGISTER_ELEMENT in document && !/^force-all/.test(polyfill.type), setListener = true, justSetup = false, doesNotSupportDOMAttrModified = true, dropDomContentLoaded = true, // needed for the innerHTML helper notFromInnerHTMLHelper = true, // optionally defined later on onSubtreeModified, callDOMAttrModified, getAttributesMirror, observer, observe, // based on setting prototype capability // will check proto or the expando attribute // in order to setup the node once patchIfNotAlready, patch, // used for tests tmp ; // IE11 disconnectedCallback issue # // to be tested before any createElement patch if (MutationObserver) { // original fix: // https://github.com/javan/mutation-observer-inner-html-shim tmp = document.createElement('div'); tmp.innerHTML = '
'; new MutationObserver(function (mutations, observer) { if ( mutations[0] && mutations[0].type == 'childList' && !mutations[0].removedNodes[0].childNodes.length ) { tmp = gOPD(HTMLElementPrototype, 'innerHTML'); var set = tmp && tmp.set; if (set) defineProperty(HTMLElementPrototype, 'innerHTML', { set: function (value) { while (this.lastChild) this.removeChild(this.lastChild); set.call(this, value); } }); } observer.disconnect(); tmp = null; }).observe(tmp, {childList: true, subtree: true}); tmp.innerHTML = ""; } // only if needed if (!V0) { if (sPO || hasProto) { patchIfNotAlready = function (node, proto) { if (!iPO.call(proto, node)) { setupNode(node, proto); } }; patch = setupNode; } else { patchIfNotAlready = function (node, proto) { if (!node[EXPANDO_UID]) { node[EXPANDO_UID] = Object(true); setupNode(node, proto); } }; patch = patchIfNotAlready; } if (IE8) { doesNotSupportDOMAttrModified = false; (function (){ var descriptor = gOPD(HTMLElementPrototype, ADD_EVENT_LISTENER), addEventListener = descriptor.value, patchedRemoveAttribute = function (name) { var e = new CustomEvent(DOM_ATTR_MODIFIED, {bubbles: true}); e.attrName = name; e.prevValue = getAttribute.call(this, name); e.newValue = null; e[REMOVAL] = e.attrChange = 2; removeAttribute.call(this, name); dispatchEvent.call(this, e); }, patchedSetAttribute = function (name, value) { var had = hasAttribute.call(this, name), old = had && getAttribute.call(this, name), e = new CustomEvent(DOM_ATTR_MODIFIED, {bubbles: true}) ; setAttribute.call(this, name, value); e.attrName = name; e.prevValue = had ? old : null; e.newValue = value; if (had) { e[MODIFICATION] = e.attrChange = 1; } else { e[ADDITION] = e.attrChange = 0; } dispatchEvent.call(this, e); }, onPropertyChange = function (e) { // jshint eqnull:true var node = e.currentTarget, superSecret = node[EXPANDO_UID], propertyName = e.propertyName, event ; if (superSecret.hasOwnProperty(propertyName)) { superSecret = superSecret[propertyName]; event = new CustomEvent(DOM_ATTR_MODIFIED, {bubbles: true}); event.attrName = superSecret.name; event.prevValue = superSecret.value || null; event.newValue = (superSecret.value = node[propertyName] || null); if (event.prevValue == null) { event[ADDITION] = event.attrChange = 0; } else { event[MODIFICATION] = event.attrChange = 1; } dispatchEvent.call(node, event); } } ; descriptor.value = function (type, handler, capture) { if ( type === DOM_ATTR_MODIFIED && this[ATTRIBUTE_CHANGED_CALLBACK] && this.setAttribute !== patchedSetAttribute ) { this[EXPANDO_UID] = { className: { name: 'class', value: this.className } }; this.setAttribute = patchedSetAttribute; this.removeAttribute = patchedRemoveAttribute; addEventListener.call(this, 'propertychange', onPropertyChange); } addEventListener.call(this, type, handler, capture); }; defineProperty(HTMLElementPrototype, ADD_EVENT_LISTENER, descriptor); }()); } else if (!MutationObserver) { documentElement[ADD_EVENT_LISTENER](DOM_ATTR_MODIFIED, DOMAttrModified); documentElement.setAttribute(EXPANDO_UID, 1); documentElement.removeAttribute(EXPANDO_UID); if (doesNotSupportDOMAttrModified) { onSubtreeModified = function (e) { var node = this, oldAttributes, newAttributes, key ; if (node === e.target) { oldAttributes = node[EXPANDO_UID]; node[EXPANDO_UID] = (newAttributes = getAttributesMirror(node)); for (key in newAttributes) { if (!(key in oldAttributes)) { // attribute was added return callDOMAttrModified( 0, node, key, oldAttributes[key], newAttributes[key], ADDITION ); } else if (newAttributes[key] !== oldAttributes[key]) { // attribute was changed return callDOMAttrModified( 1, node, key, oldAttributes[key], newAttributes[key], MODIFICATION ); } } // checking if it has been removed for (key in oldAttributes) { if (!(key in newAttributes)) { // attribute removed return callDOMAttrModified( 2, node, key, oldAttributes[key], newAttributes[key], REMOVAL ); } } } }; callDOMAttrModified = function ( attrChange, currentTarget, attrName, prevValue, newValue, action ) { var e = { attrChange: attrChange, currentTarget: currentTarget, attrName: attrName, prevValue: prevValue, newValue: newValue }; e[action] = attrChange; onDOMAttrModified(e); }; getAttributesMirror = function (node) { for (var attr, name, result = {}, attributes = node.attributes, i = 0, length = attributes.length; i < length; i++ ) { attr = attributes[i]; name = attr.name; if (name !== 'setAttribute') { result[name] = attr.value; } } return result; }; } } // set as enumerable, writable and configurable document[REGISTER_ELEMENT] = function registerElement(type, options) { upperType = type.toUpperCase(); if (setListener) { // only first time document.registerElement is used // we need to set this listener // setting it by default might slow down for no reason setListener = false; if (MutationObserver) { observer = (function(attached, detached){ function checkEmAll(list, callback) { for (var i = 0, length = list.length; i < length; callback(list[i++])){} } return new MutationObserver(function (records) { for (var current, node, newValue, i = 0, length = records.length; i < length; i++ ) { current = records[i]; if (current.type === 'childList') { checkEmAll(current.addedNodes, attached); checkEmAll(current.removedNodes, detached); } else { node = current.target; if (notFromInnerHTMLHelper && node[ATTRIBUTE_CHANGED_CALLBACK] && current.attributeName !== 'style') { newValue = getAttribute.call(node, current.attributeName); if (newValue !== current.oldValue) { node[ATTRIBUTE_CHANGED_CALLBACK]( current.attributeName, current.oldValue, newValue ); } } } } }); }(executeAction(ATTACHED), executeAction(DETACHED))); observe = function (node) { observer.observe( node, { childList: true, subtree: true } ); return node; }; observe(document); if (attachShadow) { HTMLElementPrototype.attachShadow = function () { return observe(attachShadow.apply(this, arguments)); }; } } else { asapQueue = []; document[ADD_EVENT_LISTENER]('DOMNodeInserted', onDOMNode(ATTACHED)); document[ADD_EVENT_LISTENER]('DOMNodeRemoved', onDOMNode(DETACHED)); } document[ADD_EVENT_LISTENER](DOM_CONTENT_LOADED, onReadyStateChange); document[ADD_EVENT_LISTENER]('readystatechange', onReadyStateChange); document.importNode = function (node, deep) { switch (node.nodeType) { case 1: return setupAll(document, importNode, [node, !!deep]); case 11: for (var fragment = document.createDocumentFragment(), childNodes = node.childNodes, length = childNodes.length, i = 0; i < length; i++ ) fragment.appendChild(document.importNode(childNodes[i], !!deep)); return fragment; default: return cloneNode.call(node, !!deep); } }; HTMLElementPrototype.cloneNode = function (deep) { return setupAll(this, cloneNode, [!!deep]); }; } if (justSetup) return (justSetup = false); if (-2 < ( indexOf.call(types, PREFIX_IS + upperType) + indexOf.call(types, PREFIX_TAG + upperType) )) { throwTypeError(type); } if (!validName.test(upperType) || -1 < indexOf.call(invalidNames, upperType)) { throw new Error('The type ' + type + ' is invalid'); } var constructor = function () { return extending ? document.createElement(nodeName, upperType) : document.createElement(nodeName); }, opt = options || OP, extending = hOP.call(opt, EXTENDS), nodeName = extending ? options[EXTENDS].toUpperCase() : upperType, upperType, i ; if (extending && -1 < ( indexOf.call(types, PREFIX_TAG + nodeName) )) { throwTypeError(nodeName); } i = types.push((extending ? PREFIX_IS : PREFIX_TAG) + upperType) - 1; query = query.concat( query.length ? ',' : '', extending ? nodeName + '[is="' + type.toLowerCase() + '"]' : nodeName ); constructor.prototype = ( protos[i] = hOP.call(opt, 'prototype') ? opt.prototype : create(HTMLElementPrototype) ); if (query.length) loopAndVerify( document.querySelectorAll(query), ATTACHED ); return constructor; }; document.createElement = (patchedCreateElement = function (localName, typeExtension) { var is = getIs(typeExtension), node = is ? createElement.call(document, localName, secondArgument(is)) : createElement.call(document, localName), name = '' + localName, i = indexOf.call( types, (is ? PREFIX_IS : PREFIX_TAG) + (is || name).toUpperCase() ), setup = -1 < i ; if (is) { node.setAttribute('is', is = is.toLowerCase()); if (setup) { setup = isInQSA(name.toUpperCase(), is); } } notFromInnerHTMLHelper = !document.createElement.innerHTMLHelper; if (setup) patch(node, protos[i]); return node; }); } function ASAP() { var queue = asapQueue.splice(0, asapQueue.length); asapTimer = 0; while (queue.length) { queue.shift().call( null, queue.shift() ); } } function loopAndVerify(list, action) { for (var i = 0, length = list.length; i < length; i++) { verifyAndSetupAndAction(list[i], action); } } function loopAndSetup(list) { for (var i = 0, length = list.length, node; i < length; i++) { node = list[i]; patch(node, protos[getTypeIndex(node)]); } } function executeAction(action) { return function (node) { if (isValidNode(node)) { verifyAndSetupAndAction(node, action); if (query.length) loopAndVerify( node.querySelectorAll(query), action ); } }; } function getTypeIndex(target) { var is = getAttribute.call(target, 'is'), nodeName = target.nodeName.toUpperCase(), i = indexOf.call( types, is ? PREFIX_IS + is.toUpperCase() : PREFIX_TAG + nodeName ) ; return is && -1 < i && !isInQSA(nodeName, is) ? -1 : i; } function isInQSA(name, type) { return -1 < query.indexOf(name + '[is="' + type + '"]'); } function onDOMAttrModified(e) { var node = e.currentTarget, attrChange = e.attrChange, attrName = e.attrName, target = e.target, addition = e[ADDITION] || 2, removal = e[REMOVAL] || 3 ; if (notFromInnerHTMLHelper && (!target || target === node) && node[ATTRIBUTE_CHANGED_CALLBACK] && attrName !== 'style' && ( e.prevValue !== e.newValue || // IE9, IE10, and Opera 12 gotcha e.newValue === '' && ( attrChange === addition || attrChange === removal ) )) { node[ATTRIBUTE_CHANGED_CALLBACK]( attrName, attrChange === addition ? null : e.prevValue, attrChange === removal ? null : e.newValue ); } } function onDOMNode(action) { var executor = executeAction(action); return function (e) { asapQueue.push(executor, e.target); if (asapTimer) clearTimeout(asapTimer); asapTimer = setTimeout(ASAP, 1); }; } function onReadyStateChange(e) { if (dropDomContentLoaded) { dropDomContentLoaded = false; e.currentTarget.removeEventListener(DOM_CONTENT_LOADED, onReadyStateChange); } if (query.length) loopAndVerify( (e.target || document).querySelectorAll(query), e.detail === DETACHED ? DETACHED : ATTACHED ); if (IE8) purge(); } function patchedSetAttribute(name, value) { // jshint validthis:true var self = this; setAttribute.call(self, name, value); onSubtreeModified.call(self, {target: self}); } function setupAll(context, callback, args) { var node = callback.apply(context, args), i = getTypeIndex(node) ; if (-1 < i) patch(node, protos[i]); if (args.pop() && query.length) loopAndSetup(node.querySelectorAll(query)); return node; } function setupNode(node, proto) { setPrototype(node, proto); if (observer) { observer.observe(node, attributesObserver); } else { if (doesNotSupportDOMAttrModified) { node.setAttribute = patchedSetAttribute; node[EXPANDO_UID] = getAttributesMirror(node); node[ADD_EVENT_LISTENER](DOM_SUBTREE_MODIFIED, onSubtreeModified); } node[ADD_EVENT_LISTENER](DOM_ATTR_MODIFIED, onDOMAttrModified); } if (node[CREATED_CALLBACK] && notFromInnerHTMLHelper) { node.created = true; node[CREATED_CALLBACK](); node.created = false; } } function purge() { for (var node, i = 0, length = targets.length; i < length; i++ ) { node = targets[i]; if (!documentElement.contains(node)) { length--; targets.splice(i--, 1); verifyAndSetupAndAction(node, DETACHED); } } } function throwTypeError(type) { throw new Error('A ' + type + ' type is already registered'); } function verifyAndSetupAndAction(node, action) { var fn, i = getTypeIndex(node), counterAction ; if ((-1 < i) && !closest.call(node, 'TEMPLATE')) { patchIfNotAlready(node, protos[i]); i = 0; if (action === ATTACHED && !node[ATTACHED]) { node[DETACHED] = false; node[ATTACHED] = true; counterAction = 'connected'; i = 1; if (IE8 && indexOf.call(targets, node) < 0) { targets.push(node); } } else if (action === DETACHED && !node[DETACHED]) { node[ATTACHED] = false; node[DETACHED] = true; counterAction = 'disconnected'; i = 1; } if (i && (fn = ( node[action + CALLBACK] || node[counterAction + CALLBACK] ))) fn.call(node); } } // V1 in da House! function CustomElementRegistry() {} CustomElementRegistry.prototype = { constructor: CustomElementRegistry, // a workaround for the stubborn WebKit define: usableCustomElements ? function (name, Class, options) { if (options) { CERDefine(name, Class, options); } else { var NAME = name.toUpperCase(); constructors[NAME] = { constructor: Class, create: [NAME] }; nodeNames.set(Class, NAME); customElements.define(name, Class); } } : CERDefine, get: usableCustomElements ? function (name) { return customElements.get(name) || get(name); } : get, whenDefined: usableCustomElements ? function (name) { return Promise.race([ customElements.whenDefined(name), whenDefined(name) ]); } : whenDefined }; function CERDefine(name, Class, options) { var is = options && options[EXTENDS] || '', CProto = Class.prototype, proto = create(CProto), attributes = Class.observedAttributes || empty, definition = {prototype: proto} ; // TODO: is this needed at all since it's inherited? // defineProperty(proto, 'constructor', {value: Class}); safeProperty(proto, CREATED_CALLBACK, { value: function () { if (justCreated) justCreated = false; else if (!this[DRECEV1]) { this[DRECEV1] = true; new Class(this); if (CProto[CREATED_CALLBACK]) CProto[CREATED_CALLBACK].call(this); var info = constructors[nodeNames.get(Class)]; if (!usableCustomElements || info.create.length > 1) { notifyAttributes(this); } } } }); safeProperty(proto, ATTRIBUTE_CHANGED_CALLBACK, { value: function (name) { if (-1 < indexOf.call(attributes, name)) { if (CProto[ATTRIBUTE_CHANGED_CALLBACK]) CProto[ATTRIBUTE_CHANGED_CALLBACK].apply(this, arguments); } } }); if (CProto[CONNECTED_CALLBACK]) { safeProperty(proto, ATTACHED_CALLBACK, { value: CProto[CONNECTED_CALLBACK] }); } if (CProto[DISCONNECTED_CALLBACK]) { safeProperty(proto, DETACHED_CALLBACK, { value: CProto[DISCONNECTED_CALLBACK] }); } if (is) definition[EXTENDS] = is; name = name.toUpperCase(); constructors[name] = { constructor: Class, create: is ? [is, secondArgument(name)] : [name] }; nodeNames.set(Class, name); document[REGISTER_ELEMENT](name.toLowerCase(), definition); whenDefined(name); waitingList[name].r(); } function get(name) { var info = constructors[name.toUpperCase()]; return info && info.constructor; } function getIs(options) { return typeof options === 'string' ? options : (options && options.is || ''); } function notifyAttributes(self) { var callback = self[ATTRIBUTE_CHANGED_CALLBACK], attributes = callback ? self.attributes : empty, i = attributes.length, attribute ; while (i--) { attribute = attributes[i]; // || attributes.item(i); callback.call( self, attribute.name || attribute.nodeName, null, attribute.value || attribute.nodeValue ); } } function whenDefined(name) { name = name.toUpperCase(); if (!(name in waitingList)) { waitingList[name] = {}; waitingList[name].p = new Promise(function (resolve) { waitingList[name].r = resolve; }); } return waitingList[name].p; } function polyfillV1() { if (customElements) delete window.customElements; defineProperty(window, 'customElements', { configurable: true, value: new CustomElementRegistry() }); defineProperty(window, 'CustomElementRegistry', { configurable: true, value: CustomElementRegistry }); for (var patchClass = function (name) { var Class = window[name]; if (Class) { window[name] = function CustomElementsV1(self) { var info, isNative; if (!self) self = this; if (!self[DRECEV1]) { justCreated = true; info = constructors[nodeNames.get(self.constructor)]; isNative = usableCustomElements && info.create.length === 1; self = isNative ? Reflect.construct(Class, empty, info.constructor) : document.createElement.apply(document, info.create); self[DRECEV1] = true; justCreated = false; if (!isNative) notifyAttributes(self); } return self; }; window[name].prototype = Class.prototype; try { Class.prototype.constructor = window[name]; } catch(WebKit) { fixGetClass = true; defineProperty(Class, DRECEV1, {value: window[name]}); } } }, Classes = htmlClass.get(/^HTML[A-Z]*[a-z]/), i = Classes.length; i--; patchClass(Classes[i]) ) {} (document.createElement = function (name, options) { var is = getIs(options); return is ? patchedCreateElement.call(this, name, secondArgument(is)) : patchedCreateElement.call(this, name); }); if (!V0) { justSetup = true; document[REGISTER_ELEMENT](''); } } // if customElements is not there at all if (!customElements || /^force/.test(polyfill.type)) polyfillV1(); else if(!polyfill.noBuiltIn) { // if available test extends work as expected try { (function (DRE, options, name) { var re = new RegExp('^$'); options[EXTENDS] = 'a'; DRE.prototype = create(HTMLAnchorElement.prototype); DRE.prototype.constructor = DRE; window.customElements.define(name, DRE, options); if ( !re.test(document.createElement('a', {is: name}).outerHTML) || !re.test((new DRE()).outerHTML) ) { throw options; } }( function DRE() { return Reflect.construct(HTMLAnchorElement, [], DRE); }, {}, 'document-register-element-a' )); } catch(o_O) { // or force the polyfill if not // and keep internal original reference polyfillV1(); } } // FireFox only issue if(!polyfill.noBuiltIn) { try { if (createElement.call(document, 'a', 'a').outerHTML.indexOf('is') < 0) throw {}; } catch(FireFox) { secondArgument = function (is) { return {is: is.toLowerCase()}; }; } } }(window));