diff options
Diffstat (limited to 'toolkit/components/extensions/parent/ext-browserSettings.js')
-rw-r--r-- | toolkit/components/extensions/parent/ext-browserSettings.js | 463 |
1 files changed, 463 insertions, 0 deletions
diff --git a/toolkit/components/extensions/parent/ext-browserSettings.js b/toolkit/components/extensions/parent/ext-browserSettings.js new file mode 100644 index 0000000000..946f08a93d --- /dev/null +++ b/toolkit/components/extensions/parent/ext-browserSettings.js @@ -0,0 +1,463 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +/* 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"; + +ChromeUtils.defineModuleGetter( + this, + "AppConstants", + "resource://gre/modules/AppConstants.jsm" +); +ChromeUtils.defineModuleGetter( + this, + "Services", + "resource://gre/modules/Services.jsm" +); +ChromeUtils.defineModuleGetter( + this, + "AboutNewTab", + "resource:///modules/AboutNewTab.jsm" +); + +var { ExtensionPreferencesManager } = ChromeUtils.import( + "resource://gre/modules/ExtensionPreferencesManager.jsm" +); + +var { ExtensionError } = ExtensionUtils; +var { getSettingsAPI } = ExtensionPreferencesManager; + +const HOMEPAGE_OVERRIDE_SETTING = "homepage_override"; +const HOMEPAGE_URL_PREF = "browser.startup.homepage"; +const URL_STORE_TYPE = "url_overrides"; +const NEW_TAB_OVERRIDE_SETTING = "newTabURL"; + +const PERM_DENY_ACTION = Services.perms.DENY_ACTION; + +// Add settings objects for supported APIs to the preferences manager. +ExtensionPreferencesManager.addSetting("allowPopupsForUserEvents", { + permission: "browserSettings", + prefNames: ["dom.popup_allowed_events"], + + setCallback(value) { + let returnObj = {}; + // If the value is true, then reset the pref, otherwise set it to "". + returnObj[this.prefNames[0]] = value ? undefined : ""; + return returnObj; + }, +}); + +ExtensionPreferencesManager.addSetting("cacheEnabled", { + permission: "browserSettings", + prefNames: ["browser.cache.disk.enable", "browser.cache.memory.enable"], + + setCallback(value) { + let returnObj = {}; + for (let pref of this.prefNames) { + returnObj[pref] = value; + } + return returnObj; + }, +}); + +ExtensionPreferencesManager.addSetting("closeTabsByDoubleClick", { + permission: "browserSettings", + prefNames: ["browser.tabs.closeTabByDblclick"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("contextMenuShowEvent", { + permission: "browserSettings", + prefNames: ["ui.context_menus.after_mouseup"], + + setCallback(value) { + return { [this.prefNames[0]]: value === "mouseup" }; + }, +}); + +ExtensionPreferencesManager.addSetting("ftpProtocolEnabled", { + permission: "browserSettings", + prefNames: ["network.ftp.enabled"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("imageAnimationBehavior", { + permission: "browserSettings", + prefNames: ["image.animation_mode"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("newTabPosition", { + permission: "browserSettings", + prefNames: [ + "browser.tabs.insertRelatedAfterCurrent", + "browser.tabs.insertAfterCurrent", + ], + + setCallback(value) { + return { + "browser.tabs.insertAfterCurrent": value === "afterCurrent", + "browser.tabs.insertRelatedAfterCurrent": value === "relatedAfterCurrent", + }; + }, +}); + +ExtensionPreferencesManager.addSetting("openBookmarksInNewTabs", { + permission: "browserSettings", + prefNames: ["browser.tabs.loadBookmarksInTabs"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("openSearchResultsInNewTabs", { + permission: "browserSettings", + prefNames: ["browser.search.openintab"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("openUrlbarResultsInNewTabs", { + permission: "browserSettings", + prefNames: ["browser.urlbar.openintab"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("webNotificationsDisabled", { + permission: "browserSettings", + prefNames: ["permissions.default.desktop-notification"], + + setCallback(value) { + return { [this.prefNames[0]]: value ? PERM_DENY_ACTION : undefined }; + }, +}); + +ExtensionPreferencesManager.addSetting("overrideDocumentColors", { + permission: "browserSettings", + prefNames: ["browser.display.document_color_use"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("useDocumentFonts", { + permission: "browserSettings", + prefNames: ["browser.display.use_document_fonts"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("zoomFullPage", { + permission: "browserSettings", + prefNames: ["browser.zoom.full"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +ExtensionPreferencesManager.addSetting("zoomSiteSpecific", { + permission: "browserSettings", + prefNames: ["browser.zoom.siteSpecific"], + + setCallback(value) { + return { [this.prefNames[0]]: value }; + }, +}); + +this.browserSettings = class extends ExtensionAPI { + getAPI(context) { + let { extension } = context; + + return { + browserSettings: { + allowPopupsForUserEvents: getSettingsAPI({ + context, + name: "allowPopupsForUserEvents", + callback() { + return Services.prefs.getCharPref("dom.popup_allowed_events") != ""; + }, + }), + cacheEnabled: getSettingsAPI({ + context, + name: "cacheEnabled", + callback() { + return ( + Services.prefs.getBoolPref("browser.cache.disk.enable") && + Services.prefs.getBoolPref("browser.cache.memory.enable") + ); + }, + }), + closeTabsByDoubleClick: getSettingsAPI({ + context, + name: "closeTabsByDoubleClick", + callback() { + return Services.prefs.getBoolPref( + "browser.tabs.closeTabByDblclick" + ); + }, + validate() { + if (AppConstants.platform == "android") { + throw new ExtensionError( + `android is not a supported platform for the closeTabsByDoubleClick setting.` + ); + } + }, + }), + contextMenuShowEvent: Object.assign( + getSettingsAPI({ + context, + name: "contextMenuShowEvent", + callback() { + if (AppConstants.platform === "win") { + return "mouseup"; + } + let prefValue = Services.prefs.getBoolPref( + "ui.context_menus.after_mouseup", + null + ); + return prefValue ? "mouseup" : "mousedown"; + }, + }), + { + set: details => { + if (!["mouseup", "mousedown"].includes(details.value)) { + throw new ExtensionError( + `${details.value} is not a valid value for contextMenuShowEvent.` + ); + } + if ( + AppConstants.platform === "android" || + (AppConstants.platform === "win" && + details.value === "mousedown") + ) { + return false; + } + return ExtensionPreferencesManager.setSetting( + extension.id, + "contextMenuShowEvent", + details.value + ); + }, + } + ), + ftpProtocolEnabled: getSettingsAPI({ + context, + name: "ftpProtocolEnabled", + callback() { + return Services.prefs.getBoolPref("network.ftp.enabled"); + }, + }), + homepageOverride: getSettingsAPI({ + context, + name: HOMEPAGE_OVERRIDE_SETTING, + callback() { + return Services.prefs.getStringPref(HOMEPAGE_URL_PREF); + }, + readOnly: true, + onChange: new ExtensionCommon.EventManager({ + context, + name: `${HOMEPAGE_URL_PREF}.onChange`, + register: fire => { + let listener = () => { + fire.async({ + levelOfControl: "not_controllable", + value: Services.prefs.getStringPref(HOMEPAGE_URL_PREF), + }); + }; + Services.prefs.addObserver(HOMEPAGE_URL_PREF, listener); + return () => { + Services.prefs.removeObserver(HOMEPAGE_URL_PREF, listener); + }; + }, + }).api(), + }), + imageAnimationBehavior: getSettingsAPI({ + context, + name: "imageAnimationBehavior", + callback() { + return Services.prefs.getCharPref("image.animation_mode"); + }, + }), + newTabPosition: getSettingsAPI({ + context, + name: "newTabPosition", + callback() { + if (Services.prefs.getBoolPref("browser.tabs.insertAfterCurrent")) { + return "afterCurrent"; + } + if ( + Services.prefs.getBoolPref( + "browser.tabs.insertRelatedAfterCurrent" + ) + ) { + return "relatedAfterCurrent"; + } + return "atEnd"; + }, + }), + newTabPageOverride: getSettingsAPI({ + context, + name: NEW_TAB_OVERRIDE_SETTING, + callback() { + return AboutNewTab.newTabURL; + }, + storeType: URL_STORE_TYPE, + readOnly: true, + onChange: new ExtensionCommon.EventManager({ + context, + name: `${NEW_TAB_OVERRIDE_SETTING}.onChange`, + register: fire => { + let listener = (text, id) => { + fire.async({ + levelOfControl: "not_controllable", + value: AboutNewTab.newTabURL, + }); + }; + Services.obs.addObserver(listener, "newtab-url-changed"); + return () => { + Services.obs.removeObserver(listener, "newtab-url-changed"); + }; + }, + }).api(), + }), + openBookmarksInNewTabs: getSettingsAPI({ + context, + name: "openBookmarksInNewTabs", + callback() { + return Services.prefs.getBoolPref( + "browser.tabs.loadBookmarksInTabs" + ); + }, + }), + openSearchResultsInNewTabs: getSettingsAPI({ + context, + name: "openSearchResultsInNewTabs", + callback() { + return Services.prefs.getBoolPref("browser.search.openintab"); + }, + }), + openUrlbarResultsInNewTabs: getSettingsAPI({ + context, + name: "openUrlbarResultsInNewTabs", + callback() { + return Services.prefs.getBoolPref("browser.urlbar.openintab"); + }, + }), + webNotificationsDisabled: getSettingsAPI({ + context, + name: "webNotificationsDisabled", + callback() { + let prefValue = Services.prefs.getIntPref( + "permissions.default.desktop-notification", + null + ); + return prefValue === PERM_DENY_ACTION; + }, + }), + overrideDocumentColors: Object.assign( + getSettingsAPI({ + context, + name: "overrideDocumentColors", + callback() { + let prefValue = Services.prefs.getIntPref( + "browser.display.document_color_use" + ); + if (prefValue === 1) { + return "never"; + } else if (prefValue === 2) { + return "always"; + } + return "high-contrast-only"; + }, + }), + { + set: details => { + if ( + !["never", "always", "high-contrast-only"].includes( + details.value + ) + ) { + throw new ExtensionError( + `${details.value} is not a valid value for overrideDocumentColors.` + ); + } + let prefValue = 0; // initialize to 0 - auto/high-contrast-only + if (details.value === "never") { + prefValue = 1; + } else if (details.value === "always") { + prefValue = 2; + } + return ExtensionPreferencesManager.setSetting( + extension.id, + "overrideDocumentColors", + prefValue + ); + }, + } + ), + useDocumentFonts: Object.assign( + getSettingsAPI({ + context, + name: "useDocumentFonts", + callback() { + return ( + Services.prefs.getIntPref( + "browser.display.use_document_fonts" + ) !== 0 + ); + }, + }), + { + set: details => { + if (typeof details.value !== "boolean") { + throw new ExtensionError( + `${details.value} is not a valid value for useDocumentFonts.` + ); + } + return ExtensionPreferencesManager.setSetting( + extension.id, + "useDocumentFonts", + Number(details.value) + ); + }, + } + ), + zoomFullPage: getSettingsAPI({ + context, + name: "zoomFullPage", + callback() { + return Services.prefs.getBoolPref("browser.zoom.full"); + }, + }), + zoomSiteSpecific: getSettingsAPI({ + context, + name: "zoomSiteSpecific", + callback() { + return Services.prefs.getBoolPref("browser.zoom.siteSpecific"); + }, + }), + }, + }; + } +}; |