113 lines
3.2 kB
1
/* eslint-disable no-console */
2
/* eslint-disable no-undef */
3
4
const starterUrls = ["web.", "sentry."];
5
let blockLoading = true;
6
let doing = false;
7
let collectedUrls = new Set();
8
9
chrome.webNavigation.onBeforeNavigate.addListener(async (details) => {
10
const url = new URL(details.url);
11
if (!blockLoading && url.hostname.endsWith("discord.com")) {
12
await chrome.declarativeNetRequest.updateEnabledRulesets({
13
enableRulesetIds: ["modifyResponseHeaders", "blockLoading"]
14
});
15
blockLoading = true;
16
collectedUrls.clear();
17
}
18
});
19
20
chrome.webRequest.onBeforeRequest.addListener(
21
async (details) => {
22
if (details.tabId === -1) return;
23
if (starterUrls.some((url) => details.url.includes(url))) {
24
console.log("Adding", details.url);
25
collectedUrls.add(details.url);
26
}
27
28
if (collectedUrls.size === starterUrls.length) {
29
if (doing) return;
30
if (!blockLoading) return;
31
doing = true;
32
const urls = [...collectedUrls];
33
console.log("Doing", urls);
34
35
console.log("Running moonlight script");
36
try {
37
await chrome.scripting.executeScript({
38
target: { tabId: details.tabId },
39
world: "MAIN",
40
files: ["index.js"]
41
});
42
} catch (e) {
43
console.log(e);
44
}
45
46
console.log("Initializing moonlight");
47
try {
48
await chrome.scripting.executeScript({
49
target: { tabId: details.tabId },
50
world: "MAIN",
51
func: async () => {
52
try {
53
await window._moonlightBrowserInit();
54
} catch (e) {
55
console.log(e);
56
}
57
}
58
});
59
} catch (e) {
60
console.log(e);
61
}
62
63
console.log("Updating rulesets");
64
try {
65
blockLoading = false;
66
await chrome.declarativeNetRequest.updateEnabledRulesets({
67
disableRulesetIds: ["blockLoading"],
68
enableRulesetIds: ["modifyResponseHeaders"]
69
});
70
} catch (e) {
71
console.log(e);
72
}
73
74
console.log("Readding scripts");
75
try {
76
await chrome.scripting.executeScript({
77
target: { tabId: details.tabId },
78
world: "MAIN",
79
args: [urls],
80
func: async (urls) => {
81
const scripts = [...document.querySelectorAll("script")].filter(
82
(script) => script.src && urls.some((url) => url.includes(script.src))
83
);
84
85
// backwards
86
urls.reverse();
87
for (const url of urls) {
88
const script = scripts.find((script) => url.includes(script.src));
89
console.log("adding new script", script);
90
91
const newScript = document.createElement("script");
92
for (const { name, value } of script.attributes) {
93
newScript.setAttribute(name, value);
94
}
95
96
script.remove();
97
document.documentElement.appendChild(newScript);
98
}
99
}
100
});
101
} catch (e) {
102
console.log(e);
103
}
104
105
console.log("Done");
106
doing = false;
107
collectedUrls.clear();
108
}
109
},
110
{
111
urls: ["*://*.discord.com/assets/*.js"]
112
}
113
);
114