Bug 1942239 - Add option to explicitly enable incremental origin initialization in...
[gecko.git] / toolkit / modules / WindowsRegistry.sys.mjs
blob7bc6c77ae195dc5ceb4a57ca957a39b5143f445a
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 export var WindowsRegistry = {
6   /**
7    * Safely reads a value from the registry.
8    *
9    * @param aRoot
10    *        The root registry to use.
11    * @param aPath
12    *        The registry path to the key.
13    * @param aKey
14    *        The key name.
15    * @param [aRegistryNode=0]
16    *        Optionally set to nsIWindowsRegKey.WOW64_64 (or nsIWindowsRegKey.WOW64_32)
17    *        to access a 64-bit (32-bit) key from either a 32-bit or 64-bit application.
18    * @return The key value or undefined if it doesn't exist.  If the key is
19    *         a REG_MULTI_SZ, an array is returned.
20    */
21   readRegKey(aRoot, aPath, aKey, aRegistryNode = 0) {
22     const kRegMultiSz = 7;
23     const kMode = Ci.nsIWindowsRegKey.ACCESS_READ | aRegistryNode;
24     let registry = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
25       Ci.nsIWindowsRegKey
26     );
27     try {
28       registry.open(aRoot, aPath, kMode);
29       if (registry.hasValue(aKey)) {
30         let type = registry.getValueType(aKey);
31         switch (type) {
32           case kRegMultiSz:
33             // nsIWindowsRegKey doesn't support REG_MULTI_SZ type out of the box.
34             let str = registry.readStringValue(aKey);
35             return str.split("\0").filter(v => v);
36           case Ci.nsIWindowsRegKey.TYPE_STRING:
37             return registry.readStringValue(aKey);
38           case Ci.nsIWindowsRegKey.TYPE_INT:
39             return registry.readIntValue(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   },
51   /**
52    * Safely removes a key from the registry.
53    *
54    * @param aRoot
55    *        The root registry to use.
56    * @param aPath
57    *        The registry path to the key.
58    * @param aKey
59    *        The key name.
60    * @param [aRegistryNode=0]
61    *        Optionally set to nsIWindowsRegKey.WOW64_64 (or nsIWindowsRegKey.WOW64_32)
62    *        to access a 64-bit (32-bit) key from either a 32-bit or 64-bit application.
63    * @return True if the key was removed or never existed, false otherwise.
64    */
65   removeRegKey(aRoot, aPath, aKey, aRegistryNode = 0) {
66     let registry = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
67       Ci.nsIWindowsRegKey
68     );
69     let result = false;
70     try {
71       let mode =
72         Ci.nsIWindowsRegKey.ACCESS_QUERY_VALUE |
73         Ci.nsIWindowsRegKey.ACCESS_SET_VALUE |
74         aRegistryNode;
75       registry.open(aRoot, aPath, mode);
76       if (registry.hasValue(aKey)) {
77         registry.removeValue(aKey);
78         result = !registry.hasValue(aKey);
79       } else {
80         result = true;
81       }
82     } catch (ex) {
83     } finally {
84       registry.close();
85     }
86     return result;
87   },