242 lines
6.8 KiB
JavaScript
242 lines
6.8 KiB
JavaScript
"use strict";
|
|
|
|
const childFrameURL = Services.io.newURI(
|
|
"data:text/html,<!DOCTYPE HTML><html><body></body></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);
|
|
});
|