blob: 9d22c2934166da5b682835fa228eefa84f45ed3a [file] [log] [blame]
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +01001// #!if browser_target == 'chromium_mv3'
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +02002import XMLHttpRequest from 'sw-xhr';
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +01003// #!endif
avm99963bbc88c62020-12-25 03:44:41 +01004
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +01005import actionApi from './common/actionApi.js';
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +01006import {cleanUpOptPermissions} from './common/optionsPermissions.js';
7import {cleanUpOptions, disableItemsWithMissingPermissions} from './common/optionsUtils.js';
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +02008import KillSwitchMechanism from './killSwitch/index.js';
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +01009import {handleBgOptionChange, handleBgOptionsOnStart} from './options/bgHandler.js';
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020010
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010011// #!if browser_target == 'chromium_mv3'
12// XMLHttpRequest is not present in service workers (MV3) and is required by the
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020013// grpc-web package. Importing a shim to work around this.
14// https://github.com/grpc/grpc-web/issues/1134
15self.XMLHttpRequest = XMLHttpRequest;
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010016// #!endif
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020017
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010018actionApi.onClicked.addListener(() => {
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020019 chrome.runtime.openOptionsPage();
20});
21
22const killSwitchMechanism = new KillSwitchMechanism();
23
24chrome.alarms.create('updateKillSwitchStatus', {
25 periodInMinutes: PRODUCTION ? 30 : 1,
26});
27
28chrome.alarms.onAlarm.addListener(alarm => {
29 if (alarm.name === 'updateKillSwitchStatus')
30 killSwitchMechanism.updateKillSwitchStatus();
31});
32
33// When the profile is first started, update the kill switch status.
34chrome.runtime.onStartup.addListener(() => {
35 killSwitchMechanism.updateKillSwitchStatus();
36});
37
38// When the extension is first installed or gets updated, set new options to
39// their default value and update the kill switch status.
avm99963bbc88c62020-12-25 03:44:41 +010040chrome.runtime.onInstalled.addListener(details => {
41 if (details.reason == 'install' || details.reason == 'update') {
42 chrome.storage.sync.get(null, options => {
avm99963bf8eece2021-04-22 00:27:03 +020043 cleanUpOptions(options, false);
avm99963bbc88c62020-12-25 03:44:41 +010044 });
avm99963bbc88c62020-12-25 03:44:41 +010045
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020046 killSwitchMechanism.updateKillSwitchStatus();
47 }
avm99963bbc88c62020-12-25 03:44:41 +010048});
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +010049
50// Clean up optional permissions and check that none are missing for enabled
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010051// features, and also handle background option changes as soon as the extension
52// starts and when the options change.
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +010053cleanUpOptPermissions();
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010054handleBgOptionsOnStart();
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +010055
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010056chrome.storage.sync.onChanged.addListener(changes => {
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +010057 cleanUpOptPermissions();
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010058
59 for (let [key, {oldValue, newValue}] of Object.entries(changes)) {
60 handleBgOptionChange(key);
61 }
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +010062});
63
64chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
65 if (sender.id !== chrome.runtime.id)
66 return console.warn(
67 'An unknown sender (' + sender.id +
68 ') sent a message to the extension: ',
69 msg);
70
71 console.assert(msg.message);
72 switch (msg.message) {
73 case 'runDisableItemsWithMissingPermissions':
74 console.assert(
75 msg.options?.items && msg.options?.permissionChecksFeatures);
76 disableItemsWithMissingPermissions(
77 msg.options?.items, msg.options?.permissionChecksFeatures)
78 .then(items => sendResponse({status: 'resolved', items}))
79 .catch(error => sendResponse({status: 'rejected', error}));
80 break;
81
82 default:
83 console.warn('Unknown message "' + msg.message + '".');
84 }
85});