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