|
| 1 | +// depends on /nscl/content/NoscriptElements.js |
| 2 | + |
| 3 | +"use strict"; |
1 | 4 | function onScriptDisabled() { |
2 | | - if (document.readyState === "loading") { |
3 | | - if (!onScriptDisabled._installed) { |
4 | | - window.addEventListener("DOMContentLoaded", e => onScriptDisabled()); |
5 | | - onScriptDisabled._installed = true; |
6 | | - } |
7 | | - return; |
8 | | - } |
9 | 5 | onScriptDisabled = () => {}; |
10 | | - let refresh = false; |
11 | | - for (let noscript of document.querySelectorAll("noscript")) { |
12 | 6 |
|
13 | | - // force show NOSCRIPT elements content |
14 | | - let replacement = createHTMLElement("span"); |
15 | | - replacement.innerHTML = noscript.innerHTML; |
16 | | - // emulate meta-refresh |
17 | | - for (let meta of replacement.querySelectorAll('meta[http-equiv="refresh"]')) { |
18 | | - refresh = true; |
19 | | - document.head.appendChild(meta); |
20 | | - console.log(`State %s, emulating`, document.readyState, meta); |
| 7 | + let emulateNoScriptElement = () => { |
| 8 | + if (ns.allows("noscript")) { |
| 9 | + NoscriptElements.emulate(true); |
21 | 10 | } |
| 11 | + }; |
22 | 12 |
|
23 | | - if (noscript.closest("head") && document.body) { |
24 | | - document.body.insertBefore(noscript, document.body.firstChild); |
25 | | - } |
26 | | - noscript.replaceWith(replacement); |
27 | | - } |
28 | | - if (refresh) { |
29 | | - let html = document.documentElement.outerHTML; |
30 | | - let rewrite = () => { |
31 | | - let document = window.wrappedJSObject ? window.wrappedJSObject.document : window.document; |
32 | | - try { |
33 | | - document.open(); |
34 | | - document.write(html); |
35 | | - document.close(); |
36 | | - } catch (e) { |
37 | | - error(e); |
38 | | - } |
39 | | - }; |
40 | | - if (document.readyState === "complete") { |
41 | | - rewrite(); |
42 | | - } else { |
43 | | - window.addEventListener("load", e => { |
44 | | - if (e.isTrusted) rewrite(); |
45 | | - }); |
46 | | - } |
| 13 | + if (document.readyState === "loading") { |
| 14 | + window.addEventListener("DOMContentLoaded", emulateNoScriptElement, true); |
| 15 | + return; |
| 16 | + } else { |
| 17 | + emulateNoScriptElement(); |
47 | 18 | } |
48 | | - { |
49 | | - let eraser = { |
50 | | - tapped: null, |
51 | | - delKey: false, |
52 | | - }; |
53 | 19 |
|
54 | | - addEventListener("pagehide", ev => { |
55 | | - if (!ev.isTrusted) return; |
56 | | - eraser.tapped = null; |
57 | | - eraser.delKey = false; |
58 | | - }, false); |
| 20 | + let eraser = { |
| 21 | + tapped: null, |
| 22 | + delKey: false, |
| 23 | + }; |
59 | 24 |
|
60 | | - addEventListener("keyup", ev => { |
61 | | - if (!ev.isTrusted) return; |
62 | | - let el = eraser.tapped; |
63 | | - if (el && ev.code === "Delete" || ev.code === "Backspace") { |
64 | | - eraser.tapped = null; |
65 | | - eraser.delKey = true; |
66 | | - let doc = el.ownerDocument; |
67 | | - let w = doc.defaultView; |
68 | | - if (w.getSelection().isCollapsed) { |
69 | | - let root = doc.body || doc.documentElement; |
70 | | - let posRx = /^(?:absolute|fixed)$/; |
71 | | - do { |
72 | | - if (posRx.test(w.getComputedStyle(el, '').position)) { |
73 | | - (eraser.tapped = el.parentNode).removeChild(el); |
74 | | - break; |
75 | | - } |
76 | | - } while ((el = el.parentNode) && el != root); |
77 | | - } |
78 | | - } |
79 | | - }, true); |
| 25 | + addEventListener("pagehide", ev => { |
| 26 | + if (!ev.isTrusted) return; |
| 27 | + eraser.tapped = null; |
| 28 | + eraser.delKey = false; |
| 29 | + }, false); |
80 | 30 |
|
81 | | - addEventListener("mousedown", ev => { |
82 | | - if (!ev.isTrusted) return; |
83 | | - if (ev.button === 0) { |
84 | | - eraser.tapped = ev.target; |
85 | | - eraser.delKey = false; |
| 31 | + addEventListener("keyup", ev => { |
| 32 | + if (!ev.isTrusted) return; |
| 33 | + let el = eraser.tapped; |
| 34 | + if (el && ev.code === "Delete" || ev.code === "Backspace") { |
| 35 | + eraser.tapped = null; |
| 36 | + eraser.delKey = true; |
| 37 | + let doc = el.ownerDocument; |
| 38 | + let w = doc.defaultView; |
| 39 | + if (w.getSelection().isCollapsed) { |
| 40 | + let root = doc.body || doc.documentElement; |
| 41 | + let posRx = /^(?:absolute|fixed)$/; |
| 42 | + do { |
| 43 | + if (posRx.test(w.getComputedStyle(el, '').position)) { |
| 44 | + (eraser.tapped = el.parentNode).removeChild(el); |
| 45 | + break; |
| 46 | + } |
| 47 | + } while ((el = el.parentNode) && el != root); |
86 | 48 | } |
87 | | - }, true); |
| 49 | + } |
| 50 | + }, true); |
88 | 51 |
|
89 | | - addEventListener("mouseup", ev => { |
90 | | - if (!ev.isTrusted) return; |
91 | | - if (eraser.delKey) { |
92 | | - eraser.delKey = false; |
93 | | - ev.preventDefault(); |
94 | | - ev.stopPropagation(); |
95 | | - } |
96 | | - eraser.tapped = null; |
97 | | - }, true); |
98 | | - } |
| 52 | + addEventListener("mousedown", ev => { |
| 53 | + if (!ev.isTrusted) return; |
| 54 | + if (ev.button === 0) { |
| 55 | + eraser.tapped = ev.target; |
| 56 | + eraser.delKey = false; |
| 57 | + } |
| 58 | + }, true); |
| 59 | + |
| 60 | + addEventListener("mouseup", ev => { |
| 61 | + if (!ev.isTrusted) return; |
| 62 | + if (eraser.delKey) { |
| 63 | + eraser.delKey = false; |
| 64 | + ev.preventDefault(); |
| 65 | + ev.stopPropagation(); |
| 66 | + } |
| 67 | + eraser.tapped = null; |
| 68 | + }, true); |
99 | 69 | } |
0 commit comments