123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /* 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/. */
- "use strict";
- const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
- const PROVIDER_PREF_BRANCH = "browser.newtabpage.activity-stream.asrouter.providers.";
- const DEVTOOLS_PREF = "browser.newtabpage.activity-stream.asrouter.devtoolsEnabled";
- const FXA_USERNAME_PREF = "services.sync.username";
- const DEFAULT_STATE = {
- _initialized: false,
- _providers: null,
- _providerPrefBranch: PROVIDER_PREF_BRANCH,
- _devtoolsEnabled: null,
- _devtoolsPref: DEVTOOLS_PREF,
- };
- const USER_PREFERENCES = {
- snippets: "browser.newtabpage.activity-stream.feeds.snippets",
- cfrAddons: "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons",
- cfrFeatures: "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features",
- };
- // Preferences that influence targeting attributes. When these change we need
- // to re-evaluate if the message targeting still matches
- const TARGETING_PREFERENCES = [FXA_USERNAME_PREF];
- const TEST_PROVIDERS = [{
- id: "snippets_local_testing",
- type: "local",
- localProvider: "SnippetsTestMessageProvider",
- enabled: true,
- }, {
- id: "panel_local_testing",
- type: "local",
- localProvider: "PanelTestProvider",
- enabled: true,
- }];
- class _ASRouterPreferences {
- constructor() {
- Object.assign(this, DEFAULT_STATE);
- this._callbacks = new Set();
- }
- _getProviderConfig() {
- const prefList = Services.prefs.getChildList(this._providerPrefBranch);
- return prefList.reduce((filtered, pref) => {
- let value;
- try {
- value = JSON.parse(Services.prefs.getStringPref(pref, ""));
- } catch (e) {
- Cu.reportError(`Could not parse ASRouter preference. Try resetting ${pref} in about:config.`);
- }
- if (value) {
- filtered.push(value);
- }
- return filtered;
- }, []);
- }
- get providers() {
- if (!this._initialized || this._providers === null) {
- const config = this._getProviderConfig();
- const providers = config.map(provider => Object.freeze(provider));
- if (this.devtoolsEnabled) {
- providers.unshift(...TEST_PROVIDERS);
- }
- this._providers = Object.freeze(providers);
- }
- return this._providers;
- }
- enableOrDisableProvider(id, value) {
- const providers = this._getProviderConfig();
- const config = providers.find(p => p.id === id);
- if (!config) {
- Cu.reportError(`Cannot set enabled state for '${id}' because the pref ${this._providerPrefBranch}${id} does not exist or is not correctly formatted.`);
- return;
- }
- Services.prefs.setStringPref(this._providerPrefBranch + id, JSON.stringify({...config, enabled: value}));
- }
- resetProviderPref() {
- for (const pref of Services.prefs.getChildList(this._providerPrefBranch)) {
- Services.prefs.clearUserPref(pref);
- }
- for (const id of Object.keys(USER_PREFERENCES)) {
- Services.prefs.clearUserPref(USER_PREFERENCES[id]);
- }
- }
- get devtoolsEnabled() {
- if (!this._initialized || this._devtoolsEnabled === null) {
- this._devtoolsEnabled = Services.prefs.getBoolPref(this._devtoolsPref, false);
- }
- return this._devtoolsEnabled;
- }
- observe(aSubject, aTopic, aPrefName) {
- if (aPrefName && aPrefName.startsWith(this._providerPrefBranch)) {
- this._providers = null;
- } else if (aPrefName === this._devtoolsPref) {
- this._providers = null;
- this._devtoolsEnabled = null;
- }
- this._callbacks.forEach(cb => cb(aPrefName));
- }
- getUserPreference(providerId) {
- if (!USER_PREFERENCES[providerId]) {
- return null;
- }
- return Services.prefs.getBoolPref(USER_PREFERENCES[providerId], true);
- }
- getAllUserPreferences() {
- const values = {};
- for (const id of Object.keys(USER_PREFERENCES)) {
- values[id] = this.getUserPreference(id);
- }
- return values;
- }
- setUserPreference(providerId, value) {
- if (!USER_PREFERENCES[providerId]) {
- return;
- }
- Services.prefs.setBoolPref(USER_PREFERENCES[providerId], value);
- }
- addListener(callback) {
- this._callbacks.add(callback);
- }
- removeListener(callback) {
- this._callbacks.delete(callback);
- }
- init() {
- if (this._initialized) {
- return;
- }
- Services.prefs.addObserver(this._providerPrefBranch, this);
- Services.prefs.addObserver(this._devtoolsPref, this);
- for (const id of Object.keys(USER_PREFERENCES)) {
- Services.prefs.addObserver(USER_PREFERENCES[id], this);
- }
- for (const targetingPref of TARGETING_PREFERENCES) {
- Services.prefs.addObserver(targetingPref, this);
- }
- this._initialized = true;
- }
- uninit() {
- if (this._initialized) {
- Services.prefs.removeObserver(this._providerPrefBranch, this);
- Services.prefs.removeObserver(this._devtoolsPref, this);
- for (const id of Object.keys(USER_PREFERENCES)) {
- Services.prefs.removeObserver(USER_PREFERENCES[id], this);
- }
- for (const targetingPref of TARGETING_PREFERENCES) {
- Services.prefs.removeObserver(targetingPref, this);
- }
- }
- Object.assign(this, DEFAULT_STATE);
- this._callbacks.clear();
- }
- }
- this._ASRouterPreferences = _ASRouterPreferences;
- this.ASRouterPreferences = new _ASRouterPreferences();
- this.TEST_PROVIDERS = TEST_PROVIDERS;
- this.TARGETING_PREFERENCES = TARGETING_PREFERENCES;
- const EXPORTED_SYMBOLS = ["_ASRouterPreferences", "ASRouterPreferences", "TEST_PROVIDERS", "TARGETING_PREFERENCES"];
|