/** * @license * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ /* * PLEASE NOTE: This file is duplicated within Polymer. Please keep it in sync! * https://github.com/Polymer/polymer/blob/master/src/system/HTMLImports/base.js */ /* Create polyfill scope and feature detect native support. */ window.HTMLImports = window.HTMLImports || {flags:{}}; (function(scope) { /** Basic setup and simple module executer. We collect modules and then execute the code later, only if it's necessary for polyfilling. */ var IMPORT_LINK_TYPE = 'import'; var useNative = Boolean(IMPORT_LINK_TYPE in document.createElement('link')); /** Support `currentScript` on all browsers as `document._currentScript.` NOTE: We cannot polyfill `document.currentScript` because it's not possible both to override and maintain the ability to capture the native value. Therefore we choose to expose `_currentScript` both when native imports and the polyfill are in use. */ // NOTE: ShadowDOMPolyfill intrusion. var hasShadowDOMPolyfill = Boolean(window.ShadowDOMPolyfill); var wrap = function(node) { return hasShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node) : node; }; var rootDocument = wrap(document); var currentScriptDescriptor = { get: function() { var script = HTMLImports.currentScript || document.currentScript || // NOTE: only works when called in synchronously executing code. // readyState should check if `loading` but IE10 is // interactive when scripts run so we cheat. (document.readyState !== 'complete' ? document.scripts[document.scripts.length - 1] : null); return wrap(script); }, configurable: true }; Object.defineProperty(document, '_currentScript', currentScriptDescriptor); Object.defineProperty(rootDocument, '_currentScript', currentScriptDescriptor); /** Add support for the `HTMLImportsLoaded` event and the `HTMLImports.whenReady` method. This api is necessary because unlike the native implementation, script elements do not force imports to resolve. Instead, users should wrap code in either an `HTMLImportsLoaded` hander or after load time in an `HTMLImports.whenReady(callback)` call. NOTE: This module also supports these apis under the native implementation. Therefore, if this file is loaded, the same code can be used under both the polyfill and native implementation. */ var isIE = /Trident|Edge/.test(navigator.userAgent); // call a callback when all HTMLImports in the document at call time // (or at least document ready) have loaded. // 1. ensure the document is in a ready state (has dom), then // 2. watch for loading of imports and call callback when done function whenReady(callback, doc) { doc = doc || rootDocument; // if document is loading, wait and try again whenDocumentReady(function() { watchImportsLoad(callback, doc); }, doc); } // call the callback when the document is in a ready state (has dom) var requiredReadyState = isIE ? 'complete' : 'interactive'; var READY_EVENT = 'readystatechange'; function isDocumentReady(doc) { return (doc.readyState === 'complete' || doc.readyState === requiredReadyState); } // call when we ensure the document is in a ready state function whenDocumentReady(callback, doc) { if (!isDocumentReady(doc)) { var checkReady = function() { if (doc.readyState === 'complete' || doc.readyState === requiredReadyState) { doc.removeEventListener(READY_EVENT, checkReady); whenDocumentReady(callback, doc); } }; doc.addEventListener(READY_EVENT, checkReady); } else if (callback) { callback(); } } function markTargetLoaded(event) { event.target.__loaded = true; } // call when we ensure all imports have loaded function watchImportsLoad(callback, doc) { var imports = doc.querySelectorAll('link[rel=import]'); var loaded = 0, l = imports.length; function checkDone(d) { if ((loaded == l) && callback) { callback(); } } function loadedImport(e) { markTargetLoaded(e); loaded++; checkDone(); } if (l) { for (var i=0, imp; (i