aboutsummaryrefslogtreecommitdiff
path: root/dev/omni-patching/browser/omni.ja
diff options
context:
space:
mode:
Diffstat (limited to 'dev/omni-patching/browser/omni.ja')
-rw-r--r--dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js2022
-rw-r--r--dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js.patch14
2 files changed, 0 insertions, 2036 deletions
diff --git a/dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js b/dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js
deleted file mode 100644
index 24cfc62..0000000
--- a/dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js
+++ /dev/null
@@ -1,2022 +0,0 @@
-/* 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/. */
-
-/* import-globals-from extensionControlled.js */
-/* import-globals-from preferences.js */
-
-/* FIXME: ESlint globals workaround should be removed once bug 1395426 gets fixed */
-/* globals DownloadUtils, LoadContextInfo */
-
-ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
-ChromeUtils.import("resource://gre/modules/PluralForm.jsm");
-
-ChromeUtils.defineModuleGetter(this, "PluralForm",
- "resource://gre/modules/PluralForm.jsm");
-ChromeUtils.defineModuleGetter(this, "LoginHelper",
- "resource://gre/modules/LoginHelper.jsm");
-ChromeUtils.defineModuleGetter(this, "SiteDataManager",
- "resource:///modules/SiteDataManager.jsm");
-
-ChromeUtils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingUiEnabled",
- "browser.contentblocking.ui.enabled");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingCookiesAndSiteDataRejectTrackersRecommended",
- "browser.contentblocking.cookies-site-data.ui.reject-trackers.recommended");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingCookiesAndSiteDataRejectTrackersEnabled",
- "browser.contentblocking.cookies-site-data.ui.reject-trackers.enabled");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingFastBlockUiEnabled",
- "browser.contentblocking.fastblock.ui.enabled");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingTrackingProtectionUiEnabled",
- "browser.contentblocking.trackingprotection.ui.enabled");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingRejectTrackersUiEnabled",
- "browser.contentblocking.rejecttrackers.ui.enabled");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingRejectTrackersRecommended",
- "browser.contentblocking.rejecttrackers.ui.recommended");
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "contentBlockingEnabled",
- "browser.contentblocking.enabled");
-
-const PREF_UPLOAD_ENABLED = "datareporting.healthreport.uploadEnabled";
-
-const TRACKING_PROTECTION_KEY = "websites.trackingProtectionMode";
-const TRACKING_PROTECTION_PREFS = ["privacy.trackingprotection.enabled",
- "privacy.trackingprotection.pbmode.enabled"];
-
-const PREF_OPT_OUT_STUDIES_ENABLED = "app.shield.optoutstudies.enabled";
-const PREF_NORMANDY_ENABLED = "app.normandy.enabled";
-
-XPCOMUtils.defineLazyGetter(this, "AlertsServiceDND", function() {
- try {
- let alertsService = Cc["@mozilla.org/alerts-service;1"]
- .getService(Ci.nsIAlertsService)
- .QueryInterface(Ci.nsIAlertsDoNotDisturb);
- // This will throw if manualDoNotDisturb isn't implemented.
- alertsService.manualDoNotDisturb;
- return alertsService;
- } catch (ex) {
- return undefined;
- }
-});
-
-Preferences.addAll([
- // Content Blocking
- { id: "browser.contentblocking.enabled", type: "bool" },
-
- // FastBlock
- { id: "browser.fastblock.enabled", type: "bool" },
-
- // Tracking Protection
- { id: "privacy.trackingprotection.enabled", type: "bool" },
- { id: "privacy.trackingprotection.pbmode.enabled", type: "bool" },
- // This isn't a configuration pref, rather it's for saving the previous state
- // of the UI when we turn off the TP controls when the user checks off the
- // All Detected Trackers under Content Blocking. This pref isn't listed in
- // all.js/firefox.js to make sure it doesn't appear in about:config by default.
- { id: "browser.privacy.trackingprotection.menu", type: "string" },
-
- // Button prefs
- { id: "pref.privacy.disable_button.cookie_exceptions", type: "bool" },
- { id: "pref.privacy.disable_button.view_cookies", type: "bool" },
- { id: "pref.privacy.disable_button.change_blocklist", type: "bool" },
- { id: "pref.privacy.disable_button.tracking_protection_exceptions", type: "bool" },
-
- // Location Bar
- { id: "browser.urlbar.autocomplete.enabled", type: "bool" },
- { id: "browser.urlbar.suggest.bookmark", type: "bool" },
- { id: "browser.urlbar.suggest.history", type: "bool" },
- { id: "browser.urlbar.suggest.openpage", type: "bool" },
-
- // History
- { id: "places.history.enabled", type: "bool" },
- { id: "browser.formfill.enable", type: "bool" },
- { id: "privacy.history.custom", type: "bool" },
- // Cookies
- { id: "network.cookie.cookieBehavior", type: "int" },
- { id: "network.cookie.lifetimePolicy", type: "int" },
- { id: "network.cookie.blockFutureCookies", type: "bool" },
- // Clear Private Data
- { id: "privacy.sanitize.sanitizeOnShutdown", type: "bool" },
- { id: "privacy.sanitize.timeSpan", type: "int" },
- // Do not track
- { id: "privacy.donottrackheader.enabled", type: "bool" },
-
- // Media
- { id: "media.autoplay.default", type: "int" },
- { id: "media.autoplay.enabled.ask-permission", type: "bool" },
- { id: "media.autoplay.enabled.user-gestures-needed", type: "bool" },
-
- // Popups
- { id: "dom.disable_open_during_load", type: "bool" },
- // Passwords
- { id: "signon.rememberSignons", type: "bool" },
-
- // Buttons
- { id: "pref.privacy.disable_button.view_passwords", type: "bool" },
- { id: "pref.privacy.disable_button.view_passwords_exceptions", type: "bool" },
-
- /* Certificates tab
- * security.default_personal_cert
- * - a string:
- * "Select Automatically" select a certificate automatically when a site
- * requests one
- * "Ask Every Time" present a dialog to the user so he can select
- * the certificate to use on a site which
- * requests one
- */
- { id: "security.default_personal_cert", type: "string" },
-
- { id: "security.disable_button.openCertManager", type: "bool" },
-
- { id: "security.disable_button.openDeviceManager", type: "bool" },
-
- { id: "security.OCSP.enabled", type: "int" },
-
- // Add-ons, malware, phishing
- { id: "xpinstall.whitelist.required", type: "bool" },
-
- { id: "browser.safebrowsing.malware.enabled", type: "bool" },
- { id: "browser.safebrowsing.phishing.enabled", type: "bool" },
-
- { id: "browser.safebrowsing.downloads.enabled", type: "bool" },
-
- { id: "urlclassifier.malwareTable", type: "string" },
-
- { id: "browser.safebrowsing.downloads.remote.block_potentially_unwanted", type: "bool" },
- { id: "browser.safebrowsing.downloads.remote.block_uncommon", type: "bool" },
-
-]);
-
-// Study opt out
-if (AppConstants.MOZ_DATA_REPORTING) {
- Preferences.addAll([
- // Preference instances for prefs that we need to monitor while the page is open.
- { id: PREF_OPT_OUT_STUDIES_ENABLED, type: "bool" },
- { id: PREF_UPLOAD_ENABLED, type: "bool" },
- ]);
-}
-
-// Data Choices tab
-if (AppConstants.NIGHTLY_BUILD) {
- Preferences.add({ id: "browser.chrome.errorReporter.enabled", type: "bool" });
-}
-if (AppConstants.MOZ_CRASHREPORTER) {
- Preferences.add({ id: "browser.crashReports.unsubmittedCheck.autoSubmit2", type: "bool" });
-}
-
-function setEventListener(aId, aEventType, aCallback) {
- document.getElementById(aId)
- .addEventListener(aEventType, aCallback.bind(gPrivacyPane));
-}
-
-var gPrivacyPane = {
- _pane: null,
-
- /**
- * Whether the prompt to restart Firefox should appear when changing the autostart pref.
- */
- _shouldPromptForRestart: true,
-
- /**
- * Initialize the tracking protection prefs and linkify its Learn More link.
- */
- _initTrackingProtection() {
- setEventListener("trackingProtectionRadioGroup", "command",
- this.trackingProtectionWritePrefs);
- setEventListener("changeBlockList", "command", this.showBlockLists);
-
- let link = document.getElementById("trackingProtectionLearnMore");
- let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "tracking-protection";
- link.setAttribute("href", url);
- },
-
- /**
- * Update the tracking protection UI to deal with extension control.
- */
- _updateTrackingProtectionUI() {
- let isLocked = TRACKING_PROTECTION_PREFS.some(
- pref => Services.prefs.prefIsLocked(pref));
-
- function setInputsDisabledState(isControlled) {
- let disabled = isLocked || isControlled;
- if (contentBlockingUiEnabled) {
- let tpCheckbox =
- document.getElementById("contentBlockingTrackingProtectionCheckbox");
- // Only enable the TP menu if content blocking and Detect All Trackers
- // are enabled.
- document.getElementById("trackingProtectionMenu").disabled = disabled ||
- !tpCheckbox.checked ||
- !contentBlockingEnabled;
- // Only enable the TP category checkbox if content blocking is enabled.
- tpCheckbox.disabled = disabled || !contentBlockingEnabled;
- } else {
- document.querySelectorAll("#trackingProtectionRadioGroup > radio")
- .forEach((element) => {
- element.disabled = disabled;
- });
- document.querySelector("#trackingProtectionDesc > label")
- .disabled = disabled;
- }
-
- // Notify observers that the TP UI has been updated.
- // This is needed since our tests need to be notified about the
- // trackingProtectionMenu element getting disabled/enabled at the right time.
- Services.obs.notifyObservers(window, "privacy-pane-tp-ui-updated");
- }
-
- if (isLocked) {
- // An extension can't control this setting if either pref is locked.
- hideControllingExtension(TRACKING_PROTECTION_KEY);
- setInputsDisabledState(false);
- } else {
- handleControllingExtension(
- PREF_SETTING_TYPE,
- TRACKING_PROTECTION_KEY)
- .then(setInputsDisabledState);
- }
- },
-
- /**
- * Set up handlers for showing and hiding controlling extension info
- * for tracking protection.
- */
- _initTrackingProtectionExtensionControl() {
- let disableButton = contentBlockingUiEnabled ?
- "contentBlockingDisableTrackingProtectionExtension" : "disableTrackingProtectionExtension";
- setEventListener(disableButton, "command",
- makeDisableControllingExtension(
- PREF_SETTING_TYPE, TRACKING_PROTECTION_KEY));
-
- let trackingProtectionObserver = {
- observe(subject, topic, data) {
- gPrivacyPane._updateTrackingProtectionUI();
- },
- };
-
- for (let pref of TRACKING_PROTECTION_PREFS) {
- Services.prefs.addObserver(pref, trackingProtectionObserver);
- }
- window.addEventListener("unload", () => {
- for (let pref of TRACKING_PROTECTION_PREFS) {
- Services.prefs.removeObserver(pref, trackingProtectionObserver);
- }
- });
- },
-
- /**
- * Initialize autocomplete to ensure prefs are in sync.
- */
- _initAutocomplete() {
- Cc["@mozilla.org/autocomplete/search;1?name=unifiedcomplete"]
- .getService(Ci.mozIPlacesAutoComplete);
- },
-
- /**
- * Sets up the UI for the number of days of history to keep, and updates the
- * label of the "Clear Now..." button.
- */
- init() {
- this._updateSanitizeSettingsButton();
- this.initializeHistoryMode();
- this.initAutoplay();
- this.updateAutoplayMediaControlsVisibility();
- this.updateHistoryModePane();
- this.updatePrivacyMicroControls();
- this.initAutoStartPrivateBrowsingReverter();
- this._initAutocomplete();
-
- /* Initialize Content Blocking / Tracking Protection */
-
- if (contentBlockingUiEnabled) {
- this.initContentBlocking();
- } else {
- this._initTrackingProtection();
- }
-
- this.trackingProtectionReadPrefs();
- this.networkCookieBehaviorReadPrefs();
- this._initTrackingProtectionExtensionControl();
-
- this.updateContentBlockingVisibility();
-
- Preferences.get("privacy.trackingprotection.enabled").on("change",
- gPrivacyPane.trackingProtectionReadPrefs.bind(gPrivacyPane));
- Preferences.get("privacy.trackingprotection.pbmode.enabled").on("change",
- gPrivacyPane.trackingProtectionReadPrefs.bind(gPrivacyPane));
-
- // Watch all of the prefs that the new Cookies & Site Data UI depends on
- Preferences.get("network.cookie.cookieBehavior").on("change",
- gPrivacyPane.networkCookieBehaviorReadPrefs.bind(gPrivacyPane));
- Preferences.get("network.cookie.lifetimePolicy").on("change",
- gPrivacyPane.networkCookieBehaviorReadPrefs.bind(gPrivacyPane));
- Preferences.get("browser.privatebrowsing.autostart").on("change",
- gPrivacyPane.networkCookieBehaviorReadPrefs.bind(gPrivacyPane));
-
- setEventListener("trackingProtectionExceptions", "command",
- gPrivacyPane.showTrackingProtectionExceptions);
-
- Preferences.get("privacy.sanitize.sanitizeOnShutdown").on("change",
- gPrivacyPane._updateSanitizeSettingsButton.bind(gPrivacyPane));
- Preferences.get("browser.privatebrowsing.autostart").on("change",
- gPrivacyPane.updatePrivacyMicroControls.bind(gPrivacyPane));
- Preferences.get("media.autoplay.enabled.ask-permission").on("change",
- gPrivacyPane.updateAutoplayMediaControlsVisibility.bind(gPrivacyPane));
- Preferences.get("media.autoplay.enabled.user-gestures-needed").on("change",
- gPrivacyPane.updateAutoplayMediaControlsVisibility.bind(gPrivacyPane));
- setEventListener("historyMode", "command", function() {
- gPrivacyPane.updateHistoryModePane();
- gPrivacyPane.updateHistoryModePrefs();
- gPrivacyPane.updatePrivacyMicroControls();
- gPrivacyPane.updateAutostart();
- });
- setEventListener("clearHistoryButton", "command", function() {
- let historyMode = document.getElementById("historyMode");
- // Select "everything" in the clear history dialog if the
- // user has set their history mode to never remember history.
- gPrivacyPane.clearPrivateDataNow(historyMode.value == "dontremember");
- });
- setEventListener("openSearchEnginePreferences", "click", function(event) {
- if (event.button == 0) {
- gotoPref("search");
- }
- return false;
- });
- setEventListener("privateBrowsingAutoStart", "command",
- gPrivacyPane.updateAutostart);
- setEventListener("cookieExceptions", "command",
- gPrivacyPane.showCookieExceptions);
- setEventListener("clearDataSettings", "command",
- gPrivacyPane.showClearPrivateDataSettings);
- setEventListener("passwordExceptions", "command",
- gPrivacyPane.showPasswordExceptions);
- setEventListener("useMasterPassword", "command",
- gPrivacyPane.updateMasterPasswordButton);
- setEventListener("changeMasterPassword", "command",
- gPrivacyPane.changeMasterPassword);
- setEventListener("showPasswords", "command",
- gPrivacyPane.showPasswords);
- setEventListener("addonExceptions", "command",
- gPrivacyPane.showAddonExceptions);
- setEventListener("viewCertificatesButton", "command",
- gPrivacyPane.showCertificates);
- setEventListener("viewSecurityDevicesButton", "command",
- gPrivacyPane.showSecurityDevices);
-
- this._pane = document.getElementById("panePrivacy");
- this._initMasterPasswordUI();
- this._initSafeBrowsing();
-
- setEventListener("notificationSettingsButton", "command",
- gPrivacyPane.showNotificationExceptions);
- setEventListener("locationSettingsButton", "command",
- gPrivacyPane.showLocationExceptions);
- setEventListener("cameraSettingsButton", "command",
- gPrivacyPane.showCameraExceptions);
- setEventListener("microphoneSettingsButton", "command",
- gPrivacyPane.showMicrophoneExceptions);
- setEventListener("popupPolicyButton", "command",
- gPrivacyPane.showPopupExceptions);
- setEventListener("autoplayMediaCheckbox", "command",
- gPrivacyPane.toggleAutoplayMedia);
- setEventListener("autoplayMediaPolicyButton", "command",
- gPrivacyPane.showAutoplayMediaExceptions);
- setEventListener("autoplayMediaPolicyComboboxButton", "command",
- gPrivacyPane.showAutoplayMediaExceptions);
- setEventListener("notificationsDoNotDisturb", "command",
- gPrivacyPane.toggleDoNotDisturbNotifications);
-
- if (AlertsServiceDND) {
- let notificationsDoNotDisturbBox =
- document.getElementById("notificationsDoNotDisturbBox");
- notificationsDoNotDisturbBox.removeAttribute("hidden");
- let checkbox = document.getElementById("notificationsDoNotDisturb");
- document.l10n.setAttributes(checkbox, "permissions-notification-pause");
- if (AlertsServiceDND.manualDoNotDisturb) {
- let notificationsDoNotDisturb =
- document.getElementById("notificationsDoNotDisturb");
- notificationsDoNotDisturb.setAttribute("checked", true);
- }
- }
-
- this.initSiteDataControls();
-
- setEventListener("clearSiteDataButton", "command",
- gPrivacyPane.clearSiteData);
- setEventListener("siteDataSettings", "command",
- gPrivacyPane.showSiteDataSettings);
- let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "storage-permissions";
- document.getElementById("siteDataLearnMoreLink").setAttribute("href", url);
-
- let notificationInfoURL =
- Services.urlFormatter.formatURLPref("app.support.baseURL") + "push";
- document.getElementById("notificationPermissionsLearnMore").setAttribute("href",
- notificationInfoURL);
- let drmInfoURL =
- Services.urlFormatter.formatURLPref("app.support.baseURL") + "drm-content";
- document.getElementById("playDRMContentLink").setAttribute("href", drmInfoURL);
- let emeUIEnabled = Services.prefs.getBoolPref("browser.eme.ui.enabled");
- // Force-disable/hide on WinXP:
- if (navigator.platform.toLowerCase().startsWith("win")) {
- emeUIEnabled = emeUIEnabled && parseFloat(Services.sysinfo.get("version")) >= 6;
- }
- if (!emeUIEnabled) {
- // Don't want to rely on .hidden for the toplevel groupbox because
- // of the pane hiding/showing code potentially interfering:
- document.getElementById("drmGroup").setAttribute("style", "display: none !important");
- }
-
- if (AppConstants.MOZ_DATA_REPORTING) {
- this.initDataCollection();
- if (AppConstants.NIGHTLY_BUILD) {
- this.initCollectBrowserErrors();
- }
- if (AppConstants.MOZ_CRASHREPORTER) {
- this.initSubmitCrashes();
- }
- this.initSubmitHealthReport();
- setEventListener("submitHealthReportBox", "command",
- gPrivacyPane.updateSubmitHealthReport);
- this.initOptOutStudyCheckbox();
- }
- this._initA11yState();
- let signonBundle = document.getElementById("signonBundle");
- let pkiBundle = document.getElementById("pkiBundle");
- appendSearchKeywords("showPasswords", [
- signonBundle.getString("loginsDescriptionAll2"),
- ]);
- appendSearchKeywords("viewSecurityDevicesButton", [
- pkiBundle.getString("enable_fips"),
- ]);
-
- if (!PrivateBrowsingUtils.enabled) {
- document.getElementById("privateBrowsingAutoStart").hidden = true;
- document.querySelector("menuitem[value='dontremember']").hidden = true;
- }
-
- // Notify observers that the UI is now ready
- Services.obs.notifyObservers(window, "privacy-pane-loaded");
- },
-
- initSiteDataControls() {
- Services.obs.addObserver(this, "sitedatamanager:sites-updated");
- Services.obs.addObserver(this, "sitedatamanager:updating-sites");
- let unload = () => {
- window.removeEventListener("unload", unload);
- Services.obs.removeObserver(this, "sitedatamanager:sites-updated");
- Services.obs.removeObserver(this, "sitedatamanager:updating-sites");
- };
- window.addEventListener("unload", unload);
- SiteDataManager.updateSites();
- },
-
- // CONTENT BLOCKING
-
- /**
- * Initializes the content blocking section.
- */
- initContentBlocking() {
- let contentBlockingCheckbox = document.getElementById("contentBlockingCheckbox");
- setEventListener("contentBlockingToggle", "command",
- () => contentBlockingCheckbox.click());
- setEventListener("contentBlockingToggle", "command",
- this.updateContentBlockingControls);
- setEventListener("changeBlockListLink", "click", this.showBlockLists);
- setEventListener("contentBlockingRestoreDefaults", "command",
- this.restoreContentBlockingPrefs);
- setEventListener("contentBlockingTrackingProtectionCheckbox", "command",
- this.trackingProtectionWritePrefs);
- setEventListener("contentBlockingTrackingProtectionCheckbox", "command",
- this._updateTrackingProtectionUI);
- setEventListener("trackingProtectionMenu", "command",
- this.trackingProtectionWritePrefs);
- setEventListener("contentBlockingChangeCookieSettings", "command",
- this.changeCookieSettings);
- setEventListener("contentBlockingBlockCookiesCheckbox", "command",
- this.writeBlockCookiesCheckbox);
-
- Preferences.get("network.cookie.cookieBehavior").on("change",
- gPrivacyPane.readBlockCookiesCheckbox.bind(gPrivacyPane));
-
- this.readBlockCookiesCheckbox();
-
- let link = document.getElementById("contentBlockingLearnMore");
- let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "tracking-protection";
- link.setAttribute("href", url);
-
- // Honour our Content Blocking category UI prefs. If each pref is set to false,
- // Make all descendants of the corresponding selector hidden.
- let selectorPrefMap = {
- ".fast-block-ui": contentBlockingFastBlockUiEnabled,
- ".tracking-protection-ui": contentBlockingTrackingProtectionUiEnabled,
- ".reject-trackers-ui": contentBlockingRejectTrackersUiEnabled,
- };
-
- for (let selector in selectorPrefMap) {
- let pref = selectorPrefMap[selector];
- if (!pref) {
- let elements = document.querySelectorAll(selector);
- for (let element of elements) {
- element.hidden = true;
- }
- }
- }
-
- // Allow turning off the "(recommended)" label using a pref
- let blockCookiesFromTrackers = document.getElementById("blockCookiesFromTrackersCB");
- if (contentBlockingRejectTrackersRecommended) {
- document.l10n.setAttributes(blockCookiesFromTrackers, "content-blocking-reject-trackers-block-trackers-option-recommended");
- }
- },
-
- /**
- * Resets all user-exposed content blocking preferences to their default values.
- */
- async restoreContentBlockingPrefs() {
- function clearIfNotLocked(pref) {
- if (!Services.prefs.prefIsLocked(pref)) {
- Services.prefs.clearUserPref(pref);
- }
- }
-
- clearIfNotLocked("browser.contentblocking.enabled");
- clearIfNotLocked("browser.fastblock.enabled");
- clearIfNotLocked("urlclassifier.trackingTable");
- clearIfNotLocked("network.cookie.cookieBehavior");
- clearIfNotLocked("network.cookie.lifetimePolicy");
-
- let controllingExtension = await getControllingExtension(
- PREF_SETTING_TYPE, TRACKING_PROTECTION_KEY);
- if (!controllingExtension) {
- for (let preference of TRACKING_PROTECTION_PREFS) {
- clearIfNotLocked(preference);
- }
- }
- },
-
- /**
- * Highlights the Cookies & Site Data UI section.
- */
- changeCookieSettings() {
- gotoPref("privacy-sitedata");
- },
-
- /**
- * Changes the visibility of elements in the TP/CB section depending on the
- * content blocking UI pref.
- */
- updateContentBlockingVisibility() {
- // First, update the content blocking UI.
- let visibleState = {
- "contentBlockingHeader": true,
- "contentBlockingDescription": true,
- "contentBlockingLearnMore": true,
- "contentBlockingRestoreDefaults": true,
- "contentBlockingCheckboxContainer": true,
- "contentBlockingCategories": true,
-
- "trackingProtectionHeader": false,
- "trackingProtectionDescription": false,
- "trackingProtectionBox": false,
- };
- for (let id in visibleState) {
- document.getElementById(id).hidden = contentBlockingUiEnabled != visibleState[id];
- }
-
- if (contentBlockingUiEnabled) {
- // Update the Do Not Track section to not mention "Tracking Protection".
- let dntDefaultRadioItem =
- document.querySelector("#doNotTrackRadioGroup > radio[value=false]");
- document.l10n.setAttributes(
- dntDefaultRadioItem, "do-not-track-option-default-content-blocking");
-
- // Potentially hide the global toggle.
- document.getElementById("contentBlockingCheckboxContainer").hidden =
- !Services.prefs.getBoolPref("browser.contentblocking.global-toggle.enabled", true);
- }
-
- // Allow turning off the "(recommended)" label using a pref
- let blockCookiesFromTrackers = document.getElementById("blockCookiesFromTrackers");
- if (contentBlockingCookiesAndSiteDataRejectTrackersRecommended) {
- document.l10n.setAttributes(blockCookiesFromTrackers, "sitedata-block-trackers-option-recommended");
- }
-
- // Allow hiding the Reject Trackers option based on a pref
- if (!contentBlockingCookiesAndSiteDataRejectTrackersEnabled) {
- blockCookiesFromTrackers.remove();
- }
- },
-
- /**
- * Updates the preferences UI to reflect the browser.contentblocking.enabled pref.
- * This affects the button to toggle the pref and the disabled state of the dependent controls.
- */
- updateContentBlockingToggle() {
- let onOrOff = contentBlockingEnabled ? "on" : "off";
- let contentBlockingToggle = document.getElementById("contentBlockingToggle");
- let contentBlockingToggleLabel = document.getElementById("contentBlockingToggleLabel");
-
- document.l10n.setAttributes(contentBlockingToggle,
- "content-blocking-toggle-" + onOrOff);
- contentBlockingToggle.setAttribute("aria-pressed", contentBlockingEnabled);
- document.l10n.setAttributes(contentBlockingToggleLabel,
- "content-blocking-toggle-label-" + onOrOff);
-
- this.updateContentBlockingControls();
- },
-
- /**
- * Changes the disabled state of controls that depend on the browser.contentblocking.enabled pref.
- */
- updateContentBlockingControls() {
- let dependentControls = [
- "#content-blocking-categories-label",
- ".content-blocking-checkbox",
- "#changeBlockListLink",
- "#contentBlockingChangeCookieSettings",
- "#blockCookiesCB, #blockCookiesCB > radio",
- "#blockCookies, #blockCookies > radio",
- ];
-
- this._toggleControls(dependentControls, contentBlockingEnabled);
-
- // The list of dependent controls here would normally include #blockCookiesLabel,
- // #blockCookiesMenu, #keepUntil and #keepCookiesUntil, but in order to avoid
- // having two parts of the code responsible for figuring out whether these
- // controls must be enabled or disabled, we offload that responsibility to
- // networkCookieBehaviorReadPrefs() which already knows how to deal with it.
- this.networkCookieBehaviorReadPrefs();
-
- // If Content Blocking gets disabled, show the warning in the Cookies and Site Data section.
- let blockCookiesWarning = document.getElementById("blockCookiesWarning");
- blockCookiesWarning.hidden = contentBlockingEnabled;
-
- // Need to make sure we account for pref locking/extension overrides when enabling the TP menu.
- this._updateTrackingProtectionUI();
-
- // If we are turning Content Blocking on, we may need to keep some parts of the Third-Party Cookies
- // UI off, depending on the value of the cookieBehavior pref. readBlockCookiesCheckbox() can do
- // the work that is needed for that.
- this.readBlockCookiesCheckbox();
- },
-
- _toggleControls(dependentControls, enabled) {
- for (let selector of dependentControls) {
- let controls = document.querySelectorAll(selector);
-
- for (let control of controls) {
- if (enabled) {
- control.removeAttribute("disabled");
- } else {
- control.setAttribute("disabled", "true");
- }
- }
- }
- },
-
- // TRACKING PROTECTION MODE
-
- /**
- * Selects the right item of the Tracking Protection radiogroup.
- */
- trackingProtectionReadPrefs() {
- let enabledPref = Preferences.get("privacy.trackingprotection.enabled");
- let pbmPref = Preferences.get("privacy.trackingprotection.pbmode.enabled");
- let btpmPref = Preferences.get("browser.privacy.trackingprotection.menu");
- let tpControl,
- tpCheckbox;
- if (contentBlockingUiEnabled) {
- tpControl = document.getElementById("trackingProtectionMenu");
- tpCheckbox = document.getElementById("contentBlockingTrackingProtectionCheckbox");
- } else {
- tpControl = document.getElementById("trackingProtectionRadioGroup");
- }
-
- let savedMenuValue;
- if (contentBlockingUiEnabled) {
- // Only look at the backup pref when restoring the checkbox next to
- // "All Detected Trackers".
- if (["always", "private"].includes(btpmPref.value) &&
- tpCheckbox.checked) {
- savedMenuValue = btpmPref.value;
- }
- }
-
- this._updateTrackingProtectionUI();
-
- // Global enable takes precedence over enabled in Private Browsing.
- if (enabledPref.value) {
- tpControl.value = "always";
- if (tpCheckbox) {
- tpCheckbox.checked = true;
- }
- } else if (pbmPref.value) {
- tpControl.value = "private";
- if (tpCheckbox) {
- tpCheckbox.checked = true;
- }
- } else if (!tpCheckbox) {
- tpControl.value = "never";
- } else {
- if (savedMenuValue) {
- tpControl.value = savedMenuValue;
- }
- tpCheckbox.checked = false;
- }
- },
-
- /**
- * Selects the right items of the new Cookies & Site Data UI.
- */
- networkCookieBehaviorReadPrefs() {
- let behavior = Preferences.get("network.cookie.cookieBehavior").value;
- let blockCookiesCtrl = document.getElementById("blockCookies");
- let blockCookiesLabel = document.getElementById("blockCookiesLabel");
- let blockCookiesMenu = document.getElementById("blockCookiesMenu");
- let keepUntilLabel = document.getElementById("keepUntil");
- let keepUntilMenu = document.getElementById("keepCookiesUntil");
-
- let disabledByCB = contentBlockingUiEnabled ? !contentBlockingEnabled : false;
- let blockCookies = (behavior != 0);
- let cookieBehaviorLocked = Services.prefs.prefIsLocked("network.cookie.cookieBehavior");
- let blockCookiesControlsDisabled = !blockCookies || cookieBehaviorLocked || disabledByCB;
- blockCookiesLabel.disabled = blockCookiesMenu.disabled = blockCookiesControlsDisabled;
-
- let completelyBlockCookies = (behavior == 2);
- let privateBrowsing = Preferences.get("browser.privatebrowsing.autostart").value;
- let cookieExpirationLocked = Services.prefs.prefIsLocked("network.cookie.lifetimePolicy");
- let keepUntilControlsDisabled = privateBrowsing || completelyBlockCookies ||
- cookieExpirationLocked || disabledByCB;
- keepUntilLabel.disabled = keepUntilMenu.disabled = keepUntilControlsDisabled;
-
- switch (behavior) {
- case Ci.nsICookieService.BEHAVIOR_ACCEPT:
- blockCookiesCtrl.value = "allow";
- break;
- case Ci.nsICookieService.BEHAVIOR_REJECT_FOREIGN:
- blockCookiesCtrl.value = "disallow";
- blockCookiesMenu.value = "all-third-parties";
- break;
- case Ci.nsICookieService.BEHAVIOR_REJECT:
- blockCookiesCtrl.value = "disallow";
- blockCookiesMenu.value = "always";
- break;
- case Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN:
- blockCookiesCtrl.value = "disallow";
- blockCookiesMenu.value = "unvisited";
- break;
- case Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER:
- blockCookiesCtrl.value = "disallow";
- blockCookiesMenu.value = "trackers";
- break;
- }
- },
-
- /**
- * Sets the pref values based on the selected item of the radiogroup.
- */
- trackingProtectionWritePrefs() {
- let enabledPref = Preferences.get("privacy.trackingprotection.enabled");
- let pbmPref = Preferences.get("privacy.trackingprotection.pbmode.enabled");
- let btpmPref = Preferences.get("browser.privacy.trackingprotection.menu");
- let tpControl,
- tpCheckbox;
- if (contentBlockingUiEnabled) {
- tpControl = document.getElementById("trackingProtectionMenu");
- tpCheckbox = document.getElementById("contentBlockingTrackingProtectionCheckbox");
- } else {
- tpControl = document.getElementById("trackingProtectionRadioGroup");
- }
-
- let value;
- if (tpCheckbox) {
- if (tpCheckbox.checked) {
- value = tpControl.value;
- btpmPref.value = value;
- } else {
- value = "never";
- }
- } else {
- value = tpControl.value;
- }
-
- switch (value) {
- case "always":
- enabledPref.value = true;
- pbmPref.value = true;
- break;
- case "private":
- enabledPref.value = false;
- pbmPref.value = true;
- break;
- case "never":
- enabledPref.value = false;
- pbmPref.value = false;
- break;
- }
- },
-
- // HISTORY MODE
-
- /**
- * The list of preferences which affect the initial history mode settings.
- * If the auto start private browsing mode pref is active, the initial
- * history mode would be set to "Don't remember anything".
- * If ALL of these preferences are set to the values that correspond
- * to keeping some part of history, and the auto-start
- * private browsing mode is not active, the initial history mode would be
- * set to "Remember everything".
- * Otherwise, the initial history mode would be set to "Custom".
- *
- * Extensions adding their own preferences can set values here if needed.
- */
- prefsForKeepingHistory: {
- "places.history.enabled": true, // History is enabled
- "browser.formfill.enable": true, // Form information is saved
- "privacy.sanitize.sanitizeOnShutdown": false, // Private date is NOT cleared on shutdown
- },
-
- /**
- * The list of control IDs which are dependent on the auto-start private
- * browsing setting, such that in "Custom" mode they would be disabled if
- * the auto-start private browsing checkbox is checked, and enabled otherwise.
- *
- * Extensions adding their own controls can append their IDs to this array if needed.
- */
- dependentControls: [
- "rememberHistory",
- "rememberForms",
- "alwaysClear",
- "clearDataSettings",
- ],
-
- /**
- * Check whether preferences values are set to keep history
- *
- * @param aPrefs an array of pref names to check for
- * @returns boolean true if all of the prefs are set to keep history,
- * false otherwise
- */
- _checkHistoryValues(aPrefs) {
- for (let pref of Object.keys(aPrefs)) {
- if (Preferences.get(pref).value != aPrefs[pref])
- return false;
- }
- return true;
- },
-
- /**
- * Initialize the history mode menulist based on the privacy preferences
- */
- initializeHistoryMode() {
- let mode;
- let getVal = aPref => Preferences.get(aPref).value;
-
- if (getVal("privacy.history.custom"))
- mode = "custom";
- else if (this._checkHistoryValues(this.prefsForKeepingHistory)) {
- if (getVal("browser.privatebrowsing.autostart"))
- mode = "dontremember";
- else
- mode = "remember";
- } else
- mode = "custom";
-
- document.getElementById("historyMode").value = mode;
- },
-
- /**
- * Update the selected pane based on the history mode menulist
- */
- updateHistoryModePane() {
- let selectedIndex = -1;
- switch (document.getElementById("historyMode").value) {
- case "remember":
- selectedIndex = 0;
- break;
- case "dontremember":
- selectedIndex = 1;
- break;
- case "custom":
- selectedIndex = 2;
- break;
- }
- document.getElementById("historyPane").selectedIndex = selectedIndex;
- Preferences.get("privacy.history.custom").value = selectedIndex == 2;
- },
-
- /**
- * Update the private browsing auto-start pref and the history mode
- * micro-management prefs based on the history mode menulist
- */
- updateHistoryModePrefs() {
- let pref = Preferences.get("browser.privatebrowsing.autostart");
- switch (document.getElementById("historyMode").value) {
- case "remember":
- if (pref.value)
- pref.value = false;
-
- // select the remember history option if needed
- Preferences.get("places.history.enabled").value = true;
-
- // select the remember forms history option
- Preferences.get("browser.formfill.enable").value = true;
-
- // select the clear on close option
- Preferences.get("privacy.sanitize.sanitizeOnShutdown").value = false;
- break;
- case "dontremember":
- if (!pref.value)
- pref.value = true;
- break;
- }
- },
-
- /**
- * Update the privacy micro-management controls based on the
- * value of the private browsing auto-start preference.
- */
- updatePrivacyMicroControls() {
- // Set "Keep cookies until..." to "I close Nightly" and disable the setting
- // when we're in auto private mode (or reset it back otherwise).
- document.getElementById("keepCookiesUntil").value = this.readKeepCookiesUntil();
-
- let clearDataSettings = document.getElementById("clearDataSettings");
-
- if (document.getElementById("historyMode").value == "custom") {
- let disabled = Preferences.get("browser.privatebrowsing.autostart").value;
- this.dependentControls.forEach(function(aElement) {
- let control = document.getElementById(aElement);
- let preferenceId = control.getAttribute("preference");
- if (!preferenceId) {
- let dependentControlId = control.getAttribute("control");
- if (dependentControlId) {
- let dependentControl = document.getElementById(dependentControlId);
- preferenceId = dependentControl.getAttribute("preference");
- }
- }
-
- let preference = preferenceId ? Preferences.get(preferenceId) : {};
- control.disabled = disabled || preference.locked;
- });
-
- clearDataSettings.removeAttribute("hidden");
-
- // adjust the checked state of the sanitizeOnShutdown checkbox
- document.getElementById("alwaysClear").checked = disabled ? false :
- Preferences.get("privacy.sanitize.sanitizeOnShutdown").value;
-
- // adjust the checked state of the remember history checkboxes
- document.getElementById("rememberHistory").checked = disabled ? false :
- Preferences.get("places.history.enabled").value;
- document.getElementById("rememberForms").checked = disabled ? false :
- Preferences.get("browser.formfill.enable").value;
-
- if (!disabled) {
- // adjust the Settings button for sanitizeOnShutdown
- this._updateSanitizeSettingsButton();
- }
- } else {
- clearDataSettings.setAttribute("hidden", "true");
- }
- },
-
- // CLEAR PRIVATE DATA
-
- /*
- * Preferences:
- *
- * privacy.sanitize.sanitizeOnShutdown
- * - true if the user's private data is cleared on startup according to the
- * Clear Private Data settings, false otherwise
- */
-
- /**
- * Displays the Clear Private Data settings dialog.
- */
- showClearPrivateDataSettings() {
- gSubDialog.open("chrome://browser/content/preferences/sanitize.xul", "resizable=no");
- },
-
-
- /**
- * Displays a dialog from which individual parts of private data may be
- * cleared.
- */
- clearPrivateDataNow(aClearEverything) {
- var ts = Preferences.get("privacy.sanitize.timeSpan");
- var timeSpanOrig = ts.value;
-
- if (aClearEverything) {
- ts.value = 0;
- }
-
- gSubDialog.open("chrome://browser/content/sanitize.xul", "resizable=no", null, () => {
- // reset the timeSpan pref
- if (aClearEverything) {
- ts.value = timeSpanOrig;
- }
-
- Services.obs.notifyObservers(null, "clear-private-data");
- });
- },
-
- /**
- * Enables or disables the "Settings..." button depending
- * on the privacy.sanitize.sanitizeOnShutdown preference value
- */
- _updateSanitizeSettingsButton() {
- var settingsButton = document.getElementById("clearDataSettings");
- var sanitizeOnShutdownPref = Preferences.get("privacy.sanitize.sanitizeOnShutdown");
-
- settingsButton.disabled = !sanitizeOnShutdownPref.value;
- },
-
- toggleDoNotDisturbNotifications(event) {
- AlertsServiceDND.manualDoNotDisturb = event.target.checked;
- },
-
- // PRIVATE BROWSING
-
- /**
- * Initialize the starting state for the auto-start private browsing mode pref reverter.
- */
- initAutoStartPrivateBrowsingReverter() {
- let mode = document.getElementById("historyMode");
- let autoStart = document.getElementById("privateBrowsingAutoStart");
- this._lastMode = mode.selectedIndex;
- this._lastCheckState = autoStart.hasAttribute("checked");
- },
-
- _lastMode: null,
- _lastCheckState: null,
- async updateAutostart() {
- let mode = document.getElementById("historyMode");
- let autoStart = document.getElementById("privateBrowsingAutoStart");
- let pref = Preferences.get("browser.privatebrowsing.autostart");
- if ((mode.value == "custom" && this._lastCheckState == autoStart.checked) ||
- (mode.value == "remember" && !this._lastCheckState) ||
- (mode.value == "dontremember" && this._lastCheckState)) {
- // These are all no-op changes, so we don't need to prompt.
- this._lastMode = mode.selectedIndex;
- this._lastCheckState = autoStart.hasAttribute("checked");
- return;
- }
-
- if (!this._shouldPromptForRestart) {
- // We're performing a revert. Just let it happen.
- return;
- }
-
- let buttonIndex = await confirmRestartPrompt(autoStart.checked, 1,
- true, false);
- if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) {
- pref.value = autoStart.hasAttribute("checked");
- Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
- return;
- }
-
- this._shouldPromptForRestart = false;
-
- if (this._lastCheckState) {
- autoStart.checked = "checked";
- } else {
- autoStart.removeAttribute("checked");
- }
- pref.value = autoStart.hasAttribute("checked");
- mode.selectedIndex = this._lastMode;
- mode.doCommand();
-
- this._shouldPromptForRestart = true;
- },
-
- /**
- * Displays fine-grained, per-site preferences for tracking protection.
- */
- showTrackingProtectionExceptions() {
- let params = {
- permissionType: "trackingprotection",
- hideStatusColumn: true,
- };
- gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
- null, params);
- },
-
- /**
- * Displays the available block lists for tracking protection.
- */
- showBlockLists() {
- gSubDialog.open("chrome://browser/content/preferences/blocklists.xul", null);
- },
-
- // COOKIES AND SITE DATA
-
- /*
- * Preferences:
- *
- * network.cookie.cookieBehavior
- * - determines how the browser should handle cookies:
- * 0 means enable all cookies
- * 1 means reject all third party cookies
- * 2 means disable all cookies
- * 3 means reject third party cookies unless at least one is already set for the eTLD
- * see netwerk/cookie/src/nsCookieService.cpp for details
- * network.cookie.lifetimePolicy
- * - determines how long cookies are stored:
- * 0 means keep cookies until they expire
- * 2 means keep cookies until the browser is closed
- */
-
- readKeepCookiesUntil() {
- let privateBrowsing = Preferences.get("browser.privatebrowsing.autostart").value;
- if (privateBrowsing) {
- return Ci.nsICookieService.ACCEPT_SESSION;
- }
-
- let lifetimePolicy = Preferences.get("network.cookie.lifetimePolicy").value;
- if (lifetimePolicy == Ci.nsICookieService.ACCEPT_SESSION) {
- return Ci.nsICookieService.ACCEPT_SESSION;
- }
-
- // network.cookie.lifetimePolicy can be set to any value, but we just
- // support ACCEPT_SESSION and ACCEPT_NORMALLY. Let's force ACCEPT_NORMALLY.
- return Ci.nsICookieService.ACCEPT_NORMALLY;
- },
-
- /**
- * Reads the network.cookie.cookieBehavior preference value and
- * enables/disables the rest of the new cookie & site data UI accordingly.
- *
- * Returns "allow" if cookies are accepted and "disallow" if they are entirely
- * disabled.
- */
- readBlockCookies() {
- // enable the rest of the UI for anything other than "accept all cookies"
- let pref = Preferences.get("network.cookie.cookieBehavior");
- let blockCookies = (pref.value != 0);
-
- // Our top-level setting is a radiogroup that only sets "enable all"
- // and "disable all", so convert the pref value accordingly.
- return blockCookies ? "disallow" : "allow";
- },
-
- /**
- * Updates the "accept third party cookies" menu based on whether the
- * "accept cookies" or "block cookies" radio buttons are selected.
- */
- writeBlockCookies() {
- let block = document.getElementById("blockCookies");
- let blockCookiesMenu = document.getElementById("blockCookiesMenu");
-
- // if we're disabling cookies, automatically select 'third-party trackers'
- if (block.value == "disallow") {
- blockCookiesMenu.selectedIndex = 0;
- return this.writeBlockCookiesFrom();
- }
-
- return Ci.nsICookieService.BEHAVIOR_ACCEPT;
- },
-
- enableThirdPartyCookiesUI() {
- document.getElementById("blockCookiesCBDeck").selectedIndex = 0;
- document.getElementById("contentBlockingChangeCookieSettings").hidden = true;
-
- let dependentControls = [
- ".reject-trackers-ui .content-blocking-checkbox",
- "#blockCookiesCB, #blockCookiesCB > radio",
- "#blockCookiesCBDeck",
- ];
-
- this._toggleControls(dependentControls, contentBlockingEnabled);
- },
-
- disableThirdPartyCookiesUI(reason) {
- let deckIndex = 0;
- switch (reason) {
- case "always":
- deckIndex = 1;
- break;
- case "unvisited":
- deckIndex = 2;
- break;
- }
- document.getElementById("blockCookiesCBDeck").selectedIndex = deckIndex;
- document.getElementById("contentBlockingChangeCookieSettings").hidden = false;
-
- let dependentControls = [
- ".reject-trackers-ui .content-blocking-checkbox",
- "#blockCookiesCB, #blockCookiesCB > radio",
- "#blockCookiesCBDeck",
- ];
-
- this._toggleControls(dependentControls, false);
- },
-
- /**
- * Converts between network.cookie.cookieBehavior and the new content blocking UI
- */
- readBlockCookiesCB() {
- let pref = Preferences.get("network.cookie.cookieBehavior");
- switch (pref.value) {
- case Ci.nsICookieService.BEHAVIOR_REJECT_FOREIGN:
- return "all-third-parties";
- case Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER:
- return "trackers";
- default:
- return undefined;
- }
- },
-
- writeBlockCookiesCB() {
- let block = document.getElementById("blockCookiesCB").selectedItem;
- switch (block.value) {
- case "trackers":
- return Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER;
- case "all-third-parties":
- return Ci.nsICookieService.BEHAVIOR_REJECT_FOREIGN;
- default:
- return undefined;
- }
- },
-
- writeBlockCookiesCheckbox() {
- let pref = Preferences.get("network.cookie.cookieBehavior");
- let bcCheckbox = document.getElementById("contentBlockingBlockCookiesCheckbox");
- let bcControl = document.getElementById("blockCookiesCB");
-
- let value;
- if (bcCheckbox.checked) {
- value = bcControl.selectedItem.value;
- } else {
- value = "none";
- }
-
- switch (value) {
- case "trackers":
- case "all-third-parties":
- bcControl.disabled = false;
- pref.value = this.writeBlockCookiesCB();
- break;
- default:
- bcControl.disabled = true;
- pref.value = Ci.nsICookieService.BEHAVIOR_ACCEPT;
- break;
- }
- },
-
- readBlockCookiesCheckbox() {
- let pref = Preferences.get("network.cookie.cookieBehavior");
- let bcCheckbox = document.getElementById("contentBlockingBlockCookiesCheckbox");
- let bcControl = document.getElementById("blockCookiesCB");
-
- switch (pref.value) {
- case Ci.nsICookieService.BEHAVIOR_ACCEPT:
- this.enableThirdPartyCookiesUI();
- bcCheckbox.checked = false;
- bcControl.disabled = true;
- break;
- case Ci.nsICookieService.BEHAVIOR_REJECT:
- this.disableThirdPartyCookiesUI("always");
- break;
- case Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN:
- this.disableThirdPartyCookiesUI("unvisited");
- break;
- case Ci.nsICookieService.BEHAVIOR_REJECT_FOREIGN:
- this.enableThirdPartyCookiesUI();
- bcCheckbox.checked = true;
- bcControl.disabled = !contentBlockingEnabled;
- break;
- case Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER:
- this.enableThirdPartyCookiesUI();
- bcCheckbox.checked = true;
- bcControl.disabled = !contentBlockingEnabled;
- break;
- default:
- break;
- }
- },
-
- /**
- * Converts between network.cookie.cookieBehavior and the new third-party cookies UI
- */
- readBlockCookiesFrom() {
- let pref = Preferences.get("network.cookie.cookieBehavior");
- switch (pref.value) {
- case Ci.nsICookieService.BEHAVIOR_REJECT_FOREIGN:
- return "all-third-parties";
- case Ci.nsICookieService.BEHAVIOR_REJECT:
- return "always";
- case Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN:
- return "unvisited";
- case Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER:
- return "trackers";
- default:
- return undefined;
- }
- },
-
- writeBlockCookiesFrom() {
- let block = document.getElementById("blockCookiesMenu").selectedItem;
- switch (block.value) {
- case "trackers":
- return Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER;
- case "unvisited":
- return Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN;
- case "always":
- return Ci.nsICookieService.BEHAVIOR_REJECT;
- case "all-third-parties":
- return Ci.nsICookieService.BEHAVIOR_REJECT_FOREIGN;
- default:
- return undefined;
- }
- },
-
- /**
- * Displays fine-grained, per-site preferences for cookies.
- */
- showCookieExceptions() {
- var params = {
- blockVisible: true,
- sessionVisible: true,
- allowVisible: true,
- prefilledHost: "",
- permissionType: "cookie",
- };
- gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
- null, params);
- },
-
- showSiteDataSettings() {
- gSubDialog.open("chrome://browser/content/preferences/siteDataSettings.xul");
- },
-
- toggleSiteData(shouldShow) {
- let clearButton = document.getElementById("clearSiteDataButton");
- let settingsButton = document.getElementById("siteDataSettings");
- clearButton.disabled = !shouldShow;
- settingsButton.disabled = !shouldShow;
- },
-
- showSiteDataLoading() {
- let totalSiteDataSizeLabel = document.getElementById("totalSiteDataSize");
- document.l10n.setAttributes(totalSiteDataSizeLabel, "sitedata-total-size-calculating");
- },
-
- updateTotalDataSizeLabel(siteDataUsage) {
- SiteDataManager.getCacheSize().then(function(cacheUsage) {
- let totalSiteDataSizeLabel = document.getElementById("totalSiteDataSize");
- let totalUsage = siteDataUsage + cacheUsage;
- let [value, unit] = DownloadUtils.convertByteUnits(totalUsage);
- document.l10n.setAttributes(totalSiteDataSizeLabel, "sitedata-total-size", {
- value,
- unit,
- });
- });
- },
-
- clearSiteData() {
- gSubDialog.open("chrome://browser/content/preferences/clearSiteData.xul");
- },
-
- // GEOLOCATION
-
- /**
- * Displays the location exceptions dialog where specific site location
- * preferences can be set.
- */
- showLocationExceptions() {
- let params = { permissionType: "geo" };
-
- gSubDialog.open("chrome://browser/content/preferences/sitePermissions.xul",
- "resizable=yes", params);
- },
-
- // CAMERA
-
- /**
- * Displays the camera exceptions dialog where specific site camera
- * preferences can be set.
- */
- showCameraExceptions() {
- let params = { permissionType: "camera" };
-
- gSubDialog.open("chrome://browser/content/preferences/sitePermissions.xul",
- "resizable=yes", params);
- },
-
- // MICROPHONE
-
- /**
- * Displays the microphone exceptions dialog where specific site microphone
- * preferences can be set.
- */
- showMicrophoneExceptions() {
- let params = { permissionType: "microphone" };
-
- gSubDialog.open("chrome://browser/content/preferences/sitePermissions.xul",
- "resizable=yes", params);
- },
-
- // NOTIFICATIONS
-
- /**
- * Displays the notifications exceptions dialog where specific site notification
- * preferences can be set.
- */
- showNotificationExceptions() {
- let params = { permissionType: "desktop-notification" };
-
- gSubDialog.open("chrome://browser/content/preferences/sitePermissions.xul",
- "resizable=yes", params);
-
- try {
- Services.telemetry
- .getHistogramById("WEB_NOTIFICATION_EXCEPTIONS_OPENED").add();
- } catch (e) { }
- },
-
-
- // MEDIA
-
- initAutoplay() {
- let url = Services.urlFormatter.formatURLPref("app.support.baseURL") +
- "block-autoplay";
- document.getElementById("autoplayLearnMoreLink").setAttribute("href", url);
- },
-
- /**
- * The checkbox enabled sets the pref to BLOCKED
- */
- toggleAutoplayMedia(event) {
- let blocked = event.target.checked ? Ci.nsIAutoplay.BLOCKED : Ci.nsIAutoplay.ALLOWED;
- Services.prefs.setIntPref("media.autoplay.default", blocked);
- },
-
- /**
- * If user-gestures-needed is false we do not show any UI for configuring autoplay,
- * if user-gestures-needed is false and ask-permission is false we show a checkbox
- * which only allows the user to block autoplay
- * if user-gestures-needed and ask-permission are true we show a combobox that
- * allows the user to block / allow or prompt for autoplay
- * We will be performing a shield study to determine the behaviour to be
- * shipped, at which point we can remove these pref switches.
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1475099
- */
- updateAutoplayMediaControlsVisibility() {
- let askPermission =
- Services.prefs.getBoolPref("media.autoplay.ask-permission", false);
- let userGestures =
- Services.prefs.getBoolPref("media.autoplay.enabled.user-gestures-needed", false);
- // Hide the combobox if we don't let the user ask for permission.
- document.getElementById("autoplayMediaComboboxWrapper").hidden =
- !userGestures || !askPermission;
- // If the user may ask for permission, hide the checkbox instead.
- document.getElementById("autoplayMediaCheckboxWrapper").hidden =
- !userGestures || askPermission;
- },
-
- /**
- * Displays the autoplay exceptions dialog where specific site autoplay preferences
- * can be set.
- */
- showAutoplayMediaExceptions() {
- var params = {
- blockVisible: true, sessionVisible: false, allowVisible: true,
- prefilledHost: "", permissionType: "autoplay-media",
- };
-
- gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
- "resizable=yes", params);
- },
-
- // POP-UPS
-
- /**
- * Displays the popup exceptions dialog where specific site popup preferences
- * can be set.
- */
- showPopupExceptions() {
- var params = {
- blockVisible: false, sessionVisible: false, allowVisible: true,
- prefilledHost: "", permissionType: "popup",
- };
-
- gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
- "resizable=yes", params);
- },
-
- // UTILITY FUNCTIONS
-
- /**
- * Utility function to enable/disable the button specified by aButtonID based
- * on the value of the Boolean preference specified by aPreferenceID.
- */
- updateButtons(aButtonID, aPreferenceID) {
- var button = document.getElementById(aButtonID);
- var preference = Preferences.get(aPreferenceID);
- button.disabled = !preference.value;
- return undefined;
- },
-
- // BEGIN UI CODE
-
- /*
- * Preferences:
- *
- * dom.disable_open_during_load
- * - true if popups are blocked by default, false otherwise
- */
-
- // POP-UPS
-
- /**
- * Displays a dialog in which the user can view and modify the list of sites
- * where passwords are never saved.
- */
- showPasswordExceptions() {
- var params = {
- blockVisible: true,
- sessionVisible: false,
- allowVisible: false,
- hideStatusColumn: true,
- prefilledHost: "",
- permissionType: "login-saving",
- };
-
- gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
- null, params);
- },
-
- /**
- * Initializes master password UI: the "use master password" checkbox, selects
- * the master password button to show, and enables/disables it as necessary.
- * The master password is controlled by various bits of NSS functionality, so
- * the UI for it can't be controlled by the normal preference bindings.
- */
- _initMasterPasswordUI() {
- var noMP = !LoginHelper.isMasterPasswordSet();
-
- var button = document.getElementById("changeMasterPassword");
- button.disabled = noMP;
-
- var checkbox = document.getElementById("useMasterPassword");
- checkbox.checked = !noMP;
- checkbox.disabled = noMP && !Services.policies.isAllowed("createMasterPassword");
- },
-
- /**
- * Enables/disables the master password button depending on the state of the
- * "use master password" checkbox, and prompts for master password removal if
- * one is set.
- */
- updateMasterPasswordButton() {
- var checkbox = document.getElementById("useMasterPassword");
- var button = document.getElementById("changeMasterPassword");
- button.disabled = !checkbox.checked;
-
- // unchecking the checkbox should try to immediately remove the master
- // password, because it's impossible to non-destructively remove the master
- // password used to encrypt all the passwords without providing it (by
- // design), and it would be extremely odd to pop up that dialog when the
- // user closes the prefwindow and saves his settings
- if (!checkbox.checked)
- this._removeMasterPassword();
- else
- this.changeMasterPassword();
-
- this._initMasterPasswordUI();
- },
-
- /**
- * Displays the "remove master password" dialog to allow the user to remove
- * the current master password. When the dialog is dismissed, master password
- * UI is automatically updated.
- */
- _removeMasterPassword() {
- var secmodDB = Cc["@mozilla.org/security/pkcs11moduledb;1"].
- getService(Ci.nsIPKCS11ModuleDB);
- if (secmodDB.isFIPSEnabled) {
- var bundle = document.getElementById("bundlePreferences");
- Services.prompt.alert(window,
- bundle.getString("pw_change_failed_title"),
- bundle.getString("pw_change2empty_in_fips_mode"));
- this._initMasterPasswordUI();
- } else {
- gSubDialog.open("chrome://mozapps/content/preferences/removemp.xul",
- null, null, this._initMasterPasswordUI.bind(this));
- }
- },
-
- /**
- * Displays a dialog in which the master password may be changed.
- */
- changeMasterPassword() {
- gSubDialog.open("chrome://mozapps/content/preferences/changemp.xul",
- "resizable=no", null, this._initMasterPasswordUI.bind(this));
- },
-
- /**
- * Shows the sites where the user has saved passwords and the associated login
- * information.
- */
- showPasswords() {
- gSubDialog.open("chrome://passwordmgr/content/passwordManager.xul");
- },
-
- /**
- * Enables/disables the Exceptions button used to configure sites where
- * passwords are never saved. When browser is set to start in Private
- * Browsing mode, the "Remember passwords" UI is useless, so we disable it.
- */
- readSavePasswords() {
- var pref = Preferences.get("signon.rememberSignons");
- var excepts = document.getElementById("passwordExceptions");
-
- if (PrivateBrowsingUtils.permanentPrivateBrowsing) {
- document.getElementById("savePasswords").disabled = true;
- excepts.disabled = true;
- return false;
- }
- excepts.disabled = !pref.value;
- // don't override pref value in UI
- return undefined;
- },
-
- /**
- * Enables/disables the add-ons Exceptions button depending on whether
- * or not add-on installation warnings are displayed.
- */
- readWarnAddonInstall() {
- var warn = Preferences.get("xpinstall.whitelist.required");
- var exceptions = document.getElementById("addonExceptions");
-
- exceptions.disabled = !warn.value;
-
- // don't override the preference value
- return undefined;
- },
-
- _initSafeBrowsing() {
- let enableSafeBrowsing = document.getElementById("enableSafeBrowsing");
- let blockDownloads = document.getElementById("blockDownloads");
- let blockUncommonUnwanted = document.getElementById("blockUncommonUnwanted");
-
- let safeBrowsingPhishingPref = Preferences.get("browser.safebrowsing.phishing.enabled");
- let safeBrowsingMalwarePref = Preferences.get("browser.safebrowsing.malware.enabled");
-
- let blockDownloadsPref = Preferences.get("browser.safebrowsing.downloads.enabled");
- let malwareTable = Preferences.get("urlclassifier.malwareTable");
-
- let blockUnwantedPref = Preferences.get("browser.safebrowsing.downloads.remote.block_potentially_unwanted");
- let blockUncommonPref = Preferences.get("browser.safebrowsing.downloads.remote.block_uncommon");
-
- let learnMoreLink = document.getElementById("enableSafeBrowsingLearnMore");
- let phishingUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "phishing-malware";
- learnMoreLink.setAttribute("href", phishingUrl);
-
- enableSafeBrowsing.addEventListener("command", function() {
- safeBrowsingPhishingPref.value = enableSafeBrowsing.checked;
- safeBrowsingMalwarePref.value = enableSafeBrowsing.checked;
-
- if (enableSafeBrowsing.checked) {
- if (blockDownloads) {
- blockDownloads.removeAttribute("disabled");
- if (blockDownloads.checked) {
- blockUncommonUnwanted.removeAttribute("disabled");
- }
- } else {
- blockUncommonUnwanted.removeAttribute("disabled");
- }
- } else {
- if (blockDownloads) {
- blockDownloads.setAttribute("disabled", "true");
- }
- blockUncommonUnwanted.setAttribute("disabled", "true");
- }
- });
-
- if (blockDownloads) {
- blockDownloads.addEventListener("command", function() {
- blockDownloadsPref.value = blockDownloads.checked;
- if (blockDownloads.checked) {
- blockUncommonUnwanted.removeAttribute("disabled");
- } else {
- blockUncommonUnwanted.setAttribute("disabled", "true");
- }
- });
- }
-
- blockUncommonUnwanted.addEventListener("command", function() {
- blockUnwantedPref.value = blockUncommonUnwanted.checked;
- blockUncommonPref.value = blockUncommonUnwanted.checked;
-
- let malware = malwareTable.value
- .split(",")
- .filter(x => x !== "goog-unwanted-proto" &&
- x !== "goog-unwanted-shavar" &&
- x !== "test-unwanted-simple");
-
- if (blockUncommonUnwanted.checked) {
- if (malware.includes("goog-malware-shavar")) {
- malware.push("goog-unwanted-shavar");
- } else {
- malware.push("goog-unwanted-proto");
- }
-
- malware.push("test-unwanted-simple");
- }
-
- // sort alphabetically to keep the pref consistent
- malware.sort();
-
- malwareTable.value = malware.join(",");
-
- // Force an update after changing the malware table.
- let listmanager = Cc["@mozilla.org/url-classifier/listmanager;1"]
- .getService(Ci.nsIUrlListManager);
- if (listmanager) {
- listmanager.forceUpdates(malwareTable.value);
- }
- });
-
- // set initial values
-
- // Librefox
- if (Services.prefs.prefIsLocked("browser.safebrowsing.downloads.enabled")) {
- enableSafeBrowsing.setAttribute("disabled", "true");
- }
-
- enableSafeBrowsing.checked = safeBrowsingPhishingPref.value && safeBrowsingMalwarePref.value;
- if (!enableSafeBrowsing.checked) {
- if (blockDownloads) {
- blockDownloads.setAttribute("disabled", "true");
- }
-
- blockUncommonUnwanted.setAttribute("disabled", "true");
- }
-
- if (blockDownloads) {
- blockDownloads.checked = blockDownloadsPref.value;
- if (!blockDownloadsPref.value) {
- blockUncommonUnwanted.setAttribute("disabled", "true");
- }
- }
-
- blockUncommonUnwanted.checked = blockUnwantedPref.value && blockUncommonPref.value;
- },
-
- /**
- * Displays the exceptions lists for add-on installation warnings.
- */
- showAddonExceptions() {
- var params = this._addonParams;
-
- gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
- null, params);
- },
-
- /**
- * Parameters for the add-on install permissions dialog.
- */
- _addonParams:
- {
- blockVisible: false,
- sessionVisible: false,
- allowVisible: true,
- prefilledHost: "",
- permissionType: "install",
- },
-
- /**
- * readEnableOCSP is used by the preferences UI to determine whether or not
- * the checkbox for OCSP fetching should be checked (it returns true if it
- * should be checked and false otherwise). The about:config preference
- * "security.OCSP.enabled" is an integer rather than a boolean, so it can't be
- * directly mapped from {true,false} to {checked,unchecked}. The possible
- * values for "security.OCSP.enabled" are:
- * 0: fetching is disabled
- * 1: fetch for all certificates
- * 2: fetch only for EV certificates
- * Hence, if "security.OCSP.enabled" is non-zero, the checkbox should be
- * checked. Otherwise, it should be unchecked.
- */
- readEnableOCSP() {
- var preference = Preferences.get("security.OCSP.enabled");
- // This is the case if the preference is the default value.
- if (preference.value === undefined) {
- return true;
- }
- return preference.value != 0;
- },
-
- /**
- * writeEnableOCSP is used by the preferences UI to map the checked/unchecked
- * state of the OCSP fetching checkbox to the value that the preference
- * "security.OCSP.enabled" should be set to (it returns that value). See the
- * readEnableOCSP documentation for more background. We unfortunately don't
- * have enough information to map from {true,false} to all possible values for
- * "security.OCSP.enabled", but a reasonable alternative is to map from
- * {true,false} to {<the default value>,0}. That is, if the box is checked,
- * "security.OCSP.enabled" will be set to whatever default it should be, given
- * the platform and channel. If the box is unchecked, the preference will be
- * set to 0. Obviously this won't work if the default is 0, so we will have to
- * revisit this if we ever set it to 0.
- */
- writeEnableOCSP() {
- var checkbox = document.getElementById("enableOCSP");
- var defaults = Services.prefs.getDefaultBranch(null);
- var defaultValue = defaults.getIntPref("security.OCSP.enabled");
- return checkbox.checked ? defaultValue : 0;
- },
-
- /**
- * Displays the user's certificates and associated options.
- */
- showCertificates() {
- gSubDialog.open("chrome://pippki/content/certManager.xul");
- },
-
- /**
- * Displays a dialog from which the user can manage his security devices.
- */
- showSecurityDevices() {
- gSubDialog.open("chrome://pippki/content/device_manager.xul");
- },
-
- initDataCollection() {
- this._setupLearnMoreLink("toolkit.datacollection.infoURL",
- "dataCollectionPrivacyNotice");
- },
-
- initCollectBrowserErrors() {
- this._setupLearnMoreLink("browser.chrome.errorReporter.infoURL",
- "collectBrowserErrorsLearnMore");
- },
-
- initSubmitCrashes() {
- this._setupLearnMoreLink("toolkit.crashreporter.infoURL",
- "crashReporterLearnMore");
- },
-
- /**
- * Set up or hide the Learn More links for various data collection options
- */
- _setupLearnMoreLink(pref, element) {
- // set up the Learn More link with the correct URL
- let url = Services.urlFormatter.formatURLPref(pref);
- let el = document.getElementById(element);
-
- if (url) {
- el.setAttribute("href", url);
- } else {
- el.setAttribute("hidden", "true");
- }
- },
-
- /**
- * Initialize the health report service reference and checkbox.
- */
- initSubmitHealthReport() {
- this._setupLearnMoreLink("datareporting.healthreport.infoURL", "FHRLearnMore");
-
- let checkbox = document.getElementById("submitHealthReportBox");
-
- // Telemetry is only sending data if MOZ_TELEMETRY_REPORTING is defined.
- // We still want to display the preferences panel if that's not the case, but
- // we want it to be disabled and unchecked.
- if (Services.prefs.prefIsLocked(PREF_UPLOAD_ENABLED) ||
- !AppConstants.MOZ_TELEMETRY_REPORTING) {
- checkbox.setAttribute("disabled", "true");
- return;
- }
-
- checkbox.checked = Services.prefs.getBoolPref(PREF_UPLOAD_ENABLED) &&
- AppConstants.MOZ_TELEMETRY_REPORTING;
- },
-
- /**
- * Update the health report preference with state from checkbox.
- */
- updateSubmitHealthReport() {
- let checkbox = document.getElementById("submitHealthReportBox");
- Services.prefs.setBoolPref(PREF_UPLOAD_ENABLED, checkbox.checked);
- },
-
-
- /**
- * Initialize the opt-out-study preference checkbox into about:preferences and
- * handles events coming from the UI for it.
- */
- initOptOutStudyCheckbox(doc) {
- const allowedByPolicy = Services.policies.isAllowed("Shield");
- const checkbox = document.getElementById("optOutStudiesEnabled");
-
- function updateStudyCheckboxState() {
- // The checkbox should be disabled if any of the below are true. This
- // prevents the user from changing the value in the box.
- //
- // * the policy forbids shield
- // * the Shield Study preference is locked
- // * the FHR pref is false
- //
- // The checkbox should match the value of the preference only if all of
- // these are true. Otherwise, the checkbox should remain unchecked. This
- // is because in these situations, Shield studies are always disabled, and
- // so showing a checkbox would be confusing.
- //
- // * the policy allows Shield
- // * the FHR pref is true
- // * Normandy is enabled
-
- const checkboxMatchesPref = (
- allowedByPolicy &&
- Services.prefs.getBoolPref(PREF_UPLOAD_ENABLED, false) &&
- Services.prefs.getBoolPref(PREF_NORMANDY_ENABLED, false)
- );
-
- if (checkboxMatchesPref) {
- if (Services.prefs.getBoolPref(PREF_OPT_OUT_STUDIES_ENABLED, false)) {
- checkbox.setAttribute("checked", "checked");
- } else {
- checkbox.removeAttribute("checked");
- }
- checkbox.setAttribute("preference", PREF_OPT_OUT_STUDIES_ENABLED);
- } else {
- checkbox.removeAttribute("preference");
- checkbox.removeAttribute("checked");
- }
-
- const isDisabled = (
- !allowedByPolicy ||
- Services.prefs.prefIsLocked(PREF_OPT_OUT_STUDIES_ENABLED) ||
- !Services.prefs.getBoolPref(PREF_UPLOAD_ENABLED, false)
- );
-
- // We can't use checkbox.disabled here because the XBL binding may not be present,
- // in which case setting the property won't work properly.
- if (isDisabled) {
- checkbox.setAttribute("disabled", "true");
- } else {
- checkbox.removeAttribute("disabled");
- }
- }
- Preferences.get(PREF_UPLOAD_ENABLED).on("change", updateStudyCheckboxState);
- updateStudyCheckboxState();
- },
-
- observe(aSubject, aTopic, aData) {
- switch (aTopic) {
- case "sitedatamanager:updating-sites":
- // While updating, we want to disable this section and display loading message until updated
- this.toggleSiteData(false);
- this.showSiteDataLoading();
- break;
-
- case "sitedatamanager:sites-updated":
- this.toggleSiteData(true);
- SiteDataManager.getTotalUsage()
- .then(this.updateTotalDataSizeLabel.bind(this));
- break;
- }
- },
-
- // Accessibility checkbox helpers
- _initA11yState() {
- this._initA11yString();
- let checkbox = document.getElementById("a11yPrivacyCheckbox");
- switch (Services.prefs.getIntPref("accessibility.force_disabled")) {
- case 1: // access blocked
- checkbox.checked = true;
- break;
- case -1: // a11y is forced on for testing
- case 0: // access allowed
- checkbox.checked = false;
- break;
- }
- },
-
- _initA11yString() {
- let a11yLearnMoreLink =
- Services.urlFormatter.formatURLPref("accessibility.support.url");
- document.getElementById("a11yLearnMoreLink")
- .setAttribute("href", a11yLearnMoreLink);
- },
-
- async updateA11yPrefs(checked) {
- let buttonIndex = await confirmRestartPrompt(checked, 0, true, false);
- if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) {
- Services.prefs.setIntPref("accessibility.force_disabled", checked ? 1 : 0);
- Services.telemetry.scalarSet("preferences.prevent_accessibility_services", true);
- Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
- }
-
- // Revert the checkbox in case we didn't quit
- document.getElementById("a11yPrivacyCheckbox").checked = !checked;
- },
-};
diff --git a/dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js.patch b/dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js.patch
deleted file mode 100644
index 58b8b16..0000000
--- a/dev/omni-patching/browser/omni.ja/chrome/browser/content/browser/preferences/in-content/privacy.js.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- privacy.js 2010-01-01 00:00:00.000000000 +0100
-+++ privacy.patched.js 2018-12-11 17:08:48.076552654 +0100
-@@ -1746,6 +1746,11 @@
- });
-
- // set initial values
-+
-+ // Librefox
-+ if (Services.prefs.prefIsLocked("browser.safebrowsing.downloads.enabled")) {
-+ enableSafeBrowsing.setAttribute("disabled", "true");
-+ }
-
- enableSafeBrowsing.checked = safeBrowsingPhishingPref.value && safeBrowsingMalwarePref.value;
- if (!enableSafeBrowsing.checked) {
bgstack15