mirror of
https://github.com/yeongpin/cursor-free-vip.git
synced 2025-04-29 09:35:50 +00:00
130 lines
2.8 KiB
JavaScript
130 lines
2.8 KiB
JavaScript
/**
|
|
* All the actual functionality of the extension; loads as part of the background page.
|
|
*
|
|
* Active ingredient is enable(), which sets up the webRequest callbacks.
|
|
*
|
|
* */
|
|
|
|
let blockingEnabled = false;
|
|
let allFilters = null;
|
|
let webRTCPrivacy = null;
|
|
|
|
function setFilters(newFilters) {
|
|
allFilters = newFilters;
|
|
chrome.storage.local.set({"filters": newFilters});
|
|
if (blockingEnabled) {
|
|
refreshFilters();
|
|
}
|
|
}
|
|
|
|
// Convert URL patterns to declarativeNetRequest rule format
|
|
function createRules(filters) {
|
|
return filters.map((filter, index) => ({
|
|
id: index + 1,
|
|
priority: 1,
|
|
action: {
|
|
type: "block"
|
|
},
|
|
condition: {
|
|
urlFilter: filter.replace("*://", "*"),
|
|
resourceTypes: [
|
|
"main_frame", "sub_frame", "stylesheet", "script", "image",
|
|
"font", "object", "xmlhttprequest", "ping", "media", "websocket"
|
|
]
|
|
}
|
|
}));
|
|
}
|
|
|
|
async function enable(icon = true) {
|
|
if (blockingEnabled) return;
|
|
|
|
if (allFilters && allFilters.length > 0) {
|
|
const rules = createRules(allFilters);
|
|
await chrome.declarativeNetRequest.updateDynamicRules({
|
|
removeRuleIds: rules.map(rule => rule.id),
|
|
addRules: rules
|
|
});
|
|
}
|
|
|
|
blockingEnabled = true;
|
|
if (icon) {
|
|
chrome.action.setIcon({
|
|
path: {
|
|
"16": "enabled16.png",
|
|
"48": "enabled48.png"
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
async function disable(icon = true) {
|
|
if (!blockingEnabled) return;
|
|
|
|
const rules = await chrome.declarativeNetRequest.getDynamicRules();
|
|
await chrome.declarativeNetRequest.updateDynamicRules({
|
|
removeRuleIds: rules.map(rule => rule.id),
|
|
addRules: []
|
|
});
|
|
|
|
blockingEnabled = false;
|
|
if (icon) {
|
|
chrome.action.setIcon({
|
|
path: {
|
|
"16": "disabled.png",
|
|
"32": "disabled.png"
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
async function refreshFilters() {
|
|
await disable(false);
|
|
await enable(true);
|
|
}
|
|
|
|
async function toggleEnabled() {
|
|
if (blockingEnabled) {
|
|
await disable();
|
|
} else {
|
|
await enable();
|
|
}
|
|
}
|
|
|
|
function setWebRTCPrivacy(flag, store = true) {
|
|
webRTCPrivacy = flag;
|
|
const privacySetting = flag ? "default_public_interface_only" : "default";
|
|
chrome.privacy.network.webRTCIPHandlingPolicy.set({value: privacySetting});
|
|
if (store) {
|
|
chrome.storage.local.set({"webrtc_privacy": flag});
|
|
}
|
|
}
|
|
|
|
// Initialization
|
|
chrome.storage.local.get("filters",
|
|
function(result) {
|
|
if (result["filters"] == undefined) {
|
|
console.log("Initializing filters to defaults.");
|
|
setFilters(defaultFilters);
|
|
} else {
|
|
setFilters(result["filters"]);
|
|
allFilters = result["filters"];
|
|
}
|
|
|
|
// toggle blocking on-off via the extension icon
|
|
chrome.action.onClicked.addListener(toggleEnabled);
|
|
// initialize blocking
|
|
enable();
|
|
}
|
|
);
|
|
|
|
chrome.storage.local.get("webrtc_privacy",
|
|
function(result) {
|
|
if (result["webrtc_privacy"] == undefined) {
|
|
console.log("Initializing WebRTC privacy to default.");
|
|
setWebRTCPrivacy(false, true);
|
|
} else {
|
|
setWebRTCPrivacy(result["webrtc_privacy"], false);
|
|
}
|
|
}
|
|
);
|