diff --git a/application/basilisk/components/migration/ChromeProfileMigrator.js b/application/basilisk/components/migration/ChromeProfileMigrator.js
index 67a6935e44..cae88ab230 100644
--- a/application/basilisk/components/migration/ChromeProfileMigrator.js
+++ b/application/basilisk/components/migration/ChromeProfileMigrator.js
@@ -55,6 +55,27 @@ function getDataFolder(subfoldersWin, subfoldersOSX, subfoldersUnix) {
return FileUtils.getDir(dirServiceID, subfolders, false);
}
+function getChromiumEdgeDataFolder() {
+ if (AppConstants.platform != "win") {
+ return null;
+ }
+
+ // Probe all common Edge Chromium channels so migration appears even when
+ // users run Beta/Dev/Canary instead of Stable.
+ let microsoftDir = FileUtils.getDir("LocalAppData", ["Microsoft"], false);
+ let channelFolders = ["Edge", "Edge Beta", "Edge Dev", "Edge SxS"];
+ for (let channelFolder of channelFolders) {
+ let candidate = microsoftDir.clone();
+ candidate.append(channelFolder);
+ candidate.append("User Data");
+ if (candidate.exists() && candidate.isReadable() && candidate.isDirectory()) {
+ return candidate;
+ }
+ }
+
+ return null;
+}
+
/**
* Convert Chrome time format to Date object
*
@@ -541,10 +562,8 @@ var componentsArray = [ChromeProfileMigrator, ChromiumProfileMigrator];
* Chromium Edge migration
**/
function ChromiumEdgeProfileMigrator() {
- let edgeUserDataFolder = getDataFolder(["Microsoft", "Edge"],
- ["Microsoft Edge"],
- ["microsoft-edge"]);
- this._chromeUserDataFolder = edgeUserDataFolder.exists() ? edgeUserDataFolder : null;
+ let edgeUserDataFolder = getChromiumEdgeDataFolder();
+ this._chromeUserDataFolder = edgeUserDataFolder;
}
ChromiumEdgeProfileMigrator.prototype = Object.create(ChromeProfileMigrator.prototype);
@@ -552,6 +571,69 @@ ChromiumEdgeProfileMigrator.prototype.classDescription = "Chromium Edge Profile
ChromiumEdgeProfileMigrator.prototype.contractID = "@mozilla.org/profile/migrator;1?app=browser&type=chromiumedge";
ChromiumEdgeProfileMigrator.prototype.classID = Components.ID("{a3380b9d-ef2f-4a5f-84d9-df2e8a90b06d}");
+ChromiumEdgeProfileMigrator.prototype.getResources = function(aProfile) {
+ if (!this._chromeUserDataFolder || !aProfile) {
+ return [];
+ }
+
+ let profileFolder = this._chromeUserDataFolder.clone();
+ profileFolder.append(aProfile.id);
+ if (!profileFolder.exists() || !profileFolder.isDirectory()) {
+ return [];
+ }
+
+ let possibleResources = [
+ GetBookmarksResource(profileFolder),
+ GetHistoryResource(profileFolder),
+ GetCookiesResource(profileFolder),
+ ];
+
+ // Newer Edge stores cookies under the profile's Network subfolder.
+ if (!possibleResources[2]) {
+ let networkFolder = profileFolder.clone();
+ networkFolder.append("Network");
+ possibleResources[2] = GetCookiesResource(networkFolder);
+ }
+
+ if (AppConstants.platform == "win") {
+ possibleResources.push(GetWindowsPasswordsResource(profileFolder));
+ }
+
+ return possibleResources.filter(r => r != null);
+};
+
+Object.defineProperty(ChromiumEdgeProfileMigrator.prototype, "sourceProfiles", {
+ get: function() {
+ if ("__sourceProfiles" in this) {
+ return this.__sourceProfiles;
+ }
+
+ if (!this._chromeUserDataFolder) {
+ return [];
+ }
+
+ let profiles = [];
+ let entries = this._chromeUserDataFolder.directoryEntries;
+ while (entries.hasMoreElements()) {
+ let entry = entries.getNext().QueryInterface(Ci.nsIFile);
+ if (!entry.isDirectory()) {
+ continue;
+ }
+
+ let name = entry.leafName;
+ if (name == "Default" || name.startsWith("Profile ")) {
+ profiles.push({ id: name, name });
+ }
+ }
+
+ this.__sourceProfiles = profiles.filter(profile => {
+ let resources = this.getResources(profile);
+ return resources && resources.length > 0;
+ });
+ return this.__sourceProfiles;
+ }
+});
+
if (AppConstants.platform == "win") {
componentsArray.push(ChromiumEdgeProfileMigrator);
}
diff --git a/application/basilisk/components/migration/MigrationUtils.jsm b/application/basilisk/components/migration/MigrationUtils.jsm
index f3246685ad..6c0363a902 100644
--- a/application/basilisk/components/migration/MigrationUtils.jsm
+++ b/application/basilisk/components/migration/MigrationUtils.jsm
@@ -688,7 +688,7 @@ this.MigrationUtils = Object.freeze({
// Canary uses the same description as Chrome so we can't distinguish them.
const APP_DESC_TO_KEY = {
"Internet Explorer": "ie",
- "Microsoft Edge": "edge",
+ "Microsoft Edge": "chromiumedge",
"Safari": "safari",
"Basilisk": "firefox",
"Firefox": "firefox",
diff --git a/application/basilisk/components/preferences/in-content/main.js b/application/basilisk/components/preferences/in-content/main.js
index 9c2a512c7a..fdf3c8faea 100644
--- a/application/basilisk/components/preferences/in-content/main.js
+++ b/application/basilisk/components/preferences/in-content/main.js
@@ -5,6 +5,7 @@
Components.utils.import("resource://gre/modules/Downloads.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
Components.utils.import("resource://gre/modules/Task.jsm");
+Components.utils.import("resource:///modules/MigrationUtils.jsm");
Components.utils.import("resource:///modules/ShellService.jsm");
Components.utils.import("resource:///modules/TransientPrefs.jsm");
@@ -75,6 +76,8 @@ var gMainPane = {
gMainPane.setHomePageToBookmark);
setEventListener("restoreDefaultHomePage", "command",
gMainPane.restoreDefaultHomePage);
+ setEventListener("openMigrationWizard", "command",
+ gMainPane.openMigrationWizard);
setEventListener("chooseFolder", "command",
gMainPane.chooseFolder);
@@ -244,6 +247,11 @@ var gMainPane = {
homePage.value = homePage.defaultValue;
},
+ openMigrationWizard: function ()
+ {
+ MigrationUtils.showMigrationWizard(window, [MigrationUtils.MIGRATION_ENTRYPOINT_PLACES]);
+ },
+
// DOWNLOADS
/*
diff --git a/application/basilisk/components/preferences/in-content/main.xul b/application/basilisk/components/preferences/in-content/main.xul
index 9180f1c520..9055df11f8 100644
--- a/application/basilisk/components/preferences/in-content/main.xul
+++ b/application/basilisk/components/preferences/in-content/main.xul
@@ -244,6 +244,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/application/basilisk/locales/en-US/chrome/browser/migration/migration.dtd b/application/basilisk/locales/en-US/chrome/browser/migration/migration.dtd
index 68bcfc470e..8a519f7817 100644
--- a/application/basilisk/locales/en-US/chrome/browser/migration/migration.dtd
+++ b/application/basilisk/locales/en-US/chrome/browser/migration/migration.dtd
@@ -10,10 +10,10 @@
-
-
-
-
+
+
+
+
diff --git a/application/basilisk/locales/en-US/chrome/browser/preferences/main.dtd b/application/basilisk/locales/en-US/chrome/browser/preferences/main.dtd
index eb435f6d76..e4d1ac6594 100644
--- a/application/basilisk/locales/en-US/chrome/browser/preferences/main.dtd
+++ b/application/basilisk/locales/en-US/chrome/browser/preferences/main.dtd
@@ -19,8 +19,11 @@
+
+
+