UNPKG

3.46 kBJavaScriptView Raw
1"use strict";
2
3require("core-js/modules/es.array.for-each.js");
4
5require("core-js/modules/es.array.from.js");
6
7require("core-js/modules/es.array.includes.js");
8
9require("core-js/modules/es.string.iterator.js");
10
11require("core-js/modules/web.dom-collections.for-each.js");
12
13Object.defineProperty(exports, "__esModule", {
14 value: true
15});
16exports.simulateDOMContentLoaded = simulateDOMContentLoaded;
17exports.simulatePageLoad = simulatePageLoad;
18
19var _global = require("global");
20
21// https://html.spec.whatwg.org/multipage/scripting.html
22var runScriptTypes = ['application/javascript', 'application/ecmascript', 'application/x-ecmascript', 'application/x-javascript', 'text/ecmascript', 'text/javascript', 'text/javascript1.0', 'text/javascript1.1', 'text/javascript1.2', 'text/javascript1.3', 'text/javascript1.4', 'text/javascript1.5', 'text/jscript', 'text/livescript', 'text/x-ecmascript', 'text/x-javascript'];
23var SCRIPT = 'script';
24var SCRIPTS_ROOT_ID = 'scripts-root'; // trigger DOMContentLoaded
25
26function simulateDOMContentLoaded() {
27 var DOMContentLoadedEvent = _global.document.createEvent('Event');
28
29 DOMContentLoadedEvent.initEvent('DOMContentLoaded', true, true);
30
31 _global.document.dispatchEvent(DOMContentLoadedEvent);
32}
33
34function insertScript($script, callback, $scriptRoot) {
35 var scriptEl = _global.document.createElement('script');
36
37 scriptEl.type = 'text/javascript';
38
39 if ($script.src) {
40 scriptEl.onload = callback;
41 scriptEl.onerror = callback;
42 scriptEl.src = $script.src;
43 } else {
44 scriptEl.textContent = $script.innerText;
45 } // re-insert the script tag so it executes.
46
47
48 if ($scriptRoot) $scriptRoot.appendChild(scriptEl);else _global.document.head.appendChild(scriptEl); // clean-up
49
50 $script.parentNode.removeChild($script); // run the callback immediately for inline scripts
51
52 if (!$script.src) callback();
53} // runs an array of async functions in sequential order
54
55/* eslint-disable no-param-reassign, no-plusplus */
56
57
58function insertScriptsSequentially(scriptsToExecute, callback) {
59 var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
60 scriptsToExecute[index](function () {
61 index++;
62
63 if (index === scriptsToExecute.length) {
64 callback();
65 } else {
66 insertScriptsSequentially(scriptsToExecute, callback, index);
67 }
68 });
69}
70
71function simulatePageLoad($container) {
72 var $scriptsRoot = _global.document.getElementById(SCRIPTS_ROOT_ID);
73
74 if (!$scriptsRoot) {
75 $scriptsRoot = _global.document.createElement('div');
76 $scriptsRoot.id = SCRIPTS_ROOT_ID;
77
78 _global.document.body.appendChild($scriptsRoot);
79 } else {
80 $scriptsRoot.innerHTML = '';
81 }
82
83 var $scripts = Array.from($container.querySelectorAll(SCRIPT));
84
85 if ($scripts.length) {
86 var scriptsToExecute = [];
87 $scripts.forEach(function ($script) {
88 var typeAttr = $script.getAttribute('type'); // only run script tags without the type attribute
89 // or with a javascript mime attribute value from the list
90
91 if (!typeAttr || runScriptTypes.includes(typeAttr)) {
92 scriptsToExecute.push(function (callback) {
93 return insertScript($script, callback, $scriptsRoot);
94 });
95 }
96 }); // insert the script tags sequentially
97 // to preserve execution order
98
99 if (scriptsToExecute.length) {
100 insertScriptsSequentially(scriptsToExecute, simulateDOMContentLoaded, undefined);
101 }
102 } else {
103 simulateDOMContentLoaded();
104 }
105}
\No newline at end of file