summaryrefslogtreecommitdiffstats
path: root/browser/components/installerprefs/test/unit/head.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/installerprefs/test/unit/head.js')
-rw-r--r--browser/components/installerprefs/test/unit/head.js137
1 files changed, 137 insertions, 0 deletions
diff --git a/browser/components/installerprefs/test/unit/head.js b/browser/components/installerprefs/test/unit/head.js
new file mode 100644
index 0000000000..3d00a2437f
--- /dev/null
+++ b/browser/components/installerprefs/test/unit/head.js
@@ -0,0 +1,137 @@
+/* -*- 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.import(
+ "resource:///modules/InstallerPrefs.jsm"
+);
+
+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();
+ }
+}