blob: ed18aae84343d891915b3da7694d68460a5b4cf8 [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';
9
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010010// #!if browser_target == 'chromium_mv3'
11// XMLHttpRequest is not present in service workers (MV3) and is required by the
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020012// grpc-web package. Importing a shim to work around this.
13// https://github.com/grpc/grpc-web/issues/1134
14self.XMLHttpRequest = XMLHttpRequest;
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010015// #!endif
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020016
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010017actionApi.onClicked.addListener(() => {
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020018 chrome.runtime.openOptionsPage();
19});
20
21const killSwitchMechanism = new KillSwitchMechanism();
22
23chrome.alarms.create('updateKillSwitchStatus', {
24 periodInMinutes: PRODUCTION ? 30 : 1,
25});
26
27chrome.alarms.onAlarm.addListener(alarm => {
28 if (alarm.name === 'updateKillSwitchStatus')
29 killSwitchMechanism.updateKillSwitchStatus();
30});
31
32// When the profile is first started, update the kill switch status.
33chrome.runtime.onStartup.addListener(() => {
34 killSwitchMechanism.updateKillSwitchStatus();
35});
36
37// When the extension is first installed or gets updated, set new options to
38// their default value and update the kill switch status.
avm99963bbc88c62020-12-25 03:44:41 +010039chrome.runtime.onInstalled.addListener(details => {
40 if (details.reason == 'install' || details.reason == 'update') {
41 chrome.storage.sync.get(null, options => {
avm99963bf8eece2021-04-22 00:27:03 +020042 cleanUpOptions(options, false);
avm99963bbc88c62020-12-25 03:44:41 +010043 });
avm99963bbc88c62020-12-25 03:44:41 +010044
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +020045 killSwitchMechanism.updateKillSwitchStatus();
46 }
avm99963bbc88c62020-12-25 03:44:41 +010047});
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +010048
49// Clean up optional permissions and check that none are missing for enabled
50// features as soon as the extension starts and when the options change.
51cleanUpOptPermissions();
52
53chrome.storage.sync.onChanged.addListener(() => {
54 cleanUpOptPermissions();
55});
56
57chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
58 if (sender.id !== chrome.runtime.id)
59 return console.warn(
60 'An unknown sender (' + sender.id +
61 ') sent a message to the extension: ',
62 msg);
63
64 console.assert(msg.message);
65 switch (msg.message) {
66 case 'runDisableItemsWithMissingPermissions':
67 console.assert(
68 msg.options?.items && msg.options?.permissionChecksFeatures);
69 disableItemsWithMissingPermissions(
70 msg.options?.items, msg.options?.permissionChecksFeatures)
71 .then(items => sendResponse({status: 'resolved', items}))
72 .catch(error => sendResponse({status: 'rejected', error}));
73 break;
74
75 default:
76 console.warn('Unknown message "' + msg.message + '".');
77 }
78});