summaryrefslogtreecommitdiffstats
path: root/remote/shared/RecommendedPreferences.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'remote/shared/RecommendedPreferences.sys.mjs')
-rw-r--r--remote/shared/RecommendedPreferences.sys.mjs428
1 files changed, 428 insertions, 0 deletions
diff --git a/remote/shared/RecommendedPreferences.sys.mjs b/remote/shared/RecommendedPreferences.sys.mjs
new file mode 100644
index 0000000000..27991e2332
--- /dev/null
+++ b/remote/shared/RecommendedPreferences.sys.mjs
@@ -0,0 +1,428 @@
+/* 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 { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ Preferences: "resource://gre/modules/Preferences.sys.mjs",
+
+ Log: "chrome://remote/content/shared/Log.sys.mjs",
+});
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "useRecommendedPrefs",
+ "remote.prefs.recommended",
+ false
+);
+
+XPCOMUtils.defineLazyGetter(lazy, "logger", () => lazy.Log.get());
+
+// Ensure we are in the parent process.
+if (Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) {
+ throw new Error(
+ "RecommendedPreferences should only be loaded in the parent process"
+ );
+}
+
+// ALL CHANGES TO THIS LIST MUST HAVE REVIEW FROM A WEBDRIVER PEER!
+//
+// Preferences are set for automation on startup, unless
+// remote.prefs.recommended has been set to false.
+//
+// Note: Clients do not always use the latest version of the application. As
+// such backward compatibility has to be ensured at least for the last three
+// releases.
+
+// INSTRUCTIONS TO ADD A NEW PREFERENCE
+//
+// Preferences for remote control and automation can be set from several entry
+// points:
+// - remote/shared/RecommendedPreferences.sys.mjs
+// - remote/test/puppeteer/packages/browsers/src/browser-data/firefox.ts
+// - testing/geckodriver/src/prefs.rs
+// - testing/marionette/client/marionette_driver/geckoinstance.py
+//
+// The preferences in `firefox.ts`, `prefs.rs` and `geckoinstance.py`
+// will be applied before the application starts, and should typically be used
+// for preferences which cannot be updated during the lifetime of the application.
+//
+// The preferences in `RecommendedPreferences.sys.mjs` are applied after
+// the application has started, which means that the application must apply this
+// change dynamically and behave correctly. Note that you can also define
+// protocol specific preferences (CDP, WebDriver, ...) which are merged with the
+// COMMON_PREFERENCES from `RecommendedPreferences.sys.mjs`.
+//
+// Additionally, users relying on the Marionette Python client (ie. using
+// geckoinstance.py) set `remote.prefs.recommended = false`. This means that
+// preferences from `RecommendedPreferences.sys.mjs` are not applied and have to
+// be added to the list of preferences in that Python file. Note that there are
+// several lists of preferences, either common or specific to a given application
+// (Firefox Desktop, Fennec, Thunderbird).
+//
+// Depending on how users interact with the Remote Agent, they will use different
+// combinations of preferences. So it's important to update the preferences files
+// so that all users have the proper preferences.
+//
+// When adding a new preference, follow this guide to decide where to add it:
+// - Add the preference to `geckoinstance.py`
+// - If the preference has to be set before startup:
+// - Add the preference to `prefs.rs`
+// - Add the preference `browser-data/firefox.ts` in the puppeteer folder
+// - Create a PR to upstream the change on `browser-data/firefox.ts` to puppeteer
+// - Otherwise, if the preference can be set after startup:
+// - Add the preference to `RecommendedPreferences.sys.mjs`
+const COMMON_PREFERENCES = new Map([
+ // Make sure Shield doesn't hit the network.
+ ["app.normandy.api_url", ""],
+
+ // Disable automatically upgrading Firefox
+ //
+ // Note: This preference should have already been set by the client when
+ // creating the profile. But if not and to absolutely make sure that updates
+ // of Firefox aren't downloaded and applied, enforce its presence.
+ ["app.update.disabledForTesting", true],
+
+ // Increase the APZ content response timeout in tests to 1 minute.
+ // This is to accommodate the fact that test environments tends to be
+ // slower than production environments (with the b2g emulator being
+ // the slowest of them all), resulting in the production timeout value
+ // sometimes being exceeded and causing false-positive test failures.
+ //
+ // (bug 1176798, bug 1177018, bug 1210465)
+ ["apz.content_response_timeout", 60000],
+
+ // Don't show the content blocking introduction panel.
+ // We use a larger number than the default 22 to have some buffer
+ // This can be removed once Firefox 69 and 68 ESR and are no longer supported.
+ ["browser.contentblocking.introCount", 99],
+
+ // Indicate that the download panel has been shown once so that
+ // whichever download test runs first doesn't show the popup
+ // inconsistently.
+ ["browser.download.panel.shown", true],
+
+ // Always display a blank page
+ ["browser.newtabpage.enabled", false],
+
+ // Background thumbnails in particular cause grief, and disabling
+ // thumbnails in general cannot hurt
+ ["browser.pagethumbnails.capturing_disabled", true],
+
+ // Disable geolocation ping(#1)
+ ["browser.region.network.url", ""],
+
+ // Disable safebrowsing components.
+ //
+ // These should also be set in the profile prior to starting Firefox,
+ // as it is picked up at runtime.
+ ["browser.safebrowsing.blockedURIs.enabled", false],
+ ["browser.safebrowsing.downloads.enabled", false],
+ ["browser.safebrowsing.malware.enabled", false],
+ ["browser.safebrowsing.passwords.enabled", false],
+ ["browser.safebrowsing.phishing.enabled", false],
+
+ // Disable updates to search engines.
+ //
+ // Should be set in profile.
+ ["browser.search.update", false],
+
+ // Do not restore the last open set of tabs if the browser has crashed
+ ["browser.sessionstore.resume_from_crash", false],
+
+ // Don't check for the default web browser during startup.
+ //
+ // These should also be set in the profile prior to starting Firefox,
+ // as it is picked up at runtime.
+ ["browser.shell.checkDefaultBrowser", false],
+
+ // Disable session restore infobar
+ ["browser.startup.couldRestoreSession.count", -1],
+
+ // Do not redirect user when a milstone upgrade of Firefox is detected
+ ["browser.startup.homepage_override.mstone", "ignore"],
+
+ // Do not close the window when the last tab gets closed
+ ["browser.tabs.closeWindowWithLastTab", false],
+
+ // Do not allow background tabs to be zombified on Android, otherwise for
+ // tests that open additional tabs, the test harness tab itself might get
+ // unloaded
+ ["browser.tabs.disableBackgroundZombification", false],
+
+ // Don't unload tabs when available memory is running low
+ ["browser.tabs.unloadOnLowMemory", false],
+
+ // Do not warn when closing all open tabs
+ ["browser.tabs.warnOnClose", false],
+
+ // Do not warn when closing all other open tabs
+ ["browser.tabs.warnOnCloseOtherTabs", false],
+
+ // Do not warn when multiple tabs will be opened
+ ["browser.tabs.warnOnOpen", false],
+
+ // Don't show the Bookmarks Toolbar on any tab (the above pref that
+ // disables the New Tab Page ends up showing the toolbar on about:blank).
+ ["browser.toolbars.bookmarks.visibility", "never"],
+
+ // Make sure Topsites doesn't hit the network to retrieve tiles from Contile.
+ ["browser.topsites.contile.enabled", false],
+
+ // Disable first run splash page on Windows 10
+ ["browser.usedOnWindows10.introURL", ""],
+
+ // Turn off Merino suggestions in the location bar so as not to trigger
+ // network connections.
+ ["browser.urlbar.merino.endpointURL", ""],
+
+ // Turn off search suggestions in the location bar so as not to trigger
+ // network connections.
+ ["browser.urlbar.suggest.searches", false],
+
+ // Do not warn on quitting Firefox
+ ["browser.warnOnQuit", false],
+
+ // Do not show datareporting policy notifications which can
+ // interfere with tests
+ [
+ "datareporting.healthreport.documentServerURI",
+ "http://%(server)s/dummy/healthreport/",
+ ],
+ ["datareporting.healthreport.logging.consoleEnabled", false],
+ ["datareporting.healthreport.service.enabled", false],
+ ["datareporting.healthreport.service.firstRun", false],
+ ["datareporting.healthreport.uploadEnabled", false],
+ ["datareporting.policy.dataSubmissionEnabled", false],
+ ["datareporting.policy.dataSubmissionPolicyAccepted", false],
+ ["datareporting.policy.dataSubmissionPolicyBypassNotification", true],
+
+ // Disable popup-blocker
+ ["dom.disable_open_during_load", false],
+
+ // Enabling the support for File object creation in the content process
+ ["dom.file.createInChild", true],
+
+ // Disable delayed user input event handling
+ ["dom.input_events.security.minNumTicks", 0],
+ ["dom.input_events.security.minTimeElapsedInMS", 0],
+
+ // Disable the ProcessHangMonitor
+ ["dom.ipc.reportProcessHangs", false],
+
+ // Disable slow script dialogues
+ ["dom.max_chrome_script_run_time", 0],
+ ["dom.max_script_run_time", 0],
+
+ // Disable location change rate limitation
+ ["dom.navigation.locationChangeRateLimit.count", 0],
+
+ // DOM Push
+ ["dom.push.connection.enabled", false],
+
+ // Screen Orientation API
+ ["dom.screenorientation.allow-lock", true],
+
+ // Disable dialog abuse if alerts are triggered too quickly.
+ ["dom.successive_dialog_time_limit", 0],
+
+ // Only load extensions from the application and user profile
+ // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
+ //
+ // Should be set in profile.
+ ["extensions.autoDisableScopes", 0],
+ ["extensions.enabledScopes", 5],
+
+ // Disable metadata caching for installed add-ons by default
+ ["extensions.getAddons.cache.enabled", false],
+
+ // Disable installing any distribution extensions or add-ons.
+ // Should be set in profile.
+ ["extensions.installDistroAddons", false],
+
+ // Turn off extension updates so they do not bother tests
+ ["extensions.update.enabled", false],
+ ["extensions.update.notifyUser", false],
+
+ // Make sure opening about:addons will not hit the network
+ ["extensions.getAddons.discovery.api_url", "data:, "],
+
+ // Redirect various extension update URLs
+ [
+ "extensions.blocklist.detailsURL",
+ "http://%(server)s/extensions-dummy/blocklistDetailsURL",
+ ],
+ [
+ "extensions.blocklist.itemURL",
+ "http://%(server)s/extensions-dummy/blocklistItemURL",
+ ],
+ ["extensions.hotfix.url", "http://%(server)s/extensions-dummy/hotfixURL"],
+ [
+ "extensions.systemAddon.update.url",
+ "http://%(server)s/dummy-system-addons.xml",
+ ],
+ [
+ "extensions.update.background.url",
+ "http://%(server)s/extensions-dummy/updateBackgroundURL",
+ ],
+ ["extensions.update.url", "http://%(server)s/extensions-dummy/updateURL"],
+
+ // Make sure opening about: addons won't hit the network
+ ["extensions.getAddons.discovery.api_url", "data:, "],
+ [
+ "extensions.getAddons.get.url",
+ "http://%(server)s/extensions-dummy/repositoryGetURL",
+ ],
+ [
+ "extensions.getAddons.search.browseURL",
+ "http://%(server)s/extensions-dummy/repositoryBrowseURL",
+ ],
+
+ // Allow the application to have focus even it runs in the background
+ ["focusmanager.testmode", true],
+
+ // Disable useragent updates
+ ["general.useragent.updates.enabled", false],
+
+ // Disable geolocation ping(#2)
+ ["geo.provider.network.url", ""],
+
+ // Always use network provider for geolocation tests so we bypass the
+ // macOS dialog raised by the corelocation provider
+ ["geo.provider.testing", true],
+
+ // Do not scan Wifi
+ ["geo.wifi.scan", false],
+
+ // Disable Firefox accounts ping
+ ["identity.fxaccounts.auth.uri", "https://{server}/dummy/fxa"],
+
+ // Disable connectivity service pings
+ ["network.connectivity-service.enabled", false],
+
+ // Do not prompt with long usernames or passwords in URLs
+ ["network.http.phishy-userpass-length", 255],
+
+ // Do not prompt for temporary redirects
+ ["network.http.prompt-temp-redirect", false],
+
+ // Do not automatically switch between offline and online
+ ["network.manage-offline-status", false],
+
+ // Make sure SNTP requests do not hit the network
+ ["network.sntp.pools", "%(server)s"],
+
+ // Privacy and Tracking Protection
+ ["privacy.trackingprotection.enabled", false],
+
+ // Don't do network connections for mitm priming
+ ["security.certerrors.mitm.priming.enabled", false],
+
+ // Local documents have access to all other local documents,
+ // including directory listings
+ ["security.fileuri.strict_origin_policy", false],
+
+ // Tests do not wait for the notification button security delay
+ ["security.notification_enable_delay", 0],
+
+ // Do not download intermediate certificates
+ ["security.remote_settings.intermediates.enabled", false],
+
+ // Ensure remote settings do not hit the network
+ ["services.settings.server", "data:,#remote-settings-dummy/v1"],
+
+ // Do not automatically fill sign-in forms with known usernames and
+ // passwords
+ ["signon.autofillForms", false],
+
+ // Disable password capture, so that tests that include forms are not
+ // influenced by the presence of the persistent doorhanger notification
+ ["signon.rememberSignons", false],
+
+ // Disable first-run welcome page
+ ["startup.homepage_welcome_url", "about:blank"],
+ ["startup.homepage_welcome_url.additional", ""],
+
+ // Prevent starting into safe mode after application crashes
+ ["toolkit.startup.max_resumed_crashes", -1],
+
+ // Disable all telemetry pings
+ ["toolkit.telemetry.server", "https://%(server)s/telemetry-dummy/"],
+
+ // Disable window occlusion on Windows, which can prevent webdriver commands
+ // such as WebDriver:FindElements from working properly (Bug 1802473).
+ ["widget.windows.window_occlusion_tracking.enabled", false],
+]);
+
+export const RecommendedPreferences = {
+ alteredPrefs: new Set(),
+
+ isInitialized: false,
+
+ /**
+ * Apply the provided map of preferences.
+ * They will be automatically reset on application shutdown.
+ *
+ * @param {Map} preferences
+ * Map of preference key to preference value.
+ */
+ applyPreferences(preferences) {
+ if (!lazy.useRecommendedPrefs) {
+ // If remote.prefs.recommended is set to false, do not set any preference
+ // here. Needed for our Firefox CI.
+ return;
+ }
+
+ // Only apply common recommended preferences on first call to
+ // applyPreferences.
+ if (!this.isInitialized) {
+ // Merge common preferences and provided preferences in a single map.
+ preferences = new Map([...COMMON_PREFERENCES, ...preferences]);
+ Services.obs.addObserver(this, "quit-application");
+ this.isInitialized = true;
+ }
+
+ for (const [k, v] of preferences) {
+ if (!lazy.Preferences.isSet(k)) {
+ lazy.logger.debug(`Setting recommended pref ${k} to ${v}`);
+ lazy.Preferences.set(k, v);
+
+ // Keep track all the altered preferences to restore them on
+ // quit-application.
+ this.alteredPrefs.add(k);
+ }
+ }
+ },
+
+ observe(subject, topic) {
+ if (topic === "quit-application") {
+ Services.obs.removeObserver(this, "quit-application");
+ this.restoreAllPreferences();
+ }
+ },
+
+ /**
+ * Restore all the altered preferences.
+ */
+ restoreAllPreferences() {
+ this.restorePreferences(this.alteredPrefs);
+ this.isInitialized = false;
+ },
+
+ /**
+ * Restore provided preferences.
+ *
+ * @param {Map} preferences
+ * Map of preferences that should be restored.
+ */
+ restorePreferences(preferences) {
+ for (const k of preferences.keys()) {
+ lazy.logger.debug(`Resetting recommended pref ${k}`);
+ lazy.Preferences.reset(k);
+ this.alteredPrefs.delete(k);
+ }
+ },
+};