summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhackademix2018-07-26 19:33:46 +0200
committerhackademix2018-07-26 19:33:46 +0200
commitd3cacf634fad5a80c8a715df60d3e53f008252df (patch)
tree377b4f57c20a3f64b8d5f4a754a0aafe6cb61b9c
parenta8a6dd4c7bd47ff6960fd71d1a20d151fa08de12 (diff)
downloadnoscript-d3cacf634fad5a80c8a715df60d3e53f008252df.tar.gz
noscript-d3cacf634fad5a80c8a715df60d3e53f008252df.tar.xz
noscript-d3cacf634fad5a80c8a715df60d3e53f008252df.zip
More edge cases covered in dynamic script injection.
-rw-r--r--src/bg/RequestGuard.js16
-rw-r--r--src/bg/RequestUtil.js24
-rw-r--r--src/content/media.js7
-rw-r--r--src/content/webglHook.js9
4 files changed, 30 insertions, 26 deletions
diff --git a/src/bg/RequestGuard.js b/src/bg/RequestGuard.js
index 5220658..5a281fb 100644
--- a/src/bg/RequestGuard.js
+++ b/src/bg/RequestGuard.js
@@ -99,12 +99,14 @@ var RequestGuard = (() => {
}
}
let collection = records[what];
- if (type in collection) {
- if (!collection[type].includes(requestKey)) {
- collection[type].push(requestKey);
+ if (collection) {
+ if (type in collection) {
+ if (!collection[type].includes(requestKey)) {
+ collection[type].push(requestKey);
+ }
+ } else {
+ collection[type] = [requestKey];
}
- } else {
- collection[type] = [requestKey];
}
return records;
},
@@ -425,12 +427,12 @@ var RequestGuard = (() => {
}
if (!capabilities.has("media")) {
RequestUtil.executeOnStart(request, {
- code: "window.mediaBlocker = true;"
+ code: "window.mediaBlocker = correctFrame();"
});
}
RequestUtil.executeOnStart(request, {
- file: "content/media.js"
+ file: "/content/media.js"
});
} else if (request.type === "main_frame" && !TabStatus.map.has(tabId)) {
debug("No TabStatus data yet for noscriptFrame", tabId);
diff --git a/src/bg/RequestUtil.js b/src/bg/RequestUtil.js
index 2999cc1..690d7ba 100644
--- a/src/bg/RequestUtil.js
+++ b/src/bg/RequestUtil.js
@@ -20,32 +20,39 @@
};
let executeAll = async request => {
- let {url, tabId, frameId, requestId} = request;
+ let {url, tabId, frameId, requestId, type} = request;
let scripts = pendingScripts.get(requestId);
if (!scripts) return -1;
pendingScripts.delete(requestId);
+
+ let where = type === "object" ? {allFrames: true} : {frameId};
let count = 0;
- await Promise.all([...scripts.values()].map(async details => {
+ let run = async details => {
details = Object.assign({
runAt: "document_start",
matchAboutBlank: true,
- frameId,
- }, details);
+ }, details, where);
try {
+ let res;
for (let attempts = 10; attempts-- > 0;) {
try {
- await browser.tabs.executeScript(tabId, details);
+ res = await browser.tabs.executeScript(tabId, details);
+ break;
} catch(e) {
if (!/No matching message handler/.test(e.message)) throw e;
debug("Couldn't inject script into %s: too early? Retrying up to %s times...", url, attempts);
}
}
count++;
- debug("Execute on start OK", url, details);
+ debug("Execute on start OK, result=%o", res, url, details);
} catch (e) {
error(e, "Execute on start failed", url, details);
}
- }));
+ };
+
+ await run({code: `void(window.correctFrame = () => "${url}" === document.URL && document.readyState === "loading")`});
+ await Promise.all([...scripts.values()].map(run));
+ await run({code: `void(window.correctFrame = () => false)`});
return count;
};
@@ -59,7 +66,6 @@
wr[event].addListener(cleanup, filter);
}
- filter.types = ["main_frame"];
wr.onResponseStarted.addListener(r => {
let scripts = pendingScripts.get(r.requestId);
if (scripts) scripts.runAndFlush();
@@ -73,7 +79,7 @@
},
executeOnStart(request, details) {
- let {requestId, url, tabId, frameId, statusCode} = request;
+ let {requestId, url, tabId, frameId, statusCode, type} = request;
if (statusCode >= 300 && statusCode < 400) return;
if (frameId === 0) {
diff --git a/src/content/media.js b/src/content/media.js
index b975bef..ead6e05 100644
--- a/src/content/media.js
+++ b/src/content/media.js
@@ -1,5 +1,5 @@
-debug("Media Hook (blocked %s)", !!window.mediaBlocker, document.URL, document.documentElement && document.documentElement.innerHTML);
-try {
+if (correctFrame()) {
+ debug("Media Hook (blocked %s)", !!window.mediaBlocker, document.URL, document.documentElement && document.documentElement.innerHTML);
(() => {
let unpatched = new Map();
function patch(obj, methodName, replacement) {
@@ -56,6 +56,5 @@ try {
});
})();
-} catch (e) {
- error(e, "Cannot patch MediaSource");
+ document.URL;
}
diff --git a/src/content/webglHook.js b/src/content/webglHook.js
index c3b7aaa..39637e2 100644
--- a/src/content/webglHook.js
+++ b/src/content/webglHook.js
@@ -1,5 +1,5 @@
-debug("WebGL Hook", document.URL, document.documentElement && document.documentElement.innerHTML);
-try {
+if (correctFrame()) {
+ debug("WebGL Hook", document.URL, document.documentElement && document.documentElement.innerHTML);
let proto = HTMLCanvasElement.prototype;
let getContext = proto.getContext;
exportFunction(function(type, ...rest) {
@@ -24,8 +24,5 @@ try {
}
return getContext.call(this, type, ...rest);
}, proto, {defineAs: "getContext"});
-} catch (e) {
- console.error(e);
+ document.URL;
}
-
-null;