diff options
author | hackademix | 2018-07-26 19:33:46 +0200 |
---|---|---|
committer | hackademix | 2018-07-26 19:33:46 +0200 |
commit | d3cacf634fad5a80c8a715df60d3e53f008252df (patch) | |
tree | 377b4f57c20a3f64b8d5f4a754a0aafe6cb61b9c | |
parent | a8a6dd4c7bd47ff6960fd71d1a20d151fa08de12 (diff) | |
download | noscript-d3cacf634fad5a80c8a715df60d3e53f008252df.tar.gz noscript-d3cacf634fad5a80c8a715df60d3e53f008252df.tar.xz noscript-d3cacf634fad5a80c8a715df60d3e53f008252df.zip |
More edge cases covered in dynamic script injection.
-rw-r--r-- | src/bg/RequestGuard.js | 16 | ||||
-rw-r--r-- | src/bg/RequestUtil.js | 24 | ||||
-rw-r--r-- | src/content/media.js | 7 | ||||
-rw-r--r-- | src/content/webglHook.js | 9 |
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; |