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);
+}