browser_preXULSkeletonUIRegistry.js (4580B)
1 ChromeUtils.defineESModuleGetters(this, { 2 WindowsRegistry: "resource://gre/modules/WindowsRegistry.sys.mjs", 3 }); 4 5 function getFirefoxExecutableFile() { 6 let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); 7 file = Services.dirsvc.get("GreBinD", Ci.nsIFile); 8 9 file.append(AppConstants.MOZ_APP_NAME + ".exe"); 10 return file; 11 } 12 13 // This is copied from WindowsRegistry.sys.mjs, but extended to support 14 // TYPE_BINARY, as that is how we represent doubles in the registry for 15 // the skeleton UI. However, we didn't extend WindowsRegistry.sys.mjs itself, 16 // because TYPE_BINARY is kind of a footgun for javascript callers - our 17 // use case is just trivial (checking that the value is non-zero). 18 function readRegKeyExtended(aRoot, aPath, aKey, aRegistryNode = 0) { 19 const kRegMultiSz = 7; 20 const kMode = Ci.nsIWindowsRegKey.ACCESS_READ | aRegistryNode; 21 let registry = Cc["@mozilla.org/windows-registry-key;1"].createInstance( 22 Ci.nsIWindowsRegKey 23 ); 24 try { 25 registry.open(aRoot, aPath, kMode); 26 if (registry.hasValue(aKey)) { 27 let type = registry.getValueType(aKey); 28 switch (type) { 29 case kRegMultiSz: { 30 // nsIWindowsRegKey doesn't support REG_MULTI_SZ type out of the box. 31 let str = registry.readStringValue(aKey); 32 return str.split("\0").filter(v => v); 33 } 34 case Ci.nsIWindowsRegKey.TYPE_STRING: 35 return registry.readStringValue(aKey); 36 case Ci.nsIWindowsRegKey.TYPE_INT: 37 return registry.readIntValue(aKey); 38 case Ci.nsIWindowsRegKey.TYPE_BINARY: 39 return registry.readBinaryValue(aKey); 40 default: 41 throw new Error("Unsupported registry value."); 42 } 43 } 44 } catch (ex) { 45 } finally { 46 registry.close(); 47 } 48 return undefined; 49 } 50 51 add_task(async function testWritesEnabledOnPrefChange() { 52 Services.prefs.setBoolPref("browser.startup.preXulSkeletonUI", true); 53 54 const win = await BrowserTestUtils.openNewBrowserWindow(); 55 56 const firefoxPath = getFirefoxExecutableFile().path; 57 let enabled = WindowsRegistry.readRegKey( 58 Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, 59 "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings", 60 `${firefoxPath}|Enabled` 61 ); 62 is(enabled, 1, "Pre-XUL skeleton UI is enabled in the Windows registry"); 63 64 Services.prefs.setBoolPref("browser.startup.preXulSkeletonUI", false); 65 enabled = WindowsRegistry.readRegKey( 66 Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, 67 "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings", 68 `${firefoxPath}|Enabled` 69 ); 70 is(enabled, 0, "Pre-XUL skeleton UI is disabled in the Windows registry"); 71 72 Services.prefs.setBoolPref("browser.startup.preXulSkeletonUI", true); 73 Services.prefs.setIntPref("browser.tabs.inTitlebar", 0); 74 enabled = WindowsRegistry.readRegKey( 75 Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, 76 "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings", 77 `${firefoxPath}|Enabled` 78 ); 79 is(enabled, 0, "Pre-XUL skeleton UI is disabled in the Windows registry"); 80 81 await BrowserTestUtils.closeWindow(win); 82 }); 83 84 add_task(async function testPersistsNecessaryValuesOnChange() { 85 // Enable the skeleton UI, since if it's disabled we won't persist the size values 86 await SpecialPowers.pushPrefEnv({ 87 set: [["browser.startup.preXulSkeletonUI", true]], 88 }); 89 90 const regKeys = [ 91 "Width", 92 "Height", 93 "ScreenX", 94 "ScreenY", 95 "UrlbarCSSSpan", 96 "CssToDevPixelScaling", 97 "SpringsCSSSpan", 98 "SearchbarCSSSpan", 99 "Theme", 100 "Flags", 101 "Progress", 102 ]; 103 104 // Remove all of the registry values to ensure old tests aren't giving us false 105 // positives 106 for (let key of regKeys) { 107 WindowsRegistry.removeRegKey( 108 Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, 109 "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings", 110 key 111 ); 112 } 113 114 const win = await BrowserTestUtils.openNewBrowserWindow(); 115 const firefoxPath = getFirefoxExecutableFile().path; 116 for (let key of regKeys) { 117 let value = readRegKeyExtended( 118 Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER, 119 "Software\\Mozilla\\Firefox\\PreXULSkeletonUISettings", 120 `${firefoxPath}|${key}` 121 ); 122 isnot( 123 typeof value, 124 "undefined", 125 `Skeleton UI registry values should have a defined value for ${key}` 126 ); 127 if (value.length) { 128 let hasNonZero = false; 129 for (var i = 0; i < value.length; i++) { 130 hasNonZero = hasNonZero || value[i]; 131 } 132 ok(hasNonZero, `Value should have non-zero components for ${key}`); 133 } 134 } 135 136 await BrowserTestUtils.closeWindow(win); 137 });