130 lines
3.7 KiB
TypeScript
130 lines
3.7 KiB
TypeScript
import { sendToContentScript } from '@plasmohq/messaging';
|
|
|
|
import {
|
|
DEFAULT_DOMAIN_CONFIG,
|
|
DEFAULT_EXTENSION_DATA,
|
|
EXTENSION_MENU_ITEM_ID,
|
|
REPORT_MENU_ITEM_ID,
|
|
SETTINGS_MENU_ITEM_ID,
|
|
} from '~utils/constants';
|
|
import { formatDomainFromURL, validateSupport } from '~utils/domain';
|
|
import { noop, suppressLastError } from '~utils/error';
|
|
import { storage } from '~utils/storage';
|
|
import type { DomainConfig, ExtensionData } from '~utils/types';
|
|
|
|
import databaseRefreshHandler from './messages/database/refresh';
|
|
import extensionUpdateAvailableHandler from './messages/extension/updateAvailable';
|
|
|
|
chrome.contextMenus.onClicked.addListener((info) => {
|
|
switch (info.menuItemId) {
|
|
case REPORT_MENU_ITEM_ID:
|
|
chrome.action.openPopup();
|
|
break;
|
|
case SETTINGS_MENU_ITEM_ID:
|
|
chrome.runtime.openOptionsPage();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
});
|
|
|
|
chrome.runtime.onInstalled.addListener(async () => {
|
|
chrome.contextMenus.removeAll(() => {
|
|
const documentUrlPatterns = chrome.runtime.getManifest().content_scripts?.[0].matches;
|
|
|
|
chrome.contextMenus.create(
|
|
{
|
|
contexts: ['all'],
|
|
documentUrlPatterns,
|
|
id: EXTENSION_MENU_ITEM_ID,
|
|
title: 'Cookie Dialog Monster',
|
|
},
|
|
suppressLastError
|
|
);
|
|
chrome.contextMenus.create(
|
|
{
|
|
contexts: ['all'],
|
|
documentUrlPatterns,
|
|
id: SETTINGS_MENU_ITEM_ID,
|
|
parentId: EXTENSION_MENU_ITEM_ID,
|
|
title: chrome.i18n.getMessage('contextMenu_settingsOption'),
|
|
},
|
|
suppressLastError
|
|
);
|
|
chrome.contextMenus.create(
|
|
{
|
|
contexts: ['all'],
|
|
documentUrlPatterns,
|
|
id: REPORT_MENU_ITEM_ID,
|
|
parentId: EXTENSION_MENU_ITEM_ID,
|
|
title: chrome.i18n.getMessage('contextMenu_reportOption'),
|
|
},
|
|
suppressLastError
|
|
);
|
|
});
|
|
|
|
await storage.remove('updateAvailable');
|
|
await databaseRefreshHandler({ name: 'database/refresh' }, { send: noop });
|
|
});
|
|
|
|
chrome.runtime.onStartup.addListener(async () => {
|
|
await storage.remove('updateAvailable');
|
|
await databaseRefreshHandler({ name: 'database/refresh' }, { send: noop });
|
|
await extensionUpdateAvailableHandler({ name: 'extension/updateAvailable' }, { send: noop });
|
|
});
|
|
|
|
/**
|
|
* @description Listen to the moment before a request is made to apply the rules
|
|
* @returns {Promise<void>}
|
|
*/
|
|
chrome.webRequest.onBeforeRequest.addListener(
|
|
(details) => {
|
|
const { tabId, type, url } = details;
|
|
const location = new URL(url);
|
|
const domain = formatDomainFromURL(location);
|
|
|
|
if (tabId > -1 && type === 'main_frame') {
|
|
storage.get<ExtensionData>('data').then(({ exclusions, rules } = DEFAULT_EXTENSION_DATA) => {
|
|
if (!validateSupport(location.hostname, exclusions.domains)) {
|
|
return;
|
|
}
|
|
|
|
storage.get<DomainConfig>(domain).then((config = DEFAULT_DOMAIN_CONFIG) => {
|
|
if (rules.length) {
|
|
const rulesWithTabId = rules.map((rule) => ({
|
|
...rule,
|
|
condition: { ...rule.condition, tabIds: [tabId] },
|
|
}));
|
|
|
|
chrome.declarativeNetRequest.updateSessionRules({
|
|
addRules: config.on ? rulesWithTabId : undefined,
|
|
removeRuleIds: rules.map((rule) => rule.id),
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
},
|
|
{ urls: ['<all_urls>'] }
|
|
);
|
|
|
|
/**
|
|
* @description Listen for errors on network requests
|
|
*/
|
|
chrome.webRequest.onErrorOccurred.addListener(
|
|
async (details) => {
|
|
const { error, tabId } = details;
|
|
|
|
if (error === 'net::ERR_BLOCKED_BY_CLIENT' && tabId > -1) {
|
|
await sendToContentScript({
|
|
body: {
|
|
value: error,
|
|
},
|
|
name: 'INCREASE_LOG_COUNT',
|
|
tabId,
|
|
});
|
|
}
|
|
},
|
|
{ urls: ['<all_urls>'] }
|
|
);
|