diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index 531798ca7fb5..8a2c91e04913 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -134,15 +134,8 @@ pref("app.update.download.promptMaxAttempts", 2);
pref("app.update.elevation.promptMaxAttempts", 2);
// If set to true, the Update Service will automatically download updates if the
-// user can apply updates. This pref is no longer used on Windows, except as the
-// default value to migrate to the new location that this data is now stored
-// (which is in a file in the update directory). Because of this, this pref
-// should no longer be used directly. Instead,
-// nsIUpdateService::getAutoUpdateIsEnabled and
-// nsIUpdateService::setAutoUpdateIsEnabled should be used.
-#ifndef XP_WIN
+// user can apply updates.
pref("app.update.auto", true);
-#endif
// If set to true, the Update Service will present no UI for any event.
pref("app.update.silent", false);
diff --git a/browser/base/content/aboutDialog-appUpdater.js b/browser/base/content/aboutDialog-appUpdater.js
index 555edc84b505..e838169cdf31 100644
--- a/browser/base/content/aboutDialog-appUpdater.js
+++ b/browser/base/content/aboutDialog-appUpdater.js
@@ -40,7 +40,6 @@ function appUpdater(options = {}) {
this.options = options;
this.updateDeck = document.getElementById("updateDeck");
- this.promiseAutoUpdateSetting = null;
// Hide the update deck when the update window is already open and it's not
// already applied, to avoid syncing issues between them. Applied updates
@@ -82,9 +81,6 @@ function appUpdater(options = {}) {
return;
}
- // We might need this value later, so start loading it from the disk now.
- this.promiseAutoUpdateSetting = this.aus.getAutoUpdateIsEnabled();
-
// That leaves the options
// "Check for updates, but let me choose whether to install them", and
// "Automatically install updates".
@@ -140,6 +136,14 @@ appUpdater.prototype =
gAppUpdater.aus.canStageUpdates;
},
+ // true when updating is automatic.
+ get updateAuto() {
+ try {
+ return Services.prefs.getBoolPref("app.update.auto");
+ } catch (e) { }
+ return true; // Firefox default is true
+ },
+
/**
* Sets the panel of the updateDeck.
*
@@ -256,16 +260,10 @@ appUpdater.prototype =
return;
}
- if (this.promiseAutoUpdateSetting == null) {
- this.promiseAutoUpdateSetting = this.aus.getAutoUpdateIsEnabled();
- }
- this.promiseAutoUpdateSetting.then(updateAuto => {
- if (updateAuto) { // automatically download and install
- gAppUpdater.startDownload();
- } else { // ask
- gAppUpdater.selectPanel("downloadAndInstall");
- }
- });
+ if (gAppUpdater.updateAuto) // automatically download and install
+ gAppUpdater.startDownload();
+ else // ask
+ gAppUpdater.selectPanel("downloadAndInstall");
},
/**
diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js
index 4a1683f11b56..8014580eba63 100644
--- a/browser/components/preferences/in-content/main.js
+++ b/browser/components/preferences/in-content/main.js
@@ -20,7 +20,6 @@ ChromeUtils.defineModuleGetter(this, "CloudStorage",
"resource://gre/modules/CloudStorage.jsm");
XPCOMUtils.defineLazyServiceGetters(this, {
- gAUS: ["@mozilla.org/updates/update-service;1", "nsIApplicationUpdateService"],
gHandlerService: ["@mozilla.org/uriloader/handler-service;1", "nsIHandlerService"],
gMIMEService: ["@mozilla.org/mime;1", "nsIMIMEService"],
});
@@ -44,8 +43,6 @@ const PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS =
// Strings to identify ExtensionSettingsStore overrides
const CONTAINERS_KEY = "privacy.containers";
-const AUTO_UPDATE_CHANGED_TOPIC = "auto-update-config-change";
-
// The nsHandlerInfoAction enumeration values in nsIHandlerInfo identify
// the actions the application can take with content of various types.
// But since nsIHandlerInfo doesn't support plugins, there's no value
@@ -178,6 +175,7 @@ if (AppConstants.platform === "win") {
if (AppConstants.MOZ_UPDATER) {
Preferences.addAll([
+ { id: "app.update.auto", type: "bool" },
{ id: "app.update.disable_button.showUpdateHistory", type: "bool" },
]);
@@ -483,14 +481,6 @@ var gMainPane = {
if (AppConstants.MOZ_MAINTENANCE_SERVICE) {
document.getElementById("useService").hidden = true;
}
- } else {
- // Start with no option selected since we are still reading the value
- document.getElementById("autoDesktop").removeAttribute("selected");
- document.getElementById("manualDesktop").removeAttribute("selected");
- // Start reading the correct value from the disk
- this.updateReadPrefs();
- setEventListener("updateRadioGroup", "command",
- gMainPane.updateWritePrefs);
}
if (AppConstants.MOZ_MAINTENANCE_SERVICE) {
@@ -519,7 +509,6 @@ var gMainPane = {
// the view when they change.
Services.prefs.addObserver(PREF_SHOW_PLUGINS_IN_LIST, this);
Services.prefs.addObserver(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS, this);
- Services.obs.addObserver(this, AUTO_UPDATE_CHANGED_TOPIC);
setEventListener("filter", "command", gMainPane.filter);
setEventListener("typeColumn", "click", gMainPane.sort);
@@ -1285,57 +1274,6 @@ var gMainPane = {
}
},
- /**
- * Selects the correct item in the update radio group
- */
- async updateReadPrefs() {
- if (AppConstants.MOZ_UPDATER &&
- (!Services.policies || Services.policies.isAllowed("appUpdate"))) {
- let radiogroup = document.getElementById("updateRadioGroup");
- radiogroup.disabled = true;
- try {
- let enabled = await gAUS.getAutoUpdateIsEnabled();
- radiogroup.value = enabled;
- radiogroup.disabled = false;
- } catch (error) {
- Cu.reportError(error);
- }
- }
- },
-
- /**
- * Writes the value of the update radio group to the disk
- */
- async updateWritePrefs() {
- if (AppConstants.MOZ_UPDATER &&
- (!Services.policies || Services.policies.isAllowed("appUpdate"))) {
- let radiogroup = document.getElementById("updateRadioGroup");
- let updateAutoValue = (radiogroup.value == "true");
- radiogroup.disabled = true;
- try {
- await gAUS.setAutoUpdateIsEnabled(updateAutoValue);
- radiogroup.disabled = false;
- } catch (error) {
- Cu.reportError(error);
- await this.updateReadPrefs();
- await this.reportUpdatePrefWriteError(error);
- }
- }
- },
-
- async reportUpdatePrefWriteError(error) {
- let [title, message] = await document.l10n.formatValues([
- {id: "update-pref-write-failure-title"},
- {id: "update-pref-write-failure-message", args: {path: error.path}},
- ]);
-
- // Set up the Ok Button
- let buttonFlags = (Services.prompt.BUTTON_POS_0 *
- Services.prompt.BUTTON_TITLE_OK);
- Services.prompt.confirmEx(window, title, message, buttonFlags,
- null, null, null, null, {});
- },
-
/**
* Displays the history of installed updates.
*/
@@ -1349,8 +1287,6 @@ var gMainPane = {
Services.prefs.removeObserver(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS, this);
Services.prefs.removeObserver(PREF_CONTAINERS_EXTENSION, this);
-
- Services.obs.removeObserver(this, AUTO_UPDATE_CHANGED_TOPIC);
},
@@ -1381,11 +1317,6 @@ var gMainPane = {
// the view when any of them changes.
this._rebuildView();
}
- } else if (aTopic == AUTO_UPDATE_CHANGED_TOPIC) {
- if (aData != "true" && aData != "false") {
- throw new Error("Invalid preference value for app.update.auto");
- }
- document.getElementById("updateRadioGroup").value = aData;
}
},
diff --git a/browser/components/preferences/in-content/main.xul b/browser/components/preferences/in-content/main.xul
index 70418ccff070..cb9ef156f31c 100644
--- a/browser/components/preferences/in-content/main.xul
+++ b/browser/components/preferences/in-content/main.xul
@@ -560,12 +560,11 @@
#ifdef MOZ_UPDATER
-
+
-
#ifdef MOZ_MAINTENANCE_SERVICE
diff --git a/browser/locales/en-US/browser/preferences/preferences.ftl b/browser/locales/en-US/browser/preferences/preferences.ftl
index 0d85a5e6c29a..f773af8b8ae0 100644
--- a/browser/locales/en-US/browser/preferences/preferences.ftl
+++ b/browser/locales/en-US/browser/preferences/preferences.ftl
@@ -360,12 +360,6 @@ update-enable-search-update =
.label = Automatically update search engines
.accesskey = e
-update-pref-write-failure-title = Write Failure
-
-# Variables:
-# $path (String) - Path to the configuration file
-update-pref-write-failure-message = Unable to save preference. Could not write to file: { $path }
-
## General Section - Performance
performance-title = Performance
diff --git a/toolkit/components/telemetry/app/TelemetryEnvironment.jsm b/toolkit/components/telemetry/app/TelemetryEnvironment.jsm
index 5b1b4780eba5..6a665d204377 100644
--- a/toolkit/components/telemetry/app/TelemetryEnvironment.jsm
+++ b/toolkit/components/telemetry/app/TelemetryEnvironment.jsm
@@ -184,6 +184,7 @@ const DEFAULT_ENVIRONMENT_PREFS = new Map([
["accessibility.browsewithcaret", {what: RECORD_PREF_VALUE}],
["accessibility.force_disabled", {what: RECORD_PREF_VALUE}],
["app.shield.optoutstudies.enabled", {what: RECORD_PREF_VALUE}],
+ ["app.update.auto", {what: RECORD_PREF_VALUE}],
["app.update.interval", {what: RECORD_PREF_VALUE}],
["app.update.service.enabled", {what: RECORD_PREF_VALUE}],
["app.update.silent", {what: RECORD_PREF_VALUE}],
@@ -266,6 +267,7 @@ const PREF_DISTRIBUTOR = "app.distributor";
const PREF_DISTRIBUTOR_CHANNEL = "app.distributor.channel";
const PREF_APP_PARTNER_BRANCH = "app.partner.";
const PREF_PARTNER_ID = "mozilla.partner.id";
+const PREF_UPDATE_AUTODOWNLOAD = "app.update.auto";
const PREF_SEARCH_COHORT = "browser.search.cohort";
const COMPOSITOR_CREATED_TOPIC = "compositor:created";
@@ -277,7 +279,6 @@ const SEARCH_SERVICE_TOPIC = "browser-search-service";
const SESSIONSTORE_WINDOWS_RESTORED_TOPIC = "sessionstore-windows-restored";
const PREF_CHANGED_TOPIC = "nsPref:changed";
const BLOCKLIST_LOADED_TOPIC = "blocklist-loaded";
-const AUTO_UPDATE_PREF_CHANGE_TOPIC = "auto-update-config-change";
/**
* Enforces the parameter to a boolean value.
@@ -901,7 +902,6 @@ function EnvironmentCache() {
if (AppConstants.MOZ_BUILD_APP == "browser") {
p.push(this._loadAttributionAsync());
}
- p.push(this._loadAutoUpdateAsync());
for (const [id, {branch, options}] of gActiveExperimentStartupBuffer.entries()) {
this.setExperimentActive(id, branch, options);
@@ -1152,7 +1152,6 @@ EnvironmentCache.prototype = {
Services.obs.addObserver(this, GFX_FEATURES_READY_TOPIC);
Services.obs.addObserver(this, SEARCH_ENGINE_MODIFIED_TOPIC);
Services.obs.addObserver(this, SEARCH_SERVICE_TOPIC);
- Services.obs.addObserver(this, AUTO_UPDATE_PREF_CHANGE_TOPIC);
},
_removeObservers() {
@@ -1165,7 +1164,6 @@ EnvironmentCache.prototype = {
Services.obs.removeObserver(this, GFX_FEATURES_READY_TOPIC);
Services.obs.removeObserver(this, SEARCH_ENGINE_MODIFIED_TOPIC);
Services.obs.removeObserver(this, SEARCH_SERVICE_TOPIC);
- Services.obs.removeObserver(this, AUTO_UPDATE_PREF_CHANGE_TOPIC);
},
observe(aSubject, aTopic, aData) {
@@ -1219,9 +1217,6 @@ EnvironmentCache.prototype = {
this._onPrefChanged(aData);
}
break;
- case AUTO_UPDATE_PREF_CHANGE_TOPIC:
- this._currentEnvironment.settings.update.autoDownload = (aData == "true");
- break;
}
},
@@ -1417,6 +1412,7 @@ EnvironmentCache.prototype = {
update: {
channel: updateChannel,
enabled: !Services.policies || Services.policies.isAllowed("appUpdate"),
+ autoDownload: Services.prefs.getBoolPref(PREF_UPDATE_AUTODOWNLOAD, true),
},
userPrefs: this._getPrefData(),
sandbox: this._getSandboxData(),
@@ -1428,7 +1424,6 @@ EnvironmentCache.prototype = {
this._updateAttribution();
this._updateDefaultBrowser();
this._updateSearchEngine();
- this._updateAutoDownload();
},
_getSandboxData() {
@@ -1506,27 +1501,6 @@ EnvironmentCache.prototype = {
this._currentEnvironment.settings.attribution = attributionData;
},
- /**
- * Load the auto update pref and adds it to the environment
- */
- async _loadAutoUpdateAsync() {
- let aus = Cc["@mozilla.org/updates/update-service;1"]
- .getService(Ci.nsIApplicationUpdateService);
- this._updateAutoDownloadCache = await aus.getAutoUpdateIsEnabled();
- this._updateAutoDownload();
- },
-
- /**
- * Update the environment with the cached value for whether updates can auto-
- * download.
- */
- _updateAutoDownload() {
- if (this._updateAutoDownloadCache === undefined) {
- return;
- }
- this._currentEnvironment.settings.update.autoDownload = this._updateAutoDownloadCache;
- },
-
/**
* Get the partner data in object form.
* @return Object containing the partner data.
diff --git a/toolkit/mozapps/update/nsIUpdateService.idl b/toolkit/mozapps/update/nsIUpdateService.idl
index cea128504775..ce5914fd9129 100644
--- a/toolkit/mozapps/update/nsIUpdateService.idl
+++ b/toolkit/mozapps/update/nsIUpdateService.idl
@@ -362,48 +362,6 @@ interface nsIApplicationUpdateService : nsISupports
*/
readonly attribute boolean canCheckForUpdates;
- /**
- * Determines whether or not the Update Service automatically downloads and
- * installs updates. This corresponds to whether or not the user has selected
- * "Automatically install updates" in about:preferences.
- *
- * On Windows, this setting is shared across all profiles for the
- * installation. On other operating systems, this setting is stored in a pref
- * and is thus a per-profile setting.
- *
- * Note: On Windows, this setting is stored in a file on the disk, so this
- * operation involves reading that file.
- *
- * @return A Promise that resolves with a boolean.
- */
- jsval getAutoUpdateIsEnabled();
-
- /**
- * Toggles whether the Update Service automatically downloads and installs
- * updates. This effectively selects between the "Automatically install
- * updates" and "Check for updates but let you choose to install them" options
- * in about:preferences.
- *
- * On Windows, this setting is shared across all profiles for the
- * installation. On other operating systems, this setting is stored in a pref
- * and is thus a per-profile setting.
- *
- * Note: On Windows, this setting is stored in a file on disk, so this
- * operation involves writing to that file.
- *
- * @param enabled If set to true, automatic download and installation of
- * updates will be enabled. If set to false, this will be
- * disabled.
- * @return A Promise that, once the setting has been saved, resolves with the
- * boolean value that was saved. If the setting could not be
- * successfully saved, the Promise will reject.
- * On Windows, where this setting is stored in a file, this Promise
- * may reject with an I/O error.
- * On other operating systems, this promise should not reject as
- * this operation simply sets a pref.
- */
- jsval setAutoUpdateIsEnabled(in boolean enabled);
-
/**
* Whether or not the installation requires elevation. Currently only
* implemented on OSX, returns false on other platforms.
diff --git a/toolkit/mozapps/update/nsUpdateService.js b/toolkit/mozapps/update/nsUpdateService.js
index 96f160fb078c..a3c390461353 100644
--- a/toolkit/mozapps/update/nsUpdateService.js
+++ b/toolkit/mozapps/update/nsUpdateService.js
@@ -12,19 +12,12 @@ ChromeUtils.import("resource://gre/modules/Services.jsm", this);
ChromeUtils.import("resource://gre/modules/ctypes.jsm", this);
ChromeUtils.import("resource://gre/modules/UpdateTelemetry.jsm", this);
ChromeUtils.import("resource://gre/modules/AppConstants.jsm", this);
-ChromeUtils.import("resource://gre/modules/osfile.jsm", this);
XPCOMUtils.defineLazyGlobalGetters(this, ["DOMParser", "XMLHttpRequest"]);
const UPDATESERVICE_CID = Components.ID("{B3C290A6-3943-4B89-8BBE-C01EB7B3B311}");
const PREF_APP_UPDATE_ALTWINDOWTYPE = "app.update.altwindowtype";
-// Do not use PREF_APP_UPDATE_AUTO directly! Call getAutoUpdateIsEnabled or
-// setAutoUpdateIsEnabled.
-// See nsIApplicationUpdateService::getAutoUpdateIsEnabled and
-// nsIApplicationUpdateService::setAutoUpdateIsEnabled in nsIUpdateService.idl
-// for additional details.
const PREF_APP_UPDATE_AUTO = "app.update.auto";
-const PREF_APP_UPDATE_AUTO_MIGRATED = "app.update.auto.migrated";
const PREF_APP_UPDATE_BACKGROUNDINTERVAL = "app.update.download.backgroundInterval";
const PREF_APP_UPDATE_BACKGROUNDERRORS = "app.update.backgroundErrors";
const PREF_APP_UPDATE_BACKGROUNDMAXERRORS = "app.update.backgroundMaxErrors";
@@ -53,14 +46,6 @@ const PREF_APP_UPDATE_SOCKET_RETRYTIMEOUT = "app.update.socket.retryTimeout";
const PREF_APP_UPDATE_STAGING_ENABLED = "app.update.staging.enabled";
const PREF_APP_UPDATE_URL = "app.update.url";
const PREF_APP_UPDATE_URL_DETAILS = "app.update.url.details";
-// Note that although this value has the same format as those above, it is very
-// different. It is not stored as part of the user's prefs. Instead it is stored
-// in the file indicated by FILE_UPDATE_CONFIG_JSON , which will be located in
-// the update directory. This allows it to be accessible from all Firefox
-// profiles and from the Background Update Agent.
-const CONFIG_APP_UPDATE_AUTO = "app.update.auto";
-// The default value for the above setting
-const DEFAULT_APP_UPDATE_AUTO = true;
const URI_BRAND_PROPERTIES = "chrome://branding/locale/brand.properties";
const URI_UPDATE_HISTORY_DIALOG = "chrome://mozapps/content/update/history.xul";
@@ -77,7 +62,6 @@ const FILE_ACTIVE_UPDATE_XML = "active-update.xml";
const FILE_BACKUP_UPDATE_LOG = "backup-update.log";
const FILE_LAST_UPDATE_LOG = "last-update.log";
const FILE_UPDATES_XML = "updates.xml";
-const FILE_UPDATE_CONFIG_JSON = "update-config.json";
const FILE_UPDATE_LOG = "update.log";
const FILE_UPDATE_MAR = "update.mar";
const FILE_UPDATE_STATUS = "update.status";
@@ -230,8 +214,6 @@ XPCOMUtils.defineLazyGetter(this, "gUpdateBundle", function aus_gUpdateBundle()
return Services.strings.createBundle(URI_UPDATES_PROPERTIES);
});
-XPCOMUtils.defineLazyGetter(this, "gTextDecoder", () => new TextDecoder());
-
/**
* Tests to make sure that we can write to a given directory.
*
@@ -2098,10 +2080,8 @@ UpdateService.prototype = {
// Histogram IDs:
// UPDATE_NOT_PREF_UPDATE_AUTO_EXTERNAL
// UPDATE_NOT_PREF_UPDATE_AUTO_NOTIFY
- this.getAutoUpdateIsEnabled().then(enabled => {
- AUSTLMY.pingGeneric("UPDATE_NOT_PREF_UPDATE_AUTO_" + this._pingSuffix,
- enabled, DEFAULT_APP_UPDATE_AUTO);
- });
+ AUSTLMY.pingBoolPref("UPDATE_NOT_PREF_UPDATE_AUTO_" + this._pingSuffix,
+ PREF_APP_UPDATE_AUTO, true, true);
// Histogram IDs:
// UPDATE_NOT_PREF_UPDATE_STAGING_ENABLED_EXTERNAL
// UPDATE_NOT_PREF_UPDATE_STAGING_ENABLED_NOTIFY
@@ -2316,7 +2296,7 @@ UpdateService.prototype = {
* @param updates
* An array of available updates
*/
- _selectAndInstallUpdate: async function AUS__selectAndInstallUpdate(updates) {
+ _selectAndInstallUpdate: function AUS__selectAndInstallUpdate(updates) {
// Return early if there's an active update. The user is already aware and
// is downloading or performed some user action to prevent notification.
var um = Cc["@mozilla.org/updates/update-manager;1"].
@@ -2379,8 +2359,7 @@ UpdateService.prototype = {
* Major Notify
* Minor Auto Install
*/
- let updateAuto = await this.getAutoUpdateIsEnabled();
- if (!updateAuto) {
+ if (!Services.prefs.getBoolPref(PREF_APP_UPDATE_AUTO, true)) {
LOG("UpdateService:_selectAndInstallUpdate - prompting because silent " +
"install is disabled. Notifying observers. topic: update-available, " +
"status: show-prompt");
@@ -2463,130 +2442,6 @@ UpdateService.prototype = {
return true;
},
- _updateAutoSettingCachedVal: null,
- // Used for serializing reads and writes of the app update json config file.
- // This is especially important for making sure writes don't happen out of
- // order. It would be bad if a user double-toggling this setting resulted in a
- // race condition. The last write must be the one that ultimately controls
- // the setting's value.
- _updateAutoIOPromise: Promise.resolve(),
-
- _readUpdateAutoConfig: async function AUS__readUpdateAuto() {
- let configFile = getUpdateFile([FILE_UPDATE_CONFIG_JSON ]);
- let binaryData = await OS.File.read(configFile.path);
- let jsonData = gTextDecoder.decode(binaryData);
- let configData = JSON.parse(jsonData);
- return !!configData[CONFIG_APP_UPDATE_AUTO];
- },
-
- _writeUpdateAutoConfig: async function AUS__writeUpdateAutoPref(enabledValue) {
- let enabledBoolValue = !!enabledValue;
- let configFile = getUpdateFile([FILE_UPDATE_CONFIG_JSON]);
- let configObject = {[CONFIG_APP_UPDATE_AUTO]: enabledBoolValue};
-
- await OS.File.writeAtomic(configFile.path, JSON.stringify(configObject));
- return enabledBoolValue;
- },
-
- // If the value of app.update.auto has changed, notify observers. Returns the
- // new value for app.update.auto.
- _maybeUpdateAutoConfigChanged: function AUS__maybeUpdateAutoConfigChanged(newValue) {
- if (newValue != this._updateAutoSettingCachedVal) {
- this._updateAutoSettingCachedVal = newValue;
- Services.obs.notifyObservers(null, "auto-update-config-change",
- newValue.toString());
- }
- return newValue;
- },
-
- /**
- * See nsIUpdateService.idl
- */
- getAutoUpdateIsEnabled: function AUS_getAutoUpdateIsEnabled() {
- if (AppConstants.platform != "win") {
- // Only in Windows do we store the update config in the update directory
- let prefValue = Services.prefs.getBoolPref(PREF_APP_UPDATE_AUTO,
- DEFAULT_APP_UPDATE_AUTO);
- return Promise.resolve(prefValue);
- }
- // Justification for the empty catch statement below:
- // All promises returned by (get|set)AutoUpdateIsEnabled are part of a
- // single promise chain in order to serialize disk operations. We don't want
- // the entire promise chain to reject when one operation fails.
- //
- // There is only one situation when a promise in this chain should ever
- // reject, which is when writing fails and the error is logged and
- // re-thrown. All other possible exceptions are wrapped in try blocks, which
- // also log any exception that may occur.
- let readPromise = this._updateAutoIOPromise.catch(() => {}).then(async () => {
- try {
- let configValue = await this._readUpdateAutoConfig();
- // If we read a value out of this file, don't later perform migration.
- // If the file is deleted, we don't want some stale pref getting
- // written to it just because a different profile performed migration.
- Services.prefs.setBoolPref(PREF_APP_UPDATE_AUTO_MIGRATED, true);
- return configValue;
- } catch (e) {
- LOG("UpdateService.getAutoUpdateIsEnabled - Unable to read app " +
- "update configuration file. Exception: " + e);
- let valueMigrated = Services.prefs.getBoolPref(
- PREF_APP_UPDATE_AUTO_MIGRATED,
- false);
- if (!valueMigrated) {
- LOG("UpdateService.getAutoUpdateIsEnabled - Attempting migration.");
- Services.prefs.setBoolPref(PREF_APP_UPDATE_AUTO_MIGRATED, true);
- let prefValue = Services.prefs.getBoolPref(PREF_APP_UPDATE_AUTO,
- DEFAULT_APP_UPDATE_AUTO);
- try {
- return await this._writeUpdateAutoConfig(prefValue);
- } catch (e) {
- LOG("UpdateService.getAutoUpdateIsEnabled - Migration failed. " +
- "Exception: " + e);
- }
- }
- }
- // Fallthrough for if the value could not be read or migrated.
- return DEFAULT_APP_UPDATE_AUTO;
- }).then(this._maybeUpdateAutoConfigChanged.bind(this));
- this._updateAutoIOPromise = readPromise;
- return readPromise;
- },
-
- /**
- * See nsIUpdateService.idl
- */
- setAutoUpdateIsEnabled: function AUS_setAutoUpdateIsEnabled(enabledValue) {
- if (AppConstants.platform != "win") {
- // Only in Windows do we store the update config in the update directory
- let prefValue = !!enabledValue;
- Services.prefs.setBoolPref(PREF_APP_UPDATE_AUTO, prefValue);
- this._maybeUpdateAutoConfigChanged(prefValue);
- return Promise.resolve(prefValue);
- }
- // Justification for the empty catch statement below:
- // All promises returned by (get|set)AutoUpdateIsEnabled are part of a
- // single promise chain in order to serialize disk operations. We don't want
- // the entire promise chain to reject when one operation fails.
- //
- // There is only one situation when a promise in this chain should ever
- // reject, which is when writing fails and the error is logged and
- // re-thrown. All other possible exceptions are wrapped in try blocks, which
- // also log any exception that may occur.
- let writePromise = this._updateAutoIOPromise.catch(() => {}).then(async () => {
- try {
- return await this._writeUpdateAutoConfig(enabledValue);
- } catch (e) {
- LOG("UpdateService.setAutoUpdateIsEnabled - App update configuration " +
- "file write failed. Exception: " + e);
- // After logging, rethrow the error so the caller knows that writing the
- // value in the app update config file failed.
- throw e;
- }
- }).then(this._maybeUpdateAutoConfigChanged.bind(this));
- this._updateAutoIOPromise = writePromise;
- return writePromise;
- },
-
/**
* See nsIUpdateService.idl
*/
diff --git a/toolkit/mozapps/update/tests/browser/browser.ini b/toolkit/mozapps/update/tests/browser/browser.ini
index 863fa9577c0c..aa5197ea9f6f 100644
--- a/toolkit/mozapps/update/tests/browser/browser.ini
+++ b/toolkit/mozapps/update/tests/browser/browser.ini
@@ -6,9 +6,6 @@ support-files =
testConstants.js
[browser_TelemetryUpdatePing.js]
-[browser_updateAutoPrefUI.js]
-skip-if = os != 'win'
-reason = Tests that update config is properly written to file, which is a Windows-only feature
[browser_updatesBackgroundWindow.js]
[browser_updatesBackgroundWindowFailures.js]
skip-if = verify
diff --git a/toolkit/mozapps/update/tests/browser/browser_updateAutoPrefUI.js b/toolkit/mozapps/update/tests/browser/browser_updateAutoPrefUI.js
deleted file mode 100644
index 562efb9667c2..000000000000
--- a/toolkit/mozapps/update/tests/browser/browser_updateAutoPrefUI.js
+++ /dev/null
@@ -1,55 +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/.
- */
-
-ChromeUtils.import("resource://gre/modules/osfile.jsm", this);
-
-// Changes, then verifies the value of app.update.auto via the about:preferences
-// UI. Requires a tab with about:preferences open to be passed in.
-async function changeAndVerifyPref(tab, newConfigValue) {
- await ContentTask.spawn(tab.linkedBrowser, {newConfigValue}, async function({newConfigValue}) {
- let radioId = newConfigValue ? "autoDesktop" : "manualDesktop";
- let radioElement = content.document.getElementById(radioId);
- radioElement.click();
- });
-
- // At this point, we really need to wait for the change to finish being
- // written to the disk before we go to verify anything. Unfortunately, it
- // would be difficult to check for quick changes to the attributes of the
- // about:preferences controls (to wait for the controls to be disabled and
- // re-enabled). So instead, just start the verification by asking the
- // Application Update Service for the value of app.update.auto. It already
- // serializes reads and writes to the app update config file, so this will not
- // resolve until the file write is complete.
-
- let configValueRead = await gAUS.getAutoUpdateIsEnabled();
- is(configValueRead, newConfigValue,
- "Value returned should have matched the expected value");
-
- let configFile = getUpdateConfigFile();
- let decoder = new TextDecoder();
- let fileContents = await OS.File.read(configFile.path);
- let saveObject = JSON.parse(decoder.decode(fileContents));
- is(saveObject["app.update.auto"], newConfigValue,
- "Value in file should match expected");
-
- await ContentTask.spawn(tab.linkedBrowser, {newConfigValue}, async function({newConfigValue}) {
- let updateRadioGroup = content.document.getElementById("updateRadioGroup");
- is(updateRadioGroup.value, `${newConfigValue}`,
- "Update preference should match expected");
- });
-}
-
-add_task(async function testUpdateAutoPrefUI() {
- let originalPrefValue = await gAUS.getAutoUpdateIsEnabled();
- let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:preferences");
-
- await changeAndVerifyPref(tab, true);
- await changeAndVerifyPref(tab, false);
- await changeAndVerifyPref(tab, false);
- await changeAndVerifyPref(tab, true);
-
- await BrowserTestUtils.removeTab(tab);
- await gAUS.setAutoUpdateIsEnabled(originalPrefValue);
-});
diff --git a/toolkit/mozapps/update/tests/data/shared.js b/toolkit/mozapps/update/tests/data/shared.js
index 08d5bdf9ae4d..40091688049d 100644
--- a/toolkit/mozapps/update/tests/data/shared.js
+++ b/toolkit/mozapps/update/tests/data/shared.js
@@ -58,7 +58,6 @@ const FILE_UPDATE_SETTINGS_INI = "update-settings.ini";
const FILE_UPDATE_SETTINGS_INI_BAK = "update-settings.ini.bak";
const FILE_UPDATER_INI = "updater.ini";
const FILE_UPDATES_XML = "updates.xml";
-const FILE_UPDATE_CONFIG = "update-config.json";
const FILE_UPDATE_LOG = "update.log";
const FILE_UPDATE_MAR = "update.mar";
const FILE_UPDATE_STATUS = "update.status";
@@ -583,15 +582,6 @@ function getGREBinDir() {
return Services.dirsvc.get(NS_GRE_BIN_DIR, Ci.nsIFile);
}
-/**
- * Returns the file containing update configuration
- */
-function getUpdateConfigFile() {
- let configFile = getUpdatesRootDir();
- configFile.append(FILE_UPDATE_CONFIG);
- return configFile;
-}
-
/**
* Logs TEST-INFO messages.
*
diff --git a/toolkit/mozapps/update/tests/unit_aus_update/updateAutoPrefMigrate.js b/toolkit/mozapps/update/tests/unit_aus_update/updateAutoPrefMigrate.js
deleted file mode 100644
index b324b314a3b6..000000000000
--- a/toolkit/mozapps/update/tests/unit_aus_update/updateAutoPrefMigrate.js
+++ /dev/null
@@ -1,83 +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/.
- */
-
-ChromeUtils.import("resource://gre/modules/osfile.jsm", this);
-
-// Checks both the value returned by the update service and the one written to
-// the app update config file.
-async function verifyPref(configFile, expectedValue) {
- let decoder = new TextDecoder();
- let configValue = await gAUS.getAutoUpdateIsEnabled();
- Assert.equal(configValue, expectedValue,
- "Value returned should have matched the expected value");
- let fileContents = await OS.File.read(configFile.path);
- let saveObject = JSON.parse(decoder.decode(fileContents));
- Assert.equal(saveObject["app.update.auto"], expectedValue,
- "Value in file should match expected");
-}
-
-async function run_test() {
- setupTestCommon();
- standardInit();
-
- let configFile = getUpdateConfigFile();
-
- let originalFileValue = await gAUS.getAutoUpdateIsEnabled();
- let originalConfigValue = Services.prefs.getBoolPref("app.update.auto", null);
- let originalMigrationValue =
- Services.prefs.getBoolPref("app.update.auto.migrated", null);
-
- // Test migration of a |false| value
- Services.prefs.setBoolPref("app.update.auto.migrated", false);
- Services.prefs.setBoolPref("app.update.auto", false);
- debugDump(`about to remove config file`);
- configFile.remove(false);
- Assert.ok(!configFile.exists(), "Pref file should have been removed");
- await verifyPref(configFile, false);
-
- // Test that migration doesn't happen twice
- Services.prefs.setBoolPref("app.update.auto", true);
- await verifyPref(configFile, false);
-
- // If the file is deleted after migration, the default value should be
- // returned, regardless of the pref value.
- debugDump(`about to remove config file`);
- configFile.remove(false);
- Assert.ok(!configFile.exists(), "Pref file should have been removed");
- let configValue = await gAUS.getAutoUpdateIsEnabled();
- Assert.equal(configValue, true, "getAutoUpdateIsEnabled should have " +
- "returned the default value (true)");
-
- // Setting a new value should cause the value to get written out again
- await gAUS.setAutoUpdateIsEnabled(false);
- await verifyPref(configFile, false);
-
- // Test migration of a |true| value
- Services.prefs.setBoolPref("app.update.auto.migrated", false);
- Services.prefs.setBoolPref("app.update.auto", true);
- configFile.remove(false);
- Assert.ok(!configFile.exists(), "App update config file should have been " +
- "removed");
- await verifyPref(configFile, true);
-
- // Test that setting app.update.auto without migrating also works
- await gAUS.setAutoUpdateIsEnabled(false);
- await verifyPref(configFile, false);
-
- // Restore original state
- await gAUS.setAutoUpdateIsEnabled(originalFileValue);
- if (originalConfigValue == null) {
- Services.prefs.clearUserPref("app.update.auto");
- } else {
- Services.prefs.setBoolPref("app.update.auto", originalConfigValue);
- }
- if (originalMigrationValue == null) {
- Services.prefs.clearUserPref("app.update.auto.migrated");
- } else {
- Services.prefs.setBoolPref("app.update.auto.migrated",
- originalMigrationValue);
- }
- doTestFinish();
-}
diff --git a/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini b/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini
index 5ae9e69c98c9..31bbe73411c4 100644
--- a/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini
+++ b/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.ini
@@ -28,9 +28,6 @@ head = head_update.js
[uiSilentPref.js]
[uiUnsupportedAlreadyNotified.js]
[uiAutoPref.js]
-[updateAutoPrefMigrate.js]
-skip-if = os != 'win'
-reason = Update pref migration is currently Windows only
[updateDirectoryMigrate.js]
skip-if = os != 'win'
reason = Update directory migration is currently Windows only