diff --git a/browser/base/content/safeMode.css b/browser/base/content/safeMode.css index 4f093a452f..78be86e564 100644 --- a/browser/base/content/safeMode.css +++ b/browser/base/content/safeMode.css @@ -6,3 +6,11 @@ font-weight: bold; } +/* 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/. */ + +#resetProfileFooter { + font-weight: bold; +} + diff --git a/browser/base/content/safeMode.js b/browser/base/content/safeMode.js index e1e5c72859..5df931326e 100644 --- a/browser/base/content/safeMode.js +++ b/browser/base/content/safeMode.js @@ -2,127 +2,85 @@ 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/. */ -const Cc = Components.classes, - Ci = Components.interfaces, - Cu = Components.utils; - -Cu.import("resource://gre/modules/AddonManager.jsm"); +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cu = Components.utils; + +const appStartup = Services.startup; + +Cu.import("resource://gre/modules/ResetProfile.jsm"); + +let defaultToReset = false; function restartApp() { - let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"] - .getService(Ci.nsIAppStartup); - appStartup.quit(Ci.nsIAppStartup.eForceQuit | Ci.nsIAppStartup.eRestart); + appStartup.quit(appStartup.eForceQuit | appStartup.eRestart); } -function clearAllPrefs() { - var prefService = Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefService); - prefService.resetUserPrefs(); - - // Remove the pref-overrides dir, if it exists - try { - var fileLocator = Cc["@mozilla.org/file/directory_service;1"] - .getService(Ci.nsIProperties); - const NS_APP_PREFS_OVERRIDE_DIR = "PrefDOverride"; - var prefOverridesDir = fileLocator.get(NS_APP_PREFS_OVERRIDE_DIR, - Ci.nsIFile); - prefOverridesDir.remove(true); - } catch (ex) { - Components.utils.reportError(ex); - } +function resetProfile() { + // Set the reset profile environment variable. + let env = Cc["@mozilla.org/process/environment;1"] + .getService(Ci.nsIEnvironment); + env.set("MOZ_RESET_PROFILE_RESTART", "1"); } -function restoreDefaultBookmarks() { - var prefBranch = Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefBranch); - prefBranch.setBoolPref("browser.bookmarks.restore_default_bookmarks", true); -} - -function deleteLocalstore() { - const nsIDirectoryServiceContractID = "@mozilla.org/file/directory_service;1"; - const nsIProperties = Ci.nsIProperties; - var directoryService = Cc[nsIDirectoryServiceContractID] - .getService(nsIProperties); - // Local store file - var localstoreFile = directoryService.get("LStoreS", Components.interfaces.nsIFile); - // XUL store file - var xulstoreFile = directoryService.get("ProfD", Components.interfaces.nsIFile); - xulstoreFile.append("xulstore.json"); - try { - xulstoreFile.remove(false); - if (localstoreFile.exists()) { - localstoreFile.remove(false); - } - } catch(e) { - Components.utils.reportError(e); - } -} - -function disableAddons() { - AddonManager.getAllAddons(function(aAddons) { - aAddons.forEach(function(aAddon) { - if (aAddon.type == "theme") { - // Setting userDisabled to false on the default theme activates it, - // disables all other themes and deactivates the applied persona, if - // any. - const DEFAULT_THEME_ID = "{972ce4c6-7e08-4474-a285-3208198ce6fd}"; - if (aAddon.id == DEFAULT_THEME_ID) - aAddon.userDisabled = false; - } - else { - aAddon.userDisabled = true; - } - }); - - restartApp(); - }); -} - -function restoreDefaultSearchEngines() { - var searchService = Cc["@mozilla.org/browser/search-service;1"] - .getService(Ci.nsIBrowserSearchService); - - searchService.restoreDefaultEngines(); -} - -function onOK() { - try { - if (document.getElementById("resetUserPrefs").checked) - clearAllPrefs(); - if (document.getElementById("deleteBookmarks").checked) - restoreDefaultBookmarks(); - if (document.getElementById("resetToolbars").checked) - deleteLocalstore(); - if (document.getElementById("restoreSearch").checked) - restoreDefaultSearchEngines(); - if (document.getElementById("disableAddons").checked) { - disableAddons(); - // disableAddons will asynchronously restart the application - return false; - } - } catch(e) { - } - +function showResetDialog() { + // Prompt the user to confirm the reset. + let retVals = { + reset: false, + }; + window.openDialog("chrome://global/content/resetProfile.xul", null, + "chrome,modal,centerscreen,titlebar,dialog=yes", retVals); + if (!retVals.reset) + return; + resetProfile(); restartApp(); - return false; +} + +function onDefaultButton() { + if (defaultToReset) { + // Restart to reset the profile. + resetProfile(); + restartApp(); + // Return false to prevent starting into safe mode while restarting. + return false; + } else { + // Continue in safe mode. No restart needed. + return true; + } } function onCancel() { - let appStartup = Cc["@mozilla.org/toolkit/app-startup;1"] - .getService(Ci.nsIAppStartup); - appStartup.quit(Ci.nsIAppStartup.eForceQuit); + appStartup.quit(appStartup.eForceQuit); +} + +function onExtra1() { + if (defaultToReset) { + // Continue in safe mode + window.close(); + return true; + } else { + // The reset dialog will handle starting the reset process if the user confirms. + showResetDialog(); + } + return false; } function onLoad() { - document.getElementById("tasks") - .addEventListener("CheckboxStateChange", UpdateOKButtonState, false); -} - -function UpdateOKButtonState() { - document.documentElement.getButton("accept").disabled = - !document.getElementById("resetUserPrefs").checked && - !document.getElementById("deleteBookmarks").checked && - !document.getElementById("resetToolbars").checked && - !document.getElementById("disableAddons").checked && - !document.getElementById("restoreSearch").checked; + let dialog = document.documentElement; + if (appStartup.automaticSafeModeNecessary) { + document.getElementById("autoSafeMode").hidden = false; + document.getElementById("safeMode").hidden = true; + if (ResetProfile.resetSupported()) { + document.getElementById("resetProfile").hidden = false; + } else { + // Hide the reset button is it's not supported. + document.documentElement.getButton("extra1").hidden = true; + } + } else { + if (!ResetProfile.resetSupported()) { + // Hide the reset button and text if it's not supported. + document.documentElement.getButton("extra1").hidden = true; + document.getElementById("resetProfileInstead").hidden = true; + } + } } diff --git a/browser/base/content/safeMode.xul b/browser/base/content/safeMode.xul index 656df6eaf8..a261a68a55 100644 --- a/browser/base/content/safeMode.xul +++ b/browser/base/content/safeMode.xul @@ -5,51 +5,49 @@ 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/. --> + %brandDTD; %safeModeDTD; - -%browserDTD; + +%resetProfileDTD; ]> + + buttons="accept,extra1" + buttonlabelaccept="&startSafeMode.label;" + buttonlabelextra1="&refreshProfile.label;" + maxwidth="&window.maxWidth;" + ondialogaccept="return onDefaultButton()" + ondialogcancel="onCancel();" + ondialogextra1="return onExtra1()" + onload="onLoad()"> +