"use strict"; const childFrameURL = Services.io.newURI( "data:text/html," ); async function runTestsForFrame(browser, isPrivate) { let loadContext = Cu.createLoadContext(); let privateLoadContext = Cu.createPrivateLoadContext(); await SpecialPowers.spawn(browser, [], async () => { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); Assert.ok(cps !== null, "got the content pref service"); await new Promise(resolve => { cps.setGlobal("testing", 42, null, { handleCompletion(reason) { Assert.equal(reason, 0, "set a pref?"); resolve(); }, }); }); let numResults = 0; await new Promise(resolve => { cps.getGlobal("testing", null, { handleResult(pref) { numResults++; Assert.equal(pref.name, "testing", "pref has the right name"); Assert.equal(pref.value, 42, "pref has the right value"); }, handleCompletion(reason) { Assert.equal(reason, 0, "get a pref?"); Assert.equal(numResults, 1, "got the right number of prefs"); resolve(); }, }); }); }); await SpecialPowers.spawn(browser, [isPrivate], async isFramePrivate => { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); if (!content._result) { content._result = []; } let observer; cps.addObserverForName( "testName", (observer = { onContentPrefSet(group, name, value, isPrivate) { Assert.equal(group, null, "group should be null"); Assert.equal(name, "testName", "should only see testName"); Assert.equal(value, 42, "value should be correct"); Assert.equal(isPrivate, isFramePrivate, "privacy should match"); content._result.push("set"); }, onContentPrefRemoved(group, name, isPrivate) { Assert.equal(group, null, "group should be null"); Assert.equal(name, "testName", "name should match"); Assert.equal(isPrivate, isFramePrivate, "privacy should match"); content._result.push("removed"); }, }) ); content._observer = observer; }); for (let expectedResponse of ["set", "removed"]) { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); if (expectedResponse == "set") { cps.setGlobal( "testName", 42, isPrivate ? privateLoadContext : loadContext ); } else { cps.removeGlobal( "testName", isPrivate ? privateLoadContext : loadContext ); } let response = await SpecialPowers.spawn( browser, [expectedResponse], async expected => { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); await ContentTaskUtils.waitForCondition( () => content._result.length == 1, "expecting one notification" ); if (expected == "removed") { cps.removeObserverForName("testName", content._observer); } Assert.equal( content._result.length, 1, "correct number of notifications" ); let result = content._result[0]; content._result = []; return result; } ); is(response, expectedResponse, "got correct observer notification"); } await SpecialPowers.spawn(browser, [], async () => { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); await new Promise(resolve => { cps.setGlobal("testName", 42, null, { handleCompletion(reason) { Assert.equal(reason, 0, "set a pref"); cps.set("http://mochi.test", "testpref", "str", null, { /* eslint no-shadow: 0 */ handleCompletion(reason) { Assert.equal(reason, 0, "set a pref"); resolve(); }, }); }, }); }); await new Promise(resolve => { cps.removeByDomain("http://mochi.test", null, { handleCompletion(reason) { Assert.equal(reason, 0, "remove succeeded"); cps.getByDomainAndName("http://mochi.test", "testpref", null, { handleResult() { throw new Error("got removed pref in test3"); }, handleCompletion() { resolve(); }, handleError(rv) { throw new Error(`got a pref error ${rv}`); }, }); }, }); }); }); await SpecialPowers.spawn(browser, [], async () => { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); let event = await new Promise((resolve, reject) => { let prefObserver = { onContentPrefSet(group, name, value, isPrivate) { resolve({ group, name, value, isPrivate }); }, onContentPrefRemoved() { reject("got unexpected notification"); }, }; cps.addObserverForName("test", prefObserver); let privateLoadContext = Cu.createPrivateLoadContext(); cps.set("http://mochi.test", "test", 42, privateLoadContext); cps.addObserverForName("test", prefObserver); }); Assert.equal(event.name, "test", "got the right event"); Assert.equal(event.isPrivate, true, "the event was for an isPrivate pref"); }); await SpecialPowers.spawn(browser, [], async () => { var cps = Cc["@mozilla.org/content-pref/service;1"].getService( Ci.nsIContentPrefService2 ); let results = []; await new Promise(resolve => { cps.getByDomainAndName("http://mochi.test", "test", null, { handleResult(pref) { info("received handleResult"); results.push(pref); }, handleCompletion() { resolve(); }, handleError(rv) { ok(false, `failed to get pref ${rv}`); throw new Error("got unexpected error"); }, }); }); Assert.equal(results.length, 0, "should not have seen the pb pref"); }); } async function runTest(isPrivate) { /* globals Services */ info("testing with isPrivate=" + isPrivate); let newWindow = await BrowserTestUtils.openNewBrowserWindow({ private: isPrivate, }); const system = Services.scriptSecurityManager.getSystemPrincipal(); let browser = newWindow.gBrowser.selectedBrowser; let loadedPromise = BrowserTestUtils.browserLoaded(browser); browser.loadURI(childFrameURL, { triggeringPrincipal: system }); await loadedPromise; await runTestsForFrame(browser, isPrivate); newWindow.close(); } add_task(async function () { await runTest(false); await runTest(true); });