Bug 1838365 add some DecodedStream finished logging r=pehrsons,media-playback-reviewe...
[gecko.git] / toolkit / modules / AsyncPrefs.sys.mjs
bloba1e20ea52674f1fea37b4be12ec7960fb2f70865
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 const kInChildProcess =
6   Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT;
8 const kAllowedPrefs = new Set([
9   // NB: please leave the testing prefs at the top, and sort the rest alphabetically if you add
10   // anything.
11   "testing.allowed-prefs.some-bool-pref",
12   "testing.allowed-prefs.some-char-pref",
13   "testing.allowed-prefs.some-int-pref",
15   "browser.contentblocking.report.hide_vpn_banner",
16   "browser.contentblocking.report.show_mobile_app",
18   "narrate.rate",
19   "narrate.voice",
21   "reader.font_size",
22   "reader.font_type",
23   "reader.color_scheme",
24   "reader.content_width",
25   "reader.line_height",
27   "security.tls.version.enable-deprecated",
28   "security.xfocsp.errorReporting.automatic",
30   "network.trr.display_fallback_warning",
31 ]);
33 const kPrefTypeMap = new Map([
34   ["boolean", Services.prefs.PREF_BOOL],
35   ["number", Services.prefs.PREF_INT],
36   ["string", Services.prefs.PREF_STRING],
37 ]);
39 function maybeReturnErrorForReset(pref) {
40   if (!kAllowedPrefs.has(pref)) {
41     return `Resetting pref ${pref} from content is not allowed.`;
42   }
43   return false;
46 function maybeReturnErrorForSet(pref, value) {
47   if (!kAllowedPrefs.has(pref)) {
48     return `Setting pref ${pref} from content is not allowed.`;
49   }
51   let valueType = typeof value;
52   if (!kPrefTypeMap.has(valueType)) {
53     return `Can't set pref ${pref} to value of type ${valueType}.`;
54   }
55   let prefType = Services.prefs.getPrefType(pref);
56   if (
57     prefType != Services.prefs.PREF_INVALID &&
58     prefType != kPrefTypeMap.get(valueType)
59   ) {
60     return `Can't set pref ${pref} to a value with type ${valueType} that doesn't match the pref's type ${prefType}.`;
61   }
62   return false;
65 export class AsyncPrefsChild extends JSProcessActorChild {
66   set(pref, value) {
67     let error = maybeReturnErrorForSet(pref, value);
68     if (error) {
69       return Promise.reject(error);
70     }
72     return this.sendQuery("AsyncPrefs:SetPref", {
73       pref,
74       value,
75     });
76   }
78   reset(pref) {
79     let error = maybeReturnErrorForReset(pref);
80     if (error) {
81       return Promise.reject(error);
82     }
84     return this.sendQuery("AsyncPrefs:ResetPref", { pref });
85   }
88 export var AsyncPrefs = {
89   set(pref, value) {
90     if (kInChildProcess) {
91       return ChromeUtils.domProcessChild
92         .getActor("AsyncPrefs")
93         .set(pref, value);
94     }
95     return AsyncPrefsParent.set(pref, value);
96   },
98   reset(pref, value) {
99     if (kInChildProcess) {
100       return ChromeUtils.domProcessChild.getActor("AsyncPrefs").reset(pref);
101     }
102     return AsyncPrefsParent.reset(pref);
103   },
106 const methodForType = {
107   number: "setIntPref",
108   boolean: "setBoolPref",
109   string: "setCharPref",
112 export class AsyncPrefsParent extends JSProcessActorParent {
113   static set(pref, value) {
114     let error = maybeReturnErrorForSet(pref, value);
115     if (error) {
116       return Promise.reject(error);
117     }
118     let methodToUse = methodForType[typeof value];
119     try {
120       Services.prefs[methodToUse](pref, value);
121     } catch (ex) {
122       console.error(ex);
123       return Promise.reject(ex.message);
124     }
126     return Promise.resolve(value);
127   }
129   static reset(pref) {
130     let error = maybeReturnErrorForReset(pref);
131     if (error) {
132       return Promise.reject(error);
133     }
135     try {
136       Services.prefs.clearUserPref(pref);
137     } catch (ex) {
138       console.error(ex);
139       return Promise.reject(ex.message);
140     }
142     return Promise.resolve();
143   }
145   receiveMessage(msg) {
146     if (msg.name == "AsyncPrefs:SetPref") {
147       return AsyncPrefsParent.set(msg.data.pref, msg.data.value);
148     }
149     return AsyncPrefsParent.reset(msg.data.pref);
150   }