|
1 | 1 | 'use strict'; |
2 | 2 | { |
| 3 | + let NULL = new Uint8Array(); |
3 | 4 | let pendingRequests = new Map(); |
| 5 | + |
4 | 6 | let cleanup = r => { |
5 | 7 | pendingRequests.delete(r.requestId); |
6 | 8 | }; |
|
10 | 12 | }; |
11 | 13 | browser.webRequest.onCompleted.addListener(cleanup, filter); |
12 | 14 | 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 | + |
13 | 33 | var RequestUtil = { |
14 | 34 |
|
15 | 35 | getContentMetaData(request) { |
|
25 | 45 | }, |
26 | 46 |
|
27 | 47 | async executeOnStart(request, details) { |
28 | | - let {requestId, tabId, frameId} = request; |
| 48 | + let {requestId, tabId, frameId, statusCode} = request; |
| 49 | + if (statusCode >= 300 && statusCode < 400) return; |
29 | 50 | let scripts = pendingRequests.get(requestId); |
30 | 51 | let scriptKey = JSON.stringify(details); |
31 | 52 | if (!scripts) { |
|
36 | 57 | return; |
37 | 58 | } |
38 | 59 |
|
| 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; |
39 | 63 | let filter = browser.webRequest.filterResponseData(requestId); |
40 | 64 | let buffer = []; |
41 | | - let content = this.getContentMetaData(request); |
| 65 | + |
42 | 66 | 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); |
56 | 69 | if (buffer.length) { |
57 | 70 | debug("Flushing %s buffer chunks", buffer.length); |
58 | 71 | for (let chunk of buffer) { |
|
62 | 75 | buffer = null; |
63 | 76 | } |
64 | 77 | }; |
| 78 | + |
65 | 79 | 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); |
69 | 81 | } |
70 | | - filter.ondata = event => { |
| 82 | + |
| 83 | + filter.ondata = event => { |
71 | 84 | if (first) { |
72 | | - execute(); |
| 85 | + runAndFlush(); |
73 | 86 | first = false; |
74 | 87 | } |
75 | | - |
76 | 88 | if (buffer) { |
77 | 89 | buffer.push(event.data); |
78 | 90 | return; |
79 | 91 | } |
80 | 92 | filter.write(event.data); |
81 | 93 | filter.disconnect(); |
82 | | - } |
| 94 | + }; |
| 95 | + |
83 | 96 | } |
84 | 97 | } |
85 | 98 | } |
0 commit comments