"use strict"; const kBoolTestPref = "testing.allowed-prefs.some-bool-pref"; const kCharTestPref = "testing.allowed-prefs.some-char-pref"; const kIntTestPref = "testing.allowed-prefs.some-int-pref"; // We have to use a real pref because we don't want to include testing // prefs for the web content process. const kRealTestPref = "reader.font_size"; function resetPrefs() { for (let pref of [ kBoolTestPref, kCharTestPref, kIntTestPref, kRealTestPref, ]) { 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" ); // Need to define these again because when run in a content task we have no scope access. const kNotAllowed = "some.pref.thats.not.allowed"; const kBoolTestPref = "testing.allowed-prefs.some-bool-pref"; const kCharTestPref = "testing.allowed-prefs.some-char-pref"; const kIntTestPref = "testing.allowed-prefs.some-int-pref"; const kRealTestPref = "reader.font_size"; let procDesc; switch (Services.appinfo.remoteType) { case null: procDesc = "parent process"; break; case "privilegedabout": procDesc = "privileged about: process"; break; default: procDesc = `${Services.appinfo.remoteType} child process`; break; } 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", kBoolTestPref], ["Char", kCharTestPref], ["Int", kIntTestPref], ]; 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(kNotAllowed, val); is( Services.prefs.prefHasUserValue(kNotAllowed), false, "Pref shouldn't get changed" ); } let resetMsg = `Should not succeed resetting ${kNotAllowed} in ${procDesc}`; AsyncPrefs.reset(kNotAllowed).then( () => ok(false, resetMsg), error => ok(true, resetMsg + "; " + error) ); let haveSomePrivilege = Services.appinfo.remoteType == null || Services.appinfo.remoteType == "privilegedabout"; for (let [type, pref] of prefMap) { for (let [val, result] of valueResultMap) { if (haveSomePrivilege && 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` ); } } } let oldValue = Services.prefs.getIntPref(kRealTestPref); await AsyncPrefs.set(kRealTestPref, 2 * oldValue); Assert.equal( Services.prefs.getIntPref(kRealTestPref), 2 * oldValue, `Should have been able to set ${kRealTestPref} from ${procDesc}` ); await AsyncPrefs.reset(kRealTestPref); Assert.equal( Services.prefs.getIntPref(kRealTestPref), oldValue, `Should have been able to reset ${kRealTestPref} from ${procDesc}` ); } describe("AsyncPrefs", function runInParent() { afterEach(resetPrefs); it("should work in the parent process", async function runInParent() { await runTest(); }); it("should work in the privileged about process", async function runInPrivilegedAbout() { await BrowserTestUtils.withNewTab( "about:privatebrowsing", async function (browser) { ok( browser.isRemoteBrowser, "Should actually run this in child process" ); Assert.equal( browser.browsingContext.currentRemoteType, "privilegedabout", "Should be in a privileged about process" ); await SpecialPowers.spawn(browser, [], runTest); } ); }); it("should work in the web child process", async function runInWebChild() { await BrowserTestUtils.withNewTab( "https://example.com/somewhere404", async function (browser) { ok( browser.isRemoteBrowser, "Should actually run this in child process" ); Assert.equal( browser.browsingContext.currentRemoteType, "webIsolated=https://example.com", "Should be in a web isolated process" ); await SpecialPowers.spawn(browser, [], runTest); } ); }); });