Add "block drafts" feature
Design doc:
https://docs.google.com/document/d/16AX1tKa1CGSWwZtbW42h1uHy8SEPuv1ZjT_oHxc0UUI/edit
Fixed: twpowertools:84
Change-Id: Ibb172113774c5e2cab14e3d87a178bafed85df0b
diff --git a/src/options/bgHandler.js b/src/options/bgHandler.js
new file mode 100644
index 0000000..a9d80ab
--- /dev/null
+++ b/src/options/bgHandler.js
@@ -0,0 +1,53 @@
+// Most options are dynamic, which means whenever they are enabled or disabled,
+// the effect is immediate. However, some features aren't controlled directly in
+// content scripts or injected scripts but instead in the background
+// script/service worker.
+//
+// An example is the "blockdrafts" feature, which when enabled should enable the
+// static ruleset blocking *DraftMessages requests.
+
+import {isOptionEnabled} from '../common/optionsUtils.js';
+
+// List of features controled in the background:
+export var bgFeatures = [
+ 'blockdrafts',
+];
+
+const blockDraftsRuleset = 'blockDrafts';
+
+export function handleBgOptionChange(feature) {
+ isOptionEnabled(feature)
+ .then(enabled => {
+ switch (feature) {
+ // #!if ['chromium', 'chromium_mv3'].includes(browser_target)
+ case 'blockdrafts':
+ chrome.declarativeNetRequest.getEnabledRulesets(rulesets => {
+ if (rulesets === undefined) {
+ throw new Error(
+ chrome.runtime.lastError.message ??
+ 'Unknown error in chrome.declarativeNetRequest.getEnabledRulesets()');
+ }
+
+ let isRulesetEnabled = rulesets.includes(blockDraftsRuleset);
+ if (!isRulesetEnabled && enabled)
+ chrome.declarativeNetRequest.updateEnabledRulesets(
+ {enableRulesetIds: [blockDraftsRuleset]});
+ if (isRulesetEnabled && !enabled)
+ chrome.declarativeNetRequest.updateEnabledRulesets(
+ {disableRulesetIds: [blockDraftsRuleset]});
+ });
+ break;
+ // #!endif
+ }
+ })
+ .catch(err => {
+ console.error(
+ 'handleBgOptionChange: error while handling feature "' + feature +
+ '": ',
+ err);
+ });
+}
+
+export function handleBgOptionsOnStart() {
+ for (let feature of bgFeatures) handleBgOptionChange(feature);
+}