summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/tests/browser/browser_AsyncPrefs.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/tests/browser/browser_AsyncPrefs.js')
-rw-r--r--toolkit/modules/tests/browser/browser_AsyncPrefs.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/toolkit/modules/tests/browser/browser_AsyncPrefs.js b/toolkit/modules/tests/browser/browser_AsyncPrefs.js
new file mode 100644
index 0000000000..96eadc4b2e
--- /dev/null
+++ b/toolkit/modules/tests/browser/browser_AsyncPrefs.js
@@ -0,0 +1,133 @@
+"use strict";
+
+const kWhiteListedBool = "testing.allowed-prefs.some-bool-pref";
+const kWhiteListedChar = "testing.allowed-prefs.some-char-pref";
+const kWhiteListedInt = "testing.allowed-prefs.some-int-pref";
+
+function resetPrefs() {
+ for (let pref of [kWhiteListedBool, kWhiteListedChar, kWhiteListedBool]) {
+ Services.prefs.clearUserPref(pref);
+ }
+}
+
+registerCleanupFunction(resetPrefs);
+
+Services.prefs
+ .getDefaultBranch("testing.allowed-prefs.")
+ .setBoolPref("some-bool-pref", false);
+Services.prefs
+ .getDefaultBranch("testing.allowed-prefs.")
+ .setCharPref("some-char-pref", "");
+Services.prefs
+ .getDefaultBranch("testing.allowed-prefs.")
+ .setIntPref("some-int-pref", 0);
+
+async function runTest() {
+ let { AsyncPrefs } = ChromeUtils.importESModule(
+ "resource://gre/modules/AsyncPrefs.sys.mjs"
+ );
+ const kInChildProcess =
+ Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT;
+
+ // Need to define these again because when run in a content task we have no scope access.
+ const kNotWhiteListed = "some.pref.thats.not.whitelisted";
+ const kWhiteListedBool = "testing.allowed-prefs.some-bool-pref";
+ const kWhiteListedChar = "testing.allowed-prefs.some-char-pref";
+ const kWhiteListedInt = "testing.allowed-prefs.some-int-pref";
+
+ const procDesc = kInChildProcess ? "child process" : "parent process";
+
+ const valueResultMap = [
+ [true, "Bool"],
+ [false, "Bool"],
+ [10, "Int"],
+ [-1, "Int"],
+ ["", "Char"],
+ ["stuff", "Char"],
+ [[], false],
+ [{}, false],
+ [Services.io.newURI("http://mozilla.org/"), false],
+ ];
+
+ const prefMap = [
+ ["Bool", kWhiteListedBool],
+ ["Char", kWhiteListedChar],
+ ["Int", kWhiteListedInt],
+ ];
+
+ function doesFail(pref, value) {
+ let msg = `Should not succeed setting ${pref} to ${value} in ${procDesc}`;
+ return AsyncPrefs.set(pref, value).then(
+ () => ok(false, msg),
+ error => ok(true, msg + "; " + error)
+ );
+ }
+
+ function doesWork(pref, value) {
+ let msg = `Should be able to set ${pref} to ${value} in ${procDesc}`;
+ return AsyncPrefs.set(pref, value).then(
+ () => ok(true, msg),
+ error => ok(false, msg + "; " + error)
+ );
+ }
+
+ function doReset(pref) {
+ let msg = `Should be able to reset ${pref} in ${procDesc}`;
+ return AsyncPrefs.reset(pref).then(
+ () => ok(true, msg),
+ () => ok(false, msg)
+ );
+ }
+
+ for (let [val] of valueResultMap) {
+ await doesFail(kNotWhiteListed, val);
+ is(
+ Services.prefs.prefHasUserValue(kNotWhiteListed),
+ false,
+ "Pref shouldn't get changed"
+ );
+ }
+
+ let resetMsg = `Should not succeed resetting ${kNotWhiteListed} in ${procDesc}`;
+ AsyncPrefs.reset(kNotWhiteListed).then(
+ () => ok(false, resetMsg),
+ error => ok(true, resetMsg + "; " + error)
+ );
+
+ for (let [type, pref] of prefMap) {
+ for (let [val, result] of valueResultMap) {
+ if (result == type) {
+ await doesWork(pref, val);
+ is(
+ Services.prefs["get" + type + "Pref"](pref),
+ val,
+ "Pref should have been updated"
+ );
+ await doReset(pref);
+ } else {
+ await doesFail(pref, val);
+ is(
+ Services.prefs.prefHasUserValue(pref),
+ false,
+ `Pref ${pref} shouldn't get changed`
+ );
+ }
+ }
+ }
+}
+
+add_task(async function runInParent() {
+ await runTest();
+ resetPrefs();
+});
+
+if (gMultiProcessBrowser) {
+ add_task(async function runInChild() {
+ ok(
+ gBrowser.selectedBrowser.isRemoteBrowser,
+ "Should actually run this in child process"
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], runTest);
+ resetPrefs();
+ });
+}