137 lines
4 KiB
JavaScript
137 lines
4 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* 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 { AppConstants } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/AppConstants.sys.mjs"
|
|
);
|
|
|
|
const { InstallerPrefs } = ChromeUtils.importESModule(
|
|
"resource:///modules/InstallerPrefs.sys.mjs"
|
|
);
|
|
|
|
let gRegistryKeyPath = "";
|
|
|
|
function startModule(prefsList) {
|
|
// Construct an InstallerPrefs object and simulate a profile-after-change
|
|
// event on it, so that it performs its full startup procedure.
|
|
const prefsModule = new InstallerPrefs(prefsList);
|
|
prefsModule.observe(null, "profile-after-change", "");
|
|
|
|
gRegistryKeyPath = prefsModule._registryKeyPath;
|
|
|
|
registerCleanupFunction(() => cleanupReflectedPrefs(prefsList));
|
|
}
|
|
|
|
function getRegistryKey() {
|
|
const key = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
|
|
Ci.nsIWindowsRegKey
|
|
);
|
|
key.open(
|
|
key.ROOT_KEY_CURRENT_USER,
|
|
gRegistryKeyPath,
|
|
key.ACCESS_READ | key.WOW64_64
|
|
);
|
|
return key;
|
|
}
|
|
|
|
function verifyReflectedPrefs(prefsList) {
|
|
let key;
|
|
try {
|
|
key = getRegistryKey();
|
|
} catch (ex) {
|
|
Assert.ok(false, `Failed to open registry key: ${ex}`);
|
|
return;
|
|
}
|
|
|
|
for (const pref of prefsList) {
|
|
if (pref.startsWith("installer.")) {
|
|
if (Services.prefs.getPrefType(pref) != Services.prefs.PREF_BOOL) {
|
|
Assert.ok(
|
|
!key.hasValue(pref),
|
|
`Pref ${pref} should not be in the registry because its type is not bool`
|
|
);
|
|
} else if (Services.prefs.getBoolPref(pref, false)) {
|
|
Assert.ok(key.hasValue(pref), `Pref ${pref} should be in the registry`);
|
|
Assert.equal(
|
|
key.getValueType(pref),
|
|
key.TYPE_INT,
|
|
`Pref ${pref} should be type DWORD`
|
|
);
|
|
Assert.equal(
|
|
key.readIntValue(pref),
|
|
1,
|
|
`Pref ${pref} should have value 1`
|
|
);
|
|
} else {
|
|
Assert.ok(
|
|
!key.hasValue(pref),
|
|
`Pref ${pref} should not be in the registry because it is false`
|
|
);
|
|
}
|
|
} else {
|
|
Assert.ok(
|
|
!key.hasValue(pref),
|
|
`Pref ${pref} should not be in the registry because its name is invalid`
|
|
);
|
|
}
|
|
}
|
|
|
|
key.close();
|
|
}
|
|
|
|
function cleanupReflectedPrefs(prefsList) {
|
|
// Clear out the prefs themselves.
|
|
prefsList.forEach(pref => Services.prefs.clearUserPref(pref));
|
|
|
|
// Get the registry key path without the path hash at the end,
|
|
// then delete the subkey with the path hash.
|
|
const app = AppConstants.MOZ_APP_NAME;
|
|
const vendor = Services.appinfo.vendor || "Mozilla";
|
|
const xreDirProvider = Cc["@mozilla.org/xre/directory-provider;1"].getService(
|
|
Ci.nsIXREDirProvider
|
|
);
|
|
|
|
const path = `Software\\${vendor}\\${app}\\Installer`;
|
|
|
|
const key = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
|
|
Ci.nsIWindowsRegKey
|
|
);
|
|
try {
|
|
key.open(
|
|
key.ROOT_KEY_CURRENT_USER,
|
|
path,
|
|
key.ACCESS_READ | key.ACCESS_WRITE | key.WOW64_64
|
|
);
|
|
const installHash = xreDirProvider.getInstallHash();
|
|
key.removeChild(installHash);
|
|
} catch (ex) {
|
|
// Nothing left to clean up.
|
|
return;
|
|
}
|
|
|
|
// If the Installer key is now empty, we need to clean it up also, because
|
|
// that would mean that this test created it.
|
|
if (key.childCount == 0) {
|
|
// Unfortunately we can't delete the actual open key, so we'll have to
|
|
// open its parent and delete the one we're after as a child.
|
|
key.close();
|
|
const parentKey = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
|
|
Ci.nsIWindowsRegKey
|
|
);
|
|
try {
|
|
parentKey.open(
|
|
parentKey.ROOT_KEY_CURRENT_USER,
|
|
`Software\\${vendor}\\${app}`,
|
|
parentKey.ACCESS_READ | parentKey.ACCESS_WRITE | parentKey.WOW64_64
|
|
);
|
|
parentKey.removeChild("Installer");
|
|
parentKey.close();
|
|
} catch (ex) {
|
|
// Nothing we can do, and this isn't worth failing the test over.
|
|
}
|
|
} else {
|
|
key.close();
|
|
}
|
|
}
|