1(() => { 2 const placement = "head"; 3 const cssAssets = []; 4 const jsAssets = []; 5 6 function getMount() { 7 if (placement === "head") { 8 return document.head || document.documentElement; 9 } 10 11 return document.body || document.documentElement; 12 } 13 14 function assetSelector(id) { 15 return '[data-customcsspn-asset="' + CSS.escape(id) + '"]'; 16 } 17 18 function loadCss(asset) { 19 if (!asset.url || document.querySelector(assetSelector(asset.id))) { 20 return; 21 } 22 23 const link = document.createElement("link"); 24 link.rel = "stylesheet"; 25 link.href = asset.url; 26 link.dataset.customcsspnAsset = asset.id; 27 getMount().appendChild(link); 28 } 29 30 function appendScriptFromNode(node, id) { 31 return new Promise((resolve) => { 32 const script = document.createElement("script"); 33 34 for (const attr of node.attributes) { 35 script.setAttribute(attr.name, attr.value); 36 } 37 38 script.dataset.customcsspnAsset = id; 39 40 if (node.src) { 41 script.onload = resolve; 42 script.onerror = resolve; 43 } 44 45 script.text = node.textContent || ""; 46 getMount().appendChild(script); 47 48 if (!node.src) { 49 resolve(); 50 } 51 }); 52 } 53 54 function appendInlineScript(content, id) { 55 const script = document.createElement("script"); 56 script.dataset.customcsspnAsset = id; 57 script.text = content; 58 getMount().appendChild(script); 59 } 60 61 async function runScriptAsset(asset) { 62 if (!asset.content || document.querySelector(assetSelector(asset.id))) { 63 return; 64 } 65 66 const content = asset.content.trim(); 67 68 if (!/<script[\s>]/i.test(content)) { 69 appendInlineScript(content, asset.id); 70 return; 71 } 72 73 const template = document.createElement("template"); 74 template.innerHTML = content; 75 const scripts = Array.from(template.content.querySelectorAll("script")); 76 77 if (scripts.length === 0) { 78 appendInlineScript(content, asset.id); 79 return; 80 } 81 82 for (const script of scripts) { 83 await appendScriptFromNode(script, asset.id); 84 } 85 } 86 87 async function load() { 88 cssAssets.forEach(loadCss); 89 90 for (const asset of jsAssets) { 91 await runScriptAsset(asset); 92 } 93 } 94 95 if (placement === "footer" && document.readyState === "loading") { 96 document.addEventListener("DOMContentLoaded", load, { once: true }); 97 } else { 98 load(); 99 } 100})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.