142 lines
5.1 KiB
JavaScript
142 lines
5.1 KiB
JavaScript
/* 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";
|
|
|
|
const Cc = Components.classes;
|
|
const Ci = Components.interfaces;
|
|
const Cu = Components.utils;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("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._toCString(key), false);
|
|
params.appendElement(migrator, false);
|
|
params.appendElement(aStartup, false);
|
|
|
|
Services.ww.openWindow(null,
|
|
"chrome://browser/content/migration/migration.xul",
|
|
"_blank",
|
|
"chrome,dialog,modal,centerscreen,titlebar",
|
|
params);
|
|
},
|
|
|
|
_toCString: function PM__toCString(aStr) {
|
|
let cstr = Cc["@mozilla.org/supports-cstring;1"].
|
|
createInstance(Ci.nsISupportsCString);
|
|
cstr.data = aStr;
|
|
return cstr;
|
|
},
|
|
|
|
_getMigratorIfSourceExists: function PM__getMigratorIfSourceExists(aKey) {
|
|
let cid = "@mozilla.org/profile/migrator;1?app=browser&type=" + aKey;
|
|
let migrator = Cc[cid].createInstance(Ci.nsIBrowserProfileMigrator);
|
|
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:
|
|
#ifdef XP_WIN
|
|
["ie", "chrome", /* safari */],
|
|
#elifdef XP_MACOSX
|
|
["safari", "chrome"],
|
|
#else
|
|
["chrome"],
|
|
#endif
|
|
|
|
_getDefaultMigrator: function PM__getDefaultMigrator() {
|
|
let migratorsOrdered = Array.slice(this._PLATFORM_FALLBACK_LIST);
|
|
let defaultBrowser = "";
|
|
#ifdef XP_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);
|
|
}
|
|
#endif
|
|
|
|
// 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(function(a, b) b == defaultBrowser ? 1 : 0);
|
|
|
|
for (let i = 0; i < migratorsOrdered.length; i++) {
|
|
let migrator = this._getMigratorIfSourceExists(migratorsOrdered[i]);
|
|
if (migrator)
|
|
return [migratorsOrdered[i], migrator];
|
|
}
|
|
|
|
return ["", null];
|
|
},
|
|
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIProfileMigrator]),
|
|
classDescription: "Profile Migrator",
|
|
contractID: "@mozilla.org/toolkit/profile-migrator;1",
|
|
classID: Components.ID("6F8BB968-C14F-4D6F-9733-6C6737B35DCE")
|
|
};
|
|
|
|
let NSGetFactory = XPCOMUtils.generateNSGetFactory([ProfileMigrator]);
|