|
1 | 1 | 'use strict'; |
2 | 2 | { |
3 | 3 | let NULL = new Uint8Array(); |
4 | | - let xmlFeedOrImage = /^(?:(?:application|text)\/(?:(?:r(?:ss|df)|atom)\+)?xml(;|$))|image\//i; |
| 4 | + let DEFAULT_CHARSET = "utf-8"; |
| 5 | + let xmlFeedOrImage = /^(?:(?:application|text)\/(?:(?:r(?:ss|df)|atom)\+)xml(;|$))|image\//i; |
| 6 | + let rawXml = /^(?:application|text)\/xml;/i; |
5 | 7 | let brokenOnLoad = (async () => parseInt(await browser.runtime.getBrowserInfo().version) < 61); |
| 8 | + |
6 | 9 | let pendingRequests = new Map(); |
7 | 10 |
|
8 | 11 | let cleanup = r => { |
|
35 | 38 | var RequestUtil = { |
36 | 39 |
|
37 | 40 | getContentMetaData(request) { |
38 | | - if (request.content) return request.content; |
39 | | - let {responseHeaders} = request; |
40 | | - let content = request.content = {}; |
41 | | - for (let h of responseHeaders) { |
42 | | - if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) { |
43 | | - content[h.name.split("-")[1].trim().toLowerCase()] = h.value; |
44 | | - } |
45 | | - } |
46 | | - return content; |
| 41 | + return request.content || (request.content = new ContentMetaData(request)); |
47 | 42 | }, |
48 | 43 |
|
49 | 44 | async executeOnStart(request, details) { |
|
60 | 55 | } |
61 | 56 |
|
62 | 57 | let content = this.getContentMetaData(request); |
63 | | - debug(request.url, content.type); |
| 58 | + debug(request.url, content.type, content.charset); |
64 | 59 | if (xmlFeedOrImage.test(content.type) && !/\/svg\b/i.test(content.type)) return; |
| 60 | + let disconnect = !(brokenOnLoad && rawXml.test(content.type)); |
65 | 61 | let filter = browser.webRequest.filterResponseData(requestId); |
66 | 62 | let buffer = []; |
67 | 63 |
|
|
73 | 69 | for (let chunk of buffer) { |
74 | 70 | filter.write(chunk); |
75 | 71 | } |
76 | | - filter.disconnect(); |
| 72 | + if (disconnect) filter.disconnect(); |
77 | 73 | buffer = null; |
78 | 74 | } |
79 | 75 | }; |
80 | 76 |
|
81 | 77 | if (brokenOnLoad) { |
82 | 78 | filter.onstart = event => { |
| 79 | + debug(`onstart ${request.url}`); |
83 | 80 | filter.write(NULL); |
84 | 81 | } |
85 | 82 | } |
86 | 83 |
|
87 | | - filter.ondata = event => { |
| 84 | + filter.ondata = event => { |
| 85 | + |
88 | 86 | if (first) { |
89 | 87 | runAndFlush(); |
90 | 88 | first = false; |
|
93 | 91 | buffer.push(event.data); |
94 | 92 | return; |
95 | 93 | } |
| 94 | + |
| 95 | + debug(`ondata ${request.url}`); |
96 | 96 | filter.write(event.data); |
97 | | - filter.disconnect(); |
| 97 | + if (disconnect) filter.disconnect(); |
98 | 98 | }; |
99 | 99 |
|
100 | 100 | } |
|
0 commit comments