diff options
Diffstat (limited to '')
-rw-r--r-- | browser/components/installerprefs/test/unit/head.js | 137 |
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(); + } +} |