-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbackground.js
68 lines (57 loc) · 1.75 KB
/
background.js
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
let enabled = true;
let blockedDomains = [];
const generateRuleId = (domain) => {
const encoder = new TextEncoder();
const data = encoder.encode(domain);
let hash = 0;
for (const byte of data) {
hash = (hash << 5) - hash + byte;
hash |= 0; // Ensure 32-bit integer
}
return Math.abs(hash % 2147483647);
};
const loadState = async () => {
const result = await chrome.storage.local.get(['enabled', 'blockedDomains']);
enabled = result.enabled ?? true;
blockedDomains = result.blockedDomains ?? [];
};
const updateRules = async () => {
await loadState();
const currentRules = await chrome.declarativeNetRequest.getDynamicRules();
console.log('Current Rule IDs:', currentRules.map(r => r.id));
if (enabled) {
const newRules = blockedDomains.map(domain => ({
id: generateRuleId(domain),
priority: 1,
action: { type: 'block' },
condition: {
urlFilter: `||${domain}`,
resourceTypes: ['main_frame', 'sub_frame', 'script', 'xmlhttprequest', 'media', 'websocket', 'other']
}
}));
console.log('New Rule IDs:', newRules.map(r => r.id));
await chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: currentRules.map(rule => rule.id),
addRules: newRules
});
} else {
await chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: currentRules.map(rule => rule.id),
addRules: []
});
}
};
// Listeners
chrome.storage.onChanged.addListener(async (changes) => {
if (changes.enabled || changes.blockedDomains) {
await loadState();
await updateRules();
}
});
chrome.runtime.onMessage.addListener((request) => {
if (request.action === 'forceUpdate') updateRules();
return true;
});
// Initialization
loadState();
updateRules();