From: Mike Hommey <mh@glandium.org>
Date: Tue, 5 Jun 2012 08:57:06 +0200
Subject: Bug 756390 - Make the "Reset Firefox" feature more generic

diff --git a/browser/components/migration/content/migration.js b/browser/components/migration/content/migration.js
index 0e8ccf5..fa46c08 100644
--- a/browser/components/migration/content/migration.js
+++ b/browser/components/migration/content/migration.js
@@ -249,7 +249,7 @@ var MigrationWizard = {
     }
 
     var brandBundle = document.getElementById("brandBundle");
-    // These strings don't exist when not using official branding. If that's
+    // These strings may not exist when not using official branding. If that's
     // the case, just skip this page.
     try {
       var pageTitle = brandBundle.getString("homePageMigrationPageTitle");
@@ -281,8 +281,8 @@ var MigrationWizard = {
       case "chrome":
         source = "sourceNameChrome";
         break;
-      case "firefox":
-        source = "sourceNameFirefox";
+      case "self":
+        source = "brand";
         break;
     }
 
@@ -292,7 +292,12 @@ var MigrationWizard = {
     var oldHomePageURL = this._migrator.sourceHomePageURL;
 
     if (oldHomePageURL && source) {
-      var appName = MigrationUtils.getLocalizedString(source);
+      var appName;
+      if (source == "brand") {
+        appName = brandBundle.GetStringFromName("brandFullName");
+      } else {
+        appName = MigrationUtils.getLocalizedString(source);
+      }
       var oldHomePageLabel =
         brandBundle.getFormattedString("homePageImport", [appName]);
       var oldHomePage = document.getElementById("oldHomePage");
diff --git a/browser/components/migration/content/migration.xul b/browser/components/migration/content/migration.xul
index f030756..23e37ff 100644
--- a/browser/components/migration/content/migration.xul
+++ b/browser/components/migration/content/migration.xul
@@ -42,7 +42,7 @@
 #elifdef XP_UNIX
       <radio id="chrome"    label="&importFromChrome.label;"    accesskey="&importFromChrome.accesskey;"/>
 #endif
-      <radio id="firefox"   label="&importFromFirefox.label;"   accesskey="&importFromFirefox.accesskey;"/>
+      <radio id="self"      hidden="true"/>
       <radio id="nothing"   label="&importFromNothing.label;"   accesskey="&importFromNothing.accesskey;" hidden="true"/>
     </radiogroup>
     <label id="noSources" hidden="true">&noMigrationSources.label;</label>
diff --git a/browser/components/migration/src/BrowserProfileMigrators.manifest b/browser/components/migration/src/BrowserProfileMigrators.manifest
index d7fec75..d531b83 100644
--- a/browser/components/migration/src/BrowserProfileMigrators.manifest
+++ b/browser/components/migration/src/BrowserProfileMigrators.manifest
@@ -3,7 +3,7 @@ contract @mozilla.org/toolkit/profile-migrator;1 {6F8BB968-C14F-4D6F-9733-6C6737
 component {4cec1de4-1671-4fc3-a53e-6c539dc77a26} ChromeProfileMigrator.js
 contract @mozilla.org/profile/migrator;1?app=browser&type=chrome {4cec1de4-1671-4fc3-a53e-6c539dc77a26}
 component {91185366-ba97-4438-acba-48deaca63386} FirefoxProfileMigrator.js
-contract @mozilla.org/profile/migrator;1?app=browser&type=firefox {91185366-ba97-4438-acba-48deaca63386}
+contract @mozilla.org/profile/migrator;1?app=browser&type=self {91185366-ba97-4438-acba-48deaca63386}
 #ifdef HAS_IE_MIGRATOR
 component {3d2532e3-4932-4774-b7ba-968f5899d3a4} IEProfileMigrator.js
 contract @mozilla.org/profile/migrator;1?app=browser&type=ie {3d2532e3-4932-4774-b7ba-968f5899d3a4}
diff --git a/browser/components/migration/src/FirefoxProfileMigrator.js b/browser/components/migration/src/FirefoxProfileMigrator.js
index a6598fe..8f83da8 100644
--- a/browser/components/migration/src/FirefoxProfileMigrator.js
+++ b/browser/components/migration/src/FirefoxProfileMigrator.js
@@ -88,7 +88,7 @@ Object.defineProperty(FirefoxProfileMigrator.prototype, "startupOnlyMigrator", {
 
 
 FirefoxProfileMigrator.prototype.classDescription = "Firefox Profile Migrator";
-FirefoxProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=firefox";
+FirefoxProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=self";
 FirefoxProfileMigrator.prototype.classID = Components.ID("{91185366-ba97-4438-acba-48deaca63386}");
 
 const NSGetFactory = XPCOMUtils.generateNSGetFactory([FirefoxProfileMigrator]);
diff --git a/browser/components/migration/src/MigrationUtils.jsm b/browser/components/migration/src/MigrationUtils.jsm
index 0669aa8..19552e3 100644
--- a/browser/components/migration/src/MigrationUtils.jsm
+++ b/browser/components/migration/src/MigrationUtils.jsm
@@ -403,11 +403,6 @@ let MigrationUtils = Object.freeze({
    * @see nsIStringBundle
    */
   getLocalizedString: function MU_getLocalizedString(aKey, aReplacements) {
-    const OVERRIDES = {
-      "4_firefox": "4_firefox_history_and_bookmarks"
-    };
-    aKey = OVERRIDES[aKey] || aKey;
-
     if (aReplacements === undefined)
       return getMigrationBundle().GetStringFromName(aKey);
     return getMigrationBundle().formatStringFromName(
@@ -622,6 +617,17 @@ let MigrationUtils = Object.freeze({
   },
 
   /**
+   * Returns whether a given migration type is supported.
+   *
+   * @param  aKey   Migrator key
+   * @returns whether the migrator key is supported.
+   */
+  canMigrate:
+  function MU_canMigrate(aMigratorKey) {
+    return "@mozilla.org/profile/migrator;1?app=browser&type=" + aMigratorKey in Cc;
+  },
+
+  /**
    * Cleans up references to migrators and nsIProfileInstance instances.
    */
   finishMigration: function MU_finishMigration() {
diff --git a/browser/components/migration/src/ProfileMigrator.js b/browser/components/migration/src/ProfileMigrator.js
index 744f117..59e5a4c 100644
--- a/browser/components/migration/src/ProfileMigrator.js
+++ b/browser/components/migration/src/ProfileMigrator.js
@@ -12,6 +12,7 @@ function ProfileMigrator() {
 
 ProfileMigrator.prototype = {
   migrate: MigrationUtils.startupMigration.bind(MigrationUtils),
+  canMigrate: MigrationUtils.canMigrate.bind(MigrationUtils),
   QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIProfileMigrator]),
   classDescription: "Profile Migrator",
   contractID: "@mozilla.org/toolkit/profile-migrator;1",
diff --git a/browser/locales/en-US/chrome/browser/migration/migration.dtd b/browser/locales/en-US/chrome/browser/migration/migration.dtd
index 21cf405..f3c1a6b 100644
--- a/browser/locales/en-US/chrome/browser/migration/migration.dtd
+++ b/browser/locales/en-US/chrome/browser/migration/migration.dtd
@@ -17,8 +17,6 @@
 <!ENTITY importFromSafari.accesskey     "S">
 <!ENTITY importFromChrome.label         "Chrome">
 <!ENTITY importFromChrome.accesskey     "C">
-<!ENTITY importFromFirefox.label        "Firefox">
-<!ENTITY importFromFirefox.accesskey    "X">
 
 <!ENTITY noMigrationSources.label       "No programs that contain bookmarks, history or password data could be found.">
 
diff --git a/browser/locales/en-US/chrome/browser/migration/migration.properties b/browser/locales/en-US/chrome/browser/migration/migration.properties
index 260bc29..52b32cc 100644
--- a/browser/locales/en-US/chrome/browser/migration/migration.properties
+++ b/browser/locales/en-US/chrome/browser/migration/migration.properties
@@ -8,7 +8,6 @@ profileName_format=%S %S
 sourceNameIE=Internet Explorer
 sourceNameSafari=Safari
 sourceNameChrome=Google Chrome
-sourceNameFirefox=Mozilla Firefox
 
 importedBookmarksFolder=From %S
 
@@ -24,22 +23,22 @@ importedSafariReadingList=Reading List (From Safari)
 2_ie=Cookies
 2_safari=Cookies
 2_chrome=Cookies
-2_firefox=Cookies
+2_self=Cookies
 
 4_ie=Browsing History
 4_safari=Browsing History
 4_chrome=Browsing History
-4_firefox_history_and_bookmarks=Browsing History and Bookmarks
+4_self=Browsing History and Bookmarks
 
 8_ie=Saved Form History
 8_safari=Saved Form History
 8_chrome=Saved Form History
-8_firefox=Saved Form History
+8_self=Saved Form History
 
 16_ie=Saved Passwords
 16_safari=Saved Passwords
 16_chrome=Saved Passwords
-16_firefox=Saved Passwords
+16_self=Saved Passwords
 
 32_ie=Favorites
 32_safari=Bookmarks
@@ -48,4 +47,4 @@ importedSafariReadingList=Reading List (From Safari)
 64_ie=Other Data
 64_safari=Other Data
 64_chrome=Other Data
-64_firefox=Bookmarks Backups
+64_self=Bookmarks Backups
diff --git a/toolkit/content/jar.mn b/toolkit/content/jar.mn
index 339ffda..6999b26 100644
--- a/toolkit/content/jar.mn
+++ b/toolkit/content/jar.mn
@@ -38,7 +38,7 @@ toolkit.jar:
 +  content/global/mozilla.xhtml               (mozilla.xhtml)
    content/global/nsDragAndDrop.js            (nsDragAndDrop.js)
    content/global/resetProfile.css            (resetProfile.css)
-*  content/global/resetProfile.js             (resetProfile.js)
+   content/global/resetProfile.js             (resetProfile.js)
    content/global/resetProfile.xul            (resetProfile.xul)
    content/global/resetProfileProgress.xul    (resetProfileProgress.xul)
    content/global/treeUtils.js                (treeUtils.js)
diff --git a/toolkit/content/resetProfile.js b/toolkit/content/resetProfile.js
index dcb4065..09c1146 100644
--- a/toolkit/content/resetProfile.js
+++ b/toolkit/content/resetProfile.js
@@ -36,13 +36,13 @@ function resetSupported() {
                        getService(Ci.nsIToolkitProfileService);
   let currentProfileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
 
-#expand const MOZ_APP_NAME = "__MOZ_APP_NAME__";
-#expand const MOZ_BUILD_APP = "__MOZ_BUILD_APP__";
-
   // Reset is only supported for the default profile if the self-migrator used for reset exists.
   try {
-    return currentProfileDir.equals(profileService.selectedProfile.rootDir) &&
-             ("@mozilla.org/profile/migrator;1?app=" + MOZ_BUILD_APP + "&type=" + MOZ_APP_NAME in Cc);
+    if (currentProfileDir.equals(profileService.selectedProfile.rootDir) &&
+        "@mozilla.org/toolkit/profile-migrator;1" in Cc) {
+      let pm = Cc["@mozilla.org/toolkit/profile-migrator;1"].createInstance(Ci.nsIProfileMigrator);
+      return ("canMigrate" in pm) && pm.canMigrate("self");
+    }
   } catch (e) {
     // Catch exception when there is no selected profile.
     Cu.reportError(e);
@@ -53,9 +53,6 @@ function resetSupported() {
 function getMigratedData() {
   Components.utils.import("resource:///modules/MigrationUtils.jsm");
 
-#expand const MOZ_BUILD_APP = "__MOZ_BUILD_APP__";
-#expand const MOZ_APP_NAME = "__MOZ_APP_NAME__";
-
   // From migration.properties
   const MIGRATED_TYPES = [
     4,  // History and Bookmarks
@@ -68,7 +65,7 @@ function getMigratedData() {
   let dataTypes = [];
   for (let itemID of MIGRATED_TYPES) {
     try {
-      let typeName = MigrationUtils.getLocalizedString(itemID + "_" + MOZ_APP_NAME);
+      let typeName = MigrationUtils.getLocalizedString(itemID + "_self");
       dataTypes.push(typeName);
     } catch (x) {
       // Catch exceptions when the string for a data type doesn't exist.
diff --git a/toolkit/profile/nsIProfileMigrator.idl b/toolkit/profile/nsIProfileMigrator.idl
index f35c227..7062886 100644
--- a/toolkit/profile/nsIProfileMigrator.idl
+++ b/toolkit/profile/nsIProfileMigrator.idl
@@ -37,7 +37,7 @@ interface nsIProfileStartup : nsISupports
  * @client   Toolkit (Startup code)
  * @obtainable service, contractid("@mozilla.org/toolkit/profile-migrator;1")
  */
-[scriptable, uuid(3df284a5-2258-4d46-a664-761ecdc04c22)]
+[scriptable, uuid(96d9ab66-082c-4a9e-82ad-f8c21b391342)]
 interface nsIProfileMigrator : nsISupports 
 {
   /**
@@ -60,6 +60,14 @@ interface nsIProfileMigrator : nsISupports
    * @note The startup code ignores COM exceptions thrown from this method.
    */
   void migrate(in nsIProfileStartup aStartup, in ACString aKey);
+
+  /**
+   * Returns whether a given migration type is supported.
+   *
+   * @param  aKey   Migrator key
+   * @returns whether the migrator key is supported.
+   */
+  bool canMigrate(in ACString aKey);
 };
 
 %{C++
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index 68a52e6..02bb30e 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -3669,7 +3669,7 @@ XREMain::XRE_mainRun()
         if (gDoProfileReset) {
           // Automatically migrate from the current application if we just
           // reset the profile.
-          aKey = MOZ_APP_NAME;
+          aKey = "self";
         }
         pm->Migrate(&mDirProvider, aKey);
       }