|
16 | 16 | reloadingTabs.delete(key); |
17 | 17 | } |
18 | 18 | }; |
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); |
30 | 25 | let count = 0; |
31 | 26 | for (let details of scripts.values()) { |
32 | 27 | details = Object.assign({ |
|
44 | 39 | } |
45 | 40 | return count; |
46 | 41 | }; |
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 | + |
48 | 56 | var RequestUtil = { |
49 | 57 |
|
50 | 58 | getResponseMetaData(request) { |
|
66 | 74 |
|
67 | 75 | let response = this.getResponseMetaData(request); |
68 | 76 | 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); |
71 | 80 | return; |
72 | 81 | } |
73 | | - debug("Injecting script on start in %s (%o)", url, response); |
| 82 | + |
| 83 | + debug("Injecting script on start in %s (%o).", url, response); |
74 | 84 |
|
75 | 85 | let scripts = pendingRequests.get(requestId); |
76 | 86 | let scriptKey = JSON.stringify(details); |
|
81 | 91 | scripts.set(scriptKey, details); |
82 | 92 | return; |
83 | 93 | } |
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 | + |
86 | 102 | if (typeof brokenXMLOnLoad === "undefined") { |
87 | 103 | brokenXMLOnLoad = await (async () => parseInt((await browser.runtime.getBrowserInfo()).version) < 61)(); |
88 | 104 | } |
89 | | - |
| 105 | + |
90 | 106 | let mustCheckFeed = brokenXMLOnLoad && frameId === 0 && rawXml.test(contentType); |
91 | 107 | debug("mustCheckFeed = %s, brokenXMLOnLoad = %s", mustCheckFeed, brokenXMLOnLoad); |
92 | 108 | let filter = browser.webRequest.filterResponseData(requestId); |
|
95 | 111 | let done = false; |
96 | 112 | let mustReload = false; |
97 | 113 | let runAndFlush = async () => { |
98 | | - let scriptsRan = await executeAll(scripts, request); |
| 114 | + let scriptsRan = await executeAll(request); |
99 | 115 | if (mustCheckFeed && !scriptsRan) { |
100 | 116 | mustReload = true; |
101 | 117 | debug(`Marking as "must reload"`, tabId, url); |
|
120 | 136 | first = false; |
121 | 137 | } |
122 | 138 | if (buffer) { |
| 139 | + debug("buffering", url); |
123 | 140 | buffer.push(event.data); |
124 | 141 | return; |
125 | 142 | } |
|
0 commit comments