зеркало из https://github.com/mozilla/gecko-dev.git
172 строки
5.7 KiB
JavaScript
172 строки
5.7 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/.
|
|
*/
|
|
|
|
const PREF_APP_UPDATE_MIGRATE_APP_DIR = "app.update.migrated.updateDir";
|
|
|
|
function clearTaskbarIDHash(exePath, appInfoName) {
|
|
let registry = AUS_Cc["@mozilla.org/windows-registry-key;1"].
|
|
createInstance(AUS_Ci.nsIWindowsRegKey);
|
|
try {
|
|
registry.open(AUS_Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
|
|
"Software\\Mozilla\\" + appInfoName + "\\TaskBarIDs",
|
|
AUS_Ci.nsIWindowsRegKey.ACCESS_ALL);
|
|
registry.removeValue(exePath);
|
|
} catch (ex) {
|
|
} finally {
|
|
registry.close();
|
|
}
|
|
}
|
|
|
|
function setTaskbarIDHash(exePath, hash, appInfoName) {
|
|
let registry = AUS_Cc["@mozilla.org/windows-registry-key;1"].
|
|
createInstance(AUS_Ci.nsIWindowsRegKey);
|
|
try {
|
|
registry.create(AUS_Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER,
|
|
"Software\\Mozilla\\" + appInfoName + "\\TaskBarIDs",
|
|
AUS_Ci.nsIWindowsRegKey.ACCESS_WRITE);
|
|
registry.writeStringValue(exePath, hash);
|
|
} catch (ex) {
|
|
} finally {
|
|
registry.close();
|
|
}
|
|
};
|
|
|
|
function getMigrated() {
|
|
var migrated = 0;
|
|
try {
|
|
migrated = Services.prefs.getBoolPref(PREF_APP_UPDATE_MIGRATE_APP_DIR);
|
|
} catch (e) {
|
|
}
|
|
return migrated;
|
|
}
|
|
|
|
/* General Update Manager Tests */
|
|
|
|
function run_test() {
|
|
setupTestCommon(false);
|
|
do_register_cleanup(end_test);
|
|
|
|
standardInit();
|
|
|
|
var appinfo = AUS_Cc["@mozilla.org/xre/app-info;1"].
|
|
getService(AUS_Ci.nsIXULAppInfo).
|
|
QueryInterface(AUS_Ci.nsIXULRuntime);
|
|
|
|
// Obtain the old update root leaf
|
|
var updateLeafName;
|
|
var exeFile = FileUtils.getFile(XRE_EXECUTABLE_FILE, []);
|
|
var programFiles = FileUtils.getFile("ProgF", []);
|
|
if (exeFile.path.substring(0, programFiles.path.length).toLowerCase() ==
|
|
programFiles.path.toLowerCase()) {
|
|
updateLeafName = exeFile.parent.leafName;
|
|
} else {
|
|
updateLeafName = appinfo.name;
|
|
}
|
|
|
|
// Obtain the old update root
|
|
var oldUpdateRoot;
|
|
if (appinfo.vendor) {
|
|
oldUpdateRoot = FileUtils.getDir("LocalAppData", [appinfo.vendor,
|
|
appinfo.name,
|
|
updateLeafName], false);
|
|
} else {
|
|
oldUpdateRoot = FileUtils.getDir("LocalAppData", [appinfo.name,
|
|
updateLeafName], false);
|
|
}
|
|
// Obtain the new update root
|
|
var newUpdateRoot = FileUtils.getDir("UpdRootD", [], false);
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Setting a taskbar ID without the old update dir existing should set the
|
|
// pref so a migration isn't retried.
|
|
|
|
// Remove the old and new update root directories
|
|
try {
|
|
oldUpdateRoot.remove(true);
|
|
} catch (e) {
|
|
}
|
|
try {
|
|
newUpdateRoot.remove(true);
|
|
} catch (e) {
|
|
}
|
|
Services.prefs.setBoolPref(PREF_APP_UPDATE_MIGRATE_APP_DIR, false);
|
|
setTaskbarIDHash(exeFile.parent.path, "AAAAAAAA", appinfo.name);
|
|
initUpdateServiceStub();
|
|
do_check_eq(getMigrated(), 1);
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// An application without a taskbar ID should bail early without a pref
|
|
// being set, so that if a taskbar is set for the application, the migration
|
|
// will be retried.
|
|
|
|
Services.prefs.setBoolPref(PREF_APP_UPDATE_MIGRATE_APP_DIR, false);
|
|
clearTaskbarIDHash(exeFile.parent.path, appinfo.name);
|
|
initUpdateServiceStub();
|
|
do_check_eq(getMigrated(), 0);
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Migrating files should work
|
|
|
|
Services.prefs.setBoolPref(PREF_APP_UPDATE_MIGRATE_APP_DIR, false);
|
|
setTaskbarIDHash(exeFile.parent.path, "AAAAAAAA", appinfo.name);
|
|
var oldUpdateDirs = oldUpdateRoot.clone();
|
|
oldUpdateDirs.append("updates");
|
|
oldUpdateDirs.append("0");
|
|
oldUpdateDirs.create(AUS_Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
|
|
|
|
// Get an array of all of the files we want to migrate.
|
|
// We do this to create them in the old update directory.
|
|
var filesToMigrate = [FILE_UPDATES_DB, FILE_UPDATE_ACTIVE,
|
|
["updates", FILE_LAST_LOG], ["updates", FILE_BACKUP_LOG],
|
|
["updates", "0", FILE_UPDATE_STATUS]];
|
|
// Move each of those files to the new directory
|
|
filesToMigrate.forEach(relPath => {
|
|
let oldFile = oldUpdateRoot.clone();
|
|
if (relPath instanceof Array) {
|
|
relPath.forEach(relPathPart => {
|
|
oldFile.append(relPathPart);
|
|
});
|
|
} else {
|
|
oldFile.append(relPath);
|
|
}
|
|
oldFile.create(AUS_Ci.nsIFile.NORMAL_FILE_TYPE, PERMS_FILE);
|
|
});
|
|
// Do the migration
|
|
initUpdateServiceStub();
|
|
do_test_finished();
|
|
return;
|
|
// Now verify that each of the files exist in the new update directory
|
|
filesToMigrate.forEach(relPath => {
|
|
let newFile = newUpdateRoot.clone();
|
|
let oldFile = oldUpdateRoot.clone();
|
|
if (relPath instanceof Array) {
|
|
relPath.forEach(relPathPart => {
|
|
newFile.append(relPathPart);
|
|
oldFile.append(relPathPart);
|
|
});
|
|
} else {
|
|
newFile.append(relPath);
|
|
oldFile.append(relPath);
|
|
}
|
|
// The file should be mimgrated, except for FILE_UPDATE_STATUS
|
|
// which gets consumed by post update after it is migrated..
|
|
if (newFile.leafName != FILE_UPDATE_STATUS) {
|
|
do_check_true(newFile.exists());
|
|
}
|
|
do_check_false(oldFile.exists());
|
|
});
|
|
|
|
do_test_finished();
|
|
}
|
|
|
|
function end_test() {
|
|
var appinfo = AUS_Cc["@mozilla.org/xre/app-info;1"].
|
|
getService(AUS_Ci.nsIXULAppInfo).
|
|
QueryInterface(AUS_Ci.nsIXULRuntime);
|
|
var exeFile = FileUtils.getFile(XRE_EXECUTABLE_FILE, []);
|
|
clearTaskbarIDHash(exeFile.parent.path, appinfo.name);
|
|
cleanupTestCommon();
|
|
}
|