summaryrefslogtreecommitdiffstats
path: root/toolkit/components/normandy/lib/ShieldPreferences.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/normandy/lib/ShieldPreferences.sys.mjs')
-rw-r--r--toolkit/components/normandy/lib/ShieldPreferences.sys.mjs78
1 files changed, 78 insertions, 0 deletions
diff --git a/toolkit/components/normandy/lib/ShieldPreferences.sys.mjs b/toolkit/components/normandy/lib/ShieldPreferences.sys.mjs
new file mode 100644
index 0000000000..730febe975
--- /dev/null
+++ b/toolkit/components/normandy/lib/ShieldPreferences.sys.mjs
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ BranchedAddonStudyAction:
+ "resource://normandy/actions/BranchedAddonStudyAction.sys.mjs",
+ AddonStudies: "resource://normandy/lib/AddonStudies.sys.mjs",
+ CleanupManager: "resource://normandy/lib/CleanupManager.sys.mjs",
+ PreferenceExperiments:
+ "resource://normandy/lib/PreferenceExperiments.sys.mjs",
+});
+
+const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed"; // from modules/libpref/nsIPrefBranch.idl
+const PREF_OPT_OUT_STUDIES_ENABLED = "app.shield.optoutstudies.enabled";
+
+/**
+ * Handles Shield-specific preferences, including their UI.
+ */
+export var ShieldPreferences = {
+ init() {
+ // Watch for changes to the Opt-out pref
+ Services.prefs.addObserver(PREF_OPT_OUT_STUDIES_ENABLED, this);
+
+ lazy.CleanupManager.addCleanupHandler(() => {
+ Services.prefs.removeObserver(PREF_OPT_OUT_STUDIES_ENABLED, this);
+ });
+ },
+
+ observe(subject, topic, data) {
+ switch (topic) {
+ case NS_PREFBRANCH_PREFCHANGE_TOPIC_ID:
+ this.observePrefChange(data);
+ break;
+ }
+ },
+
+ async observePrefChange(prefName) {
+ let prefValue;
+ switch (prefName) {
+ // If the opt-out pref changes to be false, disable all current studies.
+ case PREF_OPT_OUT_STUDIES_ENABLED: {
+ prefValue = Services.prefs.getBoolPref(PREF_OPT_OUT_STUDIES_ENABLED);
+ if (!prefValue) {
+ const action = new lazy.BranchedAddonStudyAction();
+ const studyPromises = (await lazy.AddonStudies.getAll()).map(
+ study => {
+ if (!study.active) {
+ return null;
+ }
+ return action.unenroll(study.recipeId, "general-opt-out");
+ }
+ );
+
+ const experimentPromises = (
+ await lazy.PreferenceExperiments.getAll()
+ ).map(experiment => {
+ if (experiment.expired) {
+ return null;
+ }
+ return lazy.PreferenceExperiments.stop(experiment.slug, {
+ reason: "general-opt-out",
+ caller: "observePrefChange::general-opt-out",
+ });
+ });
+
+ const allPromises = studyPromises
+ .concat(experimentPromises)
+ .map(p => p && p.catch(err => console.error(err)));
+ await Promise.all(allPromises);
+ }
+ break;
+ }
+ }
+ },
+};