Skip to content

Commit 163467f

Browse files
committed
Fixed externally handled resources opened in popups being broken by dynamic script injection.
1 parent 570cf04 commit 163467f

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

src/bg/RequestGuard.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ var RequestGuard = (() => {
367367
header = h;
368368
h.value = CSP.inject(h.value, "");
369369
} else if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) {
370-
content[h.name.split("-")[1].trim().toLowerCase()] = h.value;
370+
content[RegExp.$1.toLowerCase()] = h.value;
371371
}
372372
}
373373

src/bg/RequestUtil.js

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,12 @@
1616
reloadingTabs.delete(key);
1717
}
1818
};
19-
let filter = {
20-
urls: ["<all_urls>"],
21-
types: ["main_frame", "sub_frame", "object"]
22-
};
23-
24-
for (let event of ["onCompleted", "onErrorOccurred"])
25-
browser.webRequest[event].addListener(cleanup, filter);
26-
27-
let executeAll = async (scripts, where) => {
28-
let {url, tabId, frameId} = where;
29-
19+
20+
let executeAll = async request => {
21+
let {url, tabId, frameId, requestId} = request;
22+
let scripts = pendingRequests.get(requestId);
23+
if (!scripts) return -1;
24+
pendingRequests.delete(requestId);
3025
let count = 0;
3126
for (let details of scripts.values()) {
3227
details = Object.assign({
@@ -44,7 +39,20 @@
4439
}
4540
return count;
4641
};
47-
42+
43+
{
44+
let filter = {
45+
urls: ["<all_urls>"],
46+
types: ["main_frame", "sub_frame", "object"]
47+
};
48+
let wr = browser.webRequest;
49+
for (let event of ["onCompleted", "onErrorOccurred"])
50+
wr[event].addListener(cleanup, filter);
51+
52+
filter.types = ["main_frame"];
53+
wr.onResponseStarted.addListener(executeAll, filter);
54+
}
55+
4856
var RequestUtil = {
4957

5058
getResponseMetaData(request) {
@@ -66,11 +74,13 @@
6674

6775
let response = this.getResponseMetaData(request);
6876
let {contentType, contentDisposition} = response;
69-
if (contentDisposition) {
70-
debug("Skipping execute on start of %s %o", url, response);
77+
if (contentDisposition ||
78+
xmlFeedOrImage.test(contentType) && !/\/svg\b/i.test(contentType)) {
79+
debug("Skipping execute on start of %s %o.", url, response);
7180
return;
7281
}
73-
debug("Injecting script on start in %s (%o)", url, response);
82+
83+
debug("Injecting script on start in %s (%o).", url, response);
7484

7585
let scripts = pendingRequests.get(requestId);
7686
let scriptKey = JSON.stringify(details);
@@ -81,12 +91,18 @@
8191
scripts.set(scriptKey, details);
8292
return;
8393
}
84-
85-
if (xmlFeedOrImage.test(contentType) && !/\/svg\b/i.test(contentType)) return;
94+
95+
if (request.type === "main_frame"
96+
&& /^(?:application|text)\//.test(contentType)
97+
&& !/[^;]+\b(html|xml)\b/i.test(contentType)) {
98+
debug("Not HTML, but top-level document: defer script to onResponseStarted for %s (%o)", url, response);
99+
return;
100+
}
101+
86102
if (typeof brokenXMLOnLoad === "undefined") {
87103
brokenXMLOnLoad = await (async () => parseInt((await browser.runtime.getBrowserInfo()).version) < 61)();
88104
}
89-
105+
90106
let mustCheckFeed = brokenXMLOnLoad && frameId === 0 && rawXml.test(contentType);
91107
debug("mustCheckFeed = %s, brokenXMLOnLoad = %s", mustCheckFeed, brokenXMLOnLoad);
92108
let filter = browser.webRequest.filterResponseData(requestId);
@@ -95,7 +111,7 @@
95111
let done = false;
96112
let mustReload = false;
97113
let runAndFlush = async () => {
98-
let scriptsRan = await executeAll(scripts, request);
114+
let scriptsRan = await executeAll(request);
99115
if (mustCheckFeed && !scriptsRan) {
100116
mustReload = true;
101117
debug(`Marking as "must reload"`, tabId, url);
@@ -120,6 +136,7 @@
120136
first = false;
121137
}
122138
if (buffer) {
139+
debug("buffering", url);
123140
buffer.push(event.data);
124141
return;
125142
}

0 commit comments

Comments
 (0)