diff options
Diffstat (limited to 'comm/suite/components/migration/SuiteProfileMigrator.js')
-rw-r--r-- | comm/suite/components/migration/SuiteProfileMigrator.js | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/comm/suite/components/migration/SuiteProfileMigrator.js b/comm/suite/components/migration/SuiteProfileMigrator.js new file mode 100644 index 0000000000..0ad4dfcca3 --- /dev/null +++ b/comm/suite/components/migration/SuiteProfileMigrator.js @@ -0,0 +1,149 @@ +/* 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/. */ + +"use strict"; + +var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); +var { XPCOMUtils } = + ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); +const { FileUtils } = + ChromeUtils.import("resource://gre/modules/FileUtils.jsm"); +const { AppConstants } = + ChromeUtils.import('resource://gre/modules/AppConstants.jsm'); + +ChromeUtils.defineModuleGetter(this, "FileUtils", + "resource://gre/modules/FileUtils.jsm"); + +function ProfileMigrator() { +} + +ProfileMigrator.prototype = { + migrate: function PM_migrate(aStartup) { + // By opening the wizard with a supplied migrator, it will automatically + // migrate from it. + let [key, migrator] = this._getDefaultMigrator(); + if (!key) + return; + + let params = Cc["@mozilla.org/array;1"] + .createInstance(Ci.nsIMutableArray); + params.appendElement(this._toString(key)); + params.appendElement(migrator); + params.appendElement(aStartup); + + Services.ww.openWindow(null, + "chrome://communicator/content/migration/migration.xul", + "_blank", + "chrome,dialog,modal,centerscreen,titlebar", + params); + }, + + _toString: function PM__toString(aStr) { + let str = Cc["@mozilla.org/supports-string;1"] + .createInstance(Ci.nsISupportsString); + str.data = aStr; + return str; + }, + + _getMigratorIfSourceExists: function PM__getMigratorIfSourceExists(aKey) { + let cid = "@mozilla.org/profile/migrator;1?app=suite&type=" + aKey; + let migrator = Cc[cid].createInstance(Ci.nsISuiteProfileMigrator); + if (migrator.sourceExists) + return migrator; + return null; + }, + + // We don't yet support checking for the default browser on all platforms, + // needless to say we don't have migrators for all browsers. Thus, for each + // platform, there's a fallback list of migrators used in these cases. + _PLATFORM_FALLBACK_LIST: + ["thunderbird"], + + _getDefaultMigrator: function PM__getDefaultMigrator() { + + let migratorsOrdered = Array.from(this._PLATFORM_FALLBACK_LIST); + + // FIXME This is all so not working currently. + // There are currently no migrators for browsers available. + // See Bug 739056. + if (false) { + let defaultBrowser = ""; + + if (AppConstants.platform == "win") { + try { + const REG_KEY = "SOFTWARE\\Classes\\HTTP\\shell\\open\\command"; + let regKey = Cc["@mozilla.org/windows-registry-key;1"] + .createInstance(Ci.nsIWindowsRegKey); + regKey.open(regKey.ROOT_KEY_LOCAL_MACHINE, REG_KEY, + regKey.ACCESS_READ); + let value = regKey.readStringValue("").toLowerCase(); + let pathMatches = value.match(/^"?(.+?\.exe)"?/); + if (!pathMatches) { + throw new Error("Could not extract path from " + + REG_KEY + "(" + value + ")"); + } + + // We want to find out what the default browser is but the path in and of + // itself isn't enough. Why? Because sometimes on Windows paths get + // truncated like so: C:\PROGRA~1\MOZILL~2\MOZILL~1.EXE. How do we know + // what product that is? Mozilla's file objects do nothing to 'normalize' + // the path so we need to attain an actual product descriptor from the + // file somehow, and in this case it means getting the "InternalName" + // field of the file's VERSIONINFO resource. + // + // In the file's resource segment there is a VERSIONINFO section that is + // laid out like this: + // + // VERSIONINFO + // StringFileInfo + // <TranslationID> + // InternalName "iexplore" + // VarFileInfo + // Translation <TranslationID> + // + // By Querying the VERSIONINFO section for its Tranlations, we can find + // out where the InternalName lives (A file can have more than one + // translation of its VERSIONINFO segment, but we just assume the first + // one). + let file = FileUtils.File(pathMatches[1]) + .QueryInterface(Ci.nsILocalFileWin); + switch (file.getVersionInfoField("InternalName").toLowerCase()) { + case "iexplore": + defaultBrowser = "ie"; + break; + case "chrome": + defaultBrowser = "chrome"; + break; + } + } + catch (ex) { + Cu.reportError("Could not retrieve default browser: " + ex); + } + } + + // If we found the default browser and we have support for that browser, + // make sure to check it before any other browser, by moving it to the head + // of the array. + if (defaultBrowser) { + migratorsOrdered.sort((a, b) => b == defaultBrowser ? 1 : 0); + } + } + + for (let key of migratorsOrdered) { + let migrator = this._getMigratorIfSourceExists(key); + if (migrator) { + return [key, migrator]; + } + } + + return ["", null]; + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsIProfileMigrator]), + classDescription: "Profile Migrator", + contractID: "@mozilla.org/toolkit/profile-migrator;1", + classID: Components.ID("{d5148b7c-ba4e-4f7a-a80b-1ae48b90b910}"), +}; + +var NSGetFactory = XPCOMUtils.generateNSGetFactory([ProfileMigrator]); |