UNPKG

siesta-lite

Version:

Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers

93 lines (86 loc) 3.66 kB
/** * @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 */ (function() { 'use strict'; // global for (1) existence means `WebComponentsReady` will fire, // (2) WebComponents.ready == true means event has fired. window.WebComponents = window.WebComponents || {}; var name = 'webcomponents-loader.js'; // Feature detect which polyfill needs to be imported. var polyfills = []; if (!('import' in document.createElement('link'))) { polyfills.push('hi'); } if (!('attachShadow' in Element.prototype && 'getRootNode' in Element.prototype) || (window.ShadyDOM && window.ShadyDOM.force)) { polyfills.push('sd'); } if (!window.customElements || window.customElements.forcePolyfill) { polyfills.push('ce'); } var needsTemplate = (function() { // no real <template> because no `content` property (IE and older browsers) var t = document.createElement('template'); if (!('content' in t)) { return true; } // broken doc fragment (older Edge) if (!(t.content.cloneNode() instanceof DocumentFragment)) { return true; } // broken <template> cloning (Edge up to at least version 17) var t2 = document.createElement('template'); t2.content.appendChild(document.createElement('div')); t.content.appendChild(t2); var clone = t.cloneNode(true); return (clone.content.childNodes.length === 0 || clone.content.firstChild.content.childNodes.length === 0); })(); // NOTE: any browser that does not have template or ES6 features // must load the full suite (called `lite` for legacy reasons) of polyfills. if (!window.Promise || !Array.from || needsTemplate) { polyfills = ['lite']; } if (polyfills.length) { var script = document.querySelector('script[src*="' + name +'"]'); var newScript = document.createElement('script'); // Load it from the right place. var replacement = 'webcomponents-' + polyfills.join('-') + '.js'; var url = script.src.replace(name, replacement); newScript.src = url; // NOTE: this is required to ensure the polyfills are loaded before // *native* html imports load on older Chrome versions. This *is* CSP // compliant since CSP rules must have allowed this script to run. // In all other cases, this can be async. if (document.readyState === 'loading' && ('import' in document.createElement('link'))) { document.write(newScript.outerHTML); } else { document.head.appendChild(newScript); } } else { // Ensure `WebComponentsReady` is fired also when there are no polyfills loaded. // however, we have to wait for the document to be in 'interactive' state, // otherwise a rAF may fire before scripts in <body> var fire = function() { requestAnimationFrame(function() { window.WebComponents.ready = true; document.dispatchEvent(new CustomEvent('WebComponentsReady', {bubbles: true})); }); }; if (document.readyState !== 'loading') { fire(); } else { document.addEventListener('readystatechange', function wait() { fire(); document.removeEventListener('readystatechange', wait); }); } } })();