1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/* globals browser, module */
const replaceStringInRequest = (
requestId,
inString,
outString,
inEncoding = "utf-8"
) => {
const filter = browser.webRequest.filterResponseData(requestId);
const decoder = new TextDecoder(inEncoding);
const encoder = new TextEncoder();
const RE = new RegExp(inString, "g");
const carryoverLength = inString.length;
let carryover = "";
filter.ondata = event => {
const replaced = (
carryover + decoder.decode(event.data, { stream: true })
).replace(RE, outString);
filter.write(encoder.encode(replaced.slice(0, -carryoverLength)));
carryover = replaced.slice(-carryoverLength);
};
filter.onstop = event => {
if (carryover.length) {
filter.write(encoder.encode(carryover));
}
filter.close();
};
};
const CUSTOM_FUNCTIONS = {
detectSwipeFix: injection => {
const { urls, types } = injection.data;
const listener = (injection.data.listener = ({ requestId }) => {
replaceStringInRequest(
requestId,
"preventDefault:true",
"preventDefault:false"
);
return {};
});
browser.webRequest.onBeforeRequest.addListener(listener, { urls, types }, [
"blocking",
]);
},
detectSwipeFixDisable: injection => {
const { listener } = injection.data;
browser.webRequest.onBeforeRequest.removeListener(listener);
delete injection.data.listener;
},
noSniffFix: injection => {
const { urls, contentType } = injection.data;
const listener = (injection.data.listener = e => {
e.responseHeaders.push(contentType);
return { responseHeaders: e.responseHeaders };
});
browser.webRequest.onHeadersReceived.addListener(listener, { urls }, [
"blocking",
"responseHeaders",
]);
},
noSniffFixDisable: injection => {
const { listener } = injection.data;
browser.webRequest.onHeadersReceived.removeListener(listener);
delete injection.data.listener;
},
runScriptBeforeRequest: injection => {
const { bug, message, request, script, types } = injection;
const warning = `${message} See https://bugzilla.mozilla.org/show_bug.cgi?id=${bug} for details.`;
const listener = (injection.listener = e => {
const { tabId, frameId } = e;
return browser.tabs
.executeScript(tabId, {
file: script,
frameId,
runAt: "document_start",
})
.then(() => {
browser.tabs.executeScript(tabId, {
code: `console.warn(${JSON.stringify(warning)})`,
runAt: "document_start",
});
})
.catch(_ => {});
});
browser.webRequest.onBeforeRequest.addListener(
listener,
{ urls: request, types: types || ["script"] },
["blocking"]
);
},
runScriptBeforeRequestDisable: injection => {
const { listener } = injection;
browser.webRequest.onBeforeRequest.removeListener(listener);
delete injection.data.listener;
},
};
module.exports = CUSTOM_FUNCTIONS;
|