Skip to content

Commit c42cbb7

Browse files
committed
Configurable capability to show noscript elements on script-disabled pages.
1 parent 12c654f commit c42cbb7

5 files changed

Lines changed: 76 additions & 90 deletions

File tree

src/_locales/en/messages.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,9 @@
577577
"cap_ping": {
578578
"message": "ping"
579579
},
580+
"cap_noscript": {
581+
"message": "noscript"
582+
},
580583
"cap_other": {
581584
"message": "other"
582585
},

src/bg/LifeCycle.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,19 @@ var LifeCycle = (() => {
238238
if (Ver.is(previousVersion, "<=", "11.0.10")) {
239239
log(`Upgrading from 11.0.10 or below (${previousVersion}): configure the "ping" capability.`);
240240
await ns.initializing;
241-
ns.policy.TRUSTED.capabilities.add("ping")
241+
ns.policy.TRUSTED.capabilities.add("ping");
242+
await ns.savePolicy();
243+
}
244+
if (Ver.is(previousVersion, "<", "11.2.rc4")) {
245+
log(`Upgrading from ${previousVersion}: configure the "noscript" capability.`);
246+
await ns.initializing;
247+
let {DEFAULT, TRUSTED, UNTRUSTED} = ns.policy;
248+
// let's add "noscript" to DEFAULY, TRUSTED and any CUSTOM preset
249+
let presets = [DEFAULT, TRUSTED];
250+
presets = presets.concat([...ns.policy.sites.values()].filter(p => p !== TRUSTED && p !== UNTRUSTED));
251+
for (let p of presets) {
252+
p.capabilities.add("noscript");
253+
}
242254
await ns.savePolicy();
243255
}
244256
},

src/content/onScriptDisabled.js

Lines changed: 57 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,69 @@
1+
// depends on /nscl/content/NoscriptElements.js
2+
3+
"use strict";
14
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-
}
95
onScriptDisabled = () => {};
10-
let refresh = false;
11-
for (let noscript of document.querySelectorAll("noscript")) {
126

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);
2110
}
11+
};
2212

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();
4718
}
48-
{
49-
let eraser = {
50-
tapped: null,
51-
delKey: false,
52-
};
5319

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+
};
5924

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);
8030

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);
8648
}
87-
}, true);
49+
}
50+
}, true);
8851

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);
9969
}

src/manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,9 @@
100100
"lib/CSP.js",
101101
"nscl/content/patchWindow.js",
102102
"common/CapsCSP.js",
103-
"/nscl/common/RequestKey.js",
103+
"nscl/common/RequestKey.js",
104104
"content/DocumentCSP.js",
105+
"nscl/content/NoscriptElements.js",
105106
"content/onScriptDisabled.js",
106107
"content/staticNS.js",
107108
"content/PlaceHolder.js",

src/nscl

Submodule nscl updated from 077b989 to 48d5907

0 commit comments

Comments
 (0)