Skip to content

Commit 093b9d7

Browse files
committed
Work-around for onload not being fired on XML documents in Tor Browser/ESR60.
1 parent 799d99b commit 093b9d7

2 files changed

Lines changed: 41 additions & 27 deletions

File tree

src/bg/RequestGuard.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,11 @@ var RequestGuard = (() => {
355355
async onHeadersReceived(request) {
356356
// called for main_frame, sub_frame and object
357357
debug("onHeadersReceived", request);
358+
let {url, documentUrl, statusCode, tabId, responseHeaders} = request;
359+
if (statusCode >= 300 && statusCode < 400) return;
358360

359361
try {
360362
let header, blocker;
361-
let responseHeaders = request.responseHeaders;
362363
let content = {}
363364
for (let h of responseHeaders) {
364365
if (CSP.isMine(h)) {
@@ -370,11 +371,11 @@ var RequestGuard = (() => {
370371
}
371372

372373

373-
if (ns.isEnforced(request.tabId)) {
374+
if (ns.isEnforced(tabId)) {
374375
let policy = ns.policy;
375-
let perms = policy.get(request.url, request.documentUrl).perms;
376+
let perms = policy.get(url, documentUrl).perms;
376377
if (policy.autoAllowTop && request.frameId === 0 && perms === policy.DEFAULT) {
377-
policy.set(Sites.optimalKey(request.url), perms = policy.TRUSTED.tempTwin);
378+
policy.set(Sites.optimalKey(url), perms = policy.TRUSTED.tempTwin);
378379
}
379380

380381
let {capabilities} = perms;
@@ -422,7 +423,7 @@ var RequestGuard = (() => {
422423
}
423424
}
424425

425-
debug(`CSP blocker on %s:`, request.url, blocker);
426+
debug(`CSP blocker on %s:`, url, blocker);
426427
if (blocker) {
427428
if (header) {
428429
header.value = CSP.inject(header.value, blocker);

src/bg/RequestUtil.js

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22
{
3+
let NULL = new Uint8Array();
34
let pendingRequests = new Map();
5+
46
let cleanup = r => {
57
pendingRequests.delete(r.requestId);
68
};
@@ -10,6 +12,24 @@
1012
};
1113
browser.webRequest.onCompleted.addListener(cleanup, filter);
1214
browser.webRequest.onErrorOccurred.addListener(cleanup, filter);
15+
16+
let executeAll = async (scripts, where) => {
17+
let {url, tabId, frameId} = where;
18+
for (let details of scripts.values()) {
19+
details = Object.assign({
20+
runAt: "document_start",
21+
matchAboutBlank: true,
22+
frameId,
23+
}, details);
24+
try {
25+
await browser.tabs.executeScript(tabId, details);
26+
debug("Execute on start OK", url, details);
27+
} catch (e) {
28+
error(e, "Execute on start failed", url, details);
29+
}
30+
}
31+
};
32+
1333
var RequestUtil = {
1434

1535
getContentMetaData(request) {
@@ -25,7 +45,8 @@
2545
},
2646

2747
async executeOnStart(request, details) {
28-
let {requestId, tabId, frameId} = request;
48+
let {requestId, tabId, frameId, statusCode} = request;
49+
if (statusCode >= 300 && statusCode < 400) return;
2950
let scripts = pendingRequests.get(requestId);
3051
let scriptKey = JSON.stringify(details);
3152
if (!scripts) {
@@ -36,23 +57,15 @@
3657
return;
3758
}
3859

60+
let content = this.getContentMetaData(request);
61+
debug(request.url, content.type);
62+
if (/\bxml\b/.test(content.type) && !/\bhtml\b/.test(content.type)) return;
3963
let filter = browser.webRequest.filterResponseData(requestId);
4064
let buffer = [];
41-
let content = this.getContentMetaData(request);
65+
4266
let first = true;
43-
let execute = async () => {
44-
for (let details of scripts.values()) {
45-
details = Object.assign({
46-
runAt: "document_start",
47-
frameId,
48-
}, details);
49-
try {
50-
await browser.tabs.executeScript(tabId, details);
51-
debug("Execute on start OK", request.url, details);
52-
} catch (e) {
53-
error(e, "Execute on start failed", request.url, details);
54-
}
55-
}
67+
let runAndFlush = async () => {
68+
await executeAll(scripts, request);
5669
if (buffer.length) {
5770
debug("Flushing %s buffer chunks", buffer.length);
5871
for (let chunk of buffer) {
@@ -62,24 +75,24 @@
6275
buffer = null;
6376
}
6477
};
78+
6579
filter.onstart = event => {
66-
if (/ml$/i.test(content.type)) {
67-
filter.write(new Uint8Array()); // work-around for https://bugzilla.mozilla.org/show_bug.cgi?id=1410755
68-
}
80+
filter.write(NULL);
6981
}
70-
filter.ondata = event => {
82+
83+
filter.ondata = event => {
7184
if (first) {
72-
execute();
85+
runAndFlush();
7386
first = false;
7487
}
75-
7688
if (buffer) {
7789
buffer.push(event.data);
7890
return;
7991
}
8092
filter.write(event.data);
8193
filter.disconnect();
82-
}
94+
};
95+
8396
}
8497
}
8598
}

0 commit comments

Comments
 (0)