summaryrefslogtreecommitdiffstats
path: root/toolkit/components/contentprefs/tests/mochitest/test_remoteContentPrefs.html
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/contentprefs/tests/mochitest/test_remoteContentPrefs.html')
-rw-r--r--toolkit/components/contentprefs/tests/mochitest/test_remoteContentPrefs.html311
1 files changed, 311 insertions, 0 deletions
diff --git a/toolkit/components/contentprefs/tests/mochitest/test_remoteContentPrefs.html b/toolkit/components/contentprefs/tests/mochitest/test_remoteContentPrefs.html
new file mode 100644
index 000000000..d14e85a25
--- /dev/null
+++ b/toolkit/components/contentprefs/tests/mochitest/test_remoteContentPrefs.html
@@ -0,0 +1,311 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for nsIContentPrefService2 in child processes</title>
+ <script type="application/javascript"
+ src="/tests/SimpleTest/SimpleTest.js">
+ </script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+
+ <script type="application/javascript;version=1.8">
+ "use strict";
+
+ SimpleTest.waitForExplicitFinish();
+
+ const childFrameURL =
+ "data:text/html,<!DOCTYPE HTML><html><body></body></html>";
+
+ function childFrameScript(isFramePrivate) {
+ "use strict";
+
+ function Tester(resultArray) {
+ this.results = [];
+ }
+
+ Tester.prototype.is =
+ function(a, b, note) {
+ this.results.push([a === b, note + " (" + a + ", " + b + ")"]);
+ };
+ Tester.prototype.ok =
+ function(b, note) {
+ this.results.push([b != false, note]);
+ };
+
+ var cps = Components.classes["@mozilla.org/content-pref/service;1"]
+ .getService(Components.interfaces.nsIContentPrefService2);
+
+ let test = null;
+ function* test1(message) {
+ let tester = new Tester();
+
+ tester.ok(cps !== null, "got the content pref service");
+
+ cps.setGlobal("testing", 42, null, {
+ handleCompletion: function(reason) {
+ tester.is(reason, 0, "set a pref?");
+ test.next();
+ }
+ });
+
+ yield;
+
+ let numResults = 0;
+ cps.getGlobal("testing", null, {
+ handleResult: function(pref) {
+ numResults++;
+ tester.is(pref.name, "testing", "pref has the right name");
+ tester.is(pref.value, 42, "pref has the right value");
+ },
+
+ handleCompletion: function(reason) {
+ tester.is(reason, 0, "get a pref?");
+ tester.is(numResults, 1, "got the right number of prefs");
+ tester.is(test.next().done, true, "done with test1");
+ message.target.sendAsyncMessage("testRemoteContentPrefs:test1Finished",
+ { results: tester.results });
+ }
+ });
+
+ yield;
+ }
+
+ function* test2(message) {
+ let tester = new Tester();
+
+ let observer;
+ let removed = false;
+ cps.addObserverForName("testName", observer = {
+ onContentPrefSet: function(group, name, value, isPrivate) {
+ if (removed) {
+ message.target.sendAsyncMessage("testRemoteContentPrefs:fail",
+ { reason: "unexpected notification" });
+ }
+ tester.is(group, null, "group should be null");
+ tester.is(name, "testName", "should only see testName");
+ tester.is(value, 42, "value should be correct");
+ tester.is(isPrivate, isFramePrivate, "privacy should match");
+
+ message.target.sendAsyncMessage("testRemoteContentPrefs:test2poke2", {})
+ },
+
+ onContentPrefRemoved: function(group, name, isPrivate) {
+ tester.is(group, null, "group should be null");
+ tester.is(name, "testName");
+ tester.is(isPrivate, isFramePrivate, "privacy should match");
+ tester.is(test.next().done, true, "should be done with test2");
+
+ cps.removeObserverForName("testName", observer);
+ removed = true;
+
+ message.target.sendAsyncMessage("testRemoteContentPrefs:test2Finished",
+ { results: tester.results });
+ }
+ });
+
+ message.target.sendAsyncMessage("testRemoteContentPrefs:test2poke", {});
+ yield;
+ }
+
+ function* test3(message) {
+ let tester = new Tester();
+
+ cps.setGlobal("testName", 42, null, {
+ handleCompletion: function(reason) {
+ tester.is(reason, 0, "set a pref");
+ cps.set("http://mochi.test", "testpref", "str", null, {
+ handleCompletion: function(reason) {
+ tester.is(reason, 0, "set a pref");
+ test.next();
+ }
+ });
+ }
+ });
+
+ yield;
+
+ cps.removeByDomain("http://mochi.test", null, {
+ handleCompletion: function(reason) {
+ tester.is(reason, 0, "remove succeeded");
+ cps.getByDomainAndName("http://mochi.test", "testpref", null, {
+ handleResult: function() {
+ message.target.sendAsyncMessage("testRemoteContentPrefs:fail",
+ { reason: "got removed pref in test3" });
+ },
+ handleCompletion: function() {
+ test.next();
+ }
+ });
+ }
+ });
+
+ yield;
+
+ message.target.sendAsyncMessage("testRemoteContentPrefs:test3Finished",
+ { results: tester.results });
+ }
+
+ function* test4(message) {
+ let tester = new Tester();
+
+ let prefObserver = {
+ onContentPrefSet: function(group, name, value, isPrivate) {
+ test.next({ group: group, name: name, value: value, isPrivate: isPrivate });
+ },
+ onContentPrefRemoved: function(group, name, isPrivate) {
+ test.next({ group: group, name: name, isPrivate: isPrivate });
+ }
+ };
+
+ addMessageListener("testRemoteContentPrefs:prefResults", (msg) => {
+ test.next(msg.data.results);
+ });
+
+ cps.addObserverForName("test", prefObserver);
+
+ cps.set("http://mochi.test", "test", 42, { usePrivateBrowsing: true });
+ let event = yield;
+ tester.is(event.name, "test");
+ tester.is(event.isPrivate, true);
+
+ message.target.sendAsyncMessage("testRemoteContentPrefs:getPref",
+ { group: "http://mochi.test", name: "test" });
+
+ let results = yield;
+ tester.is(results.length, 0, "should not have seen the pb pref");
+
+ message.target.sendAsyncMessage("testRemoteContentPrefs:test4Finished",
+ { results: tester.results });
+ }
+
+ addMessageListener("testRemoteContentPrefs:test1", function(message) {
+ test = test1(message);
+ test.next();
+ });
+ addMessageListener("testRemoteContentPrefs:test2", function(message) {
+ test = test2(message);
+ test.next();
+ });
+ addMessageListener("testRemoteContentPrefs:test3", function(message) {
+ test = test3(message);
+ test.next();
+ });
+ addMessageListener("testRemoteContentPrefs:test4", function(message) {
+ test = test4(message);
+ test.next();
+ });
+ }
+
+ function processResults(results) {
+ for (let i of results) {
+ ok(...i);
+ }
+ }
+
+ let test;
+ function* testStructure(mm, isPrivate, callback) {
+ let lastResult;
+
+ function testDone(msg) {
+ test.next(msg.data);
+ }
+
+ mm.addMessageListener("testRemoteContentPrefs:test1Finished", testDone);
+ mm.addMessageListener("testRemoteContentPrefs:test2Finished", testDone);
+ mm.addMessageListener("testRemoteContentPrefs:test3Finished", testDone);
+ mm.addMessageListener("testRemoteContentPrefs:test4Finished", testDone);
+
+ mm.addMessageListener("testRemoteContentPrefs:fail", function(msg) {
+ ok(false, msg.data.reason);
+ });
+
+ mm.sendAsyncMessage("testRemoteContentPrefs:test1", {});
+ lastResult = yield;
+ processResults(lastResult.results);
+
+ var cps = SpecialPowers.Cc["@mozilla.org/content-pref/service;1"]
+ .getService(SpecialPowers.Ci.nsIContentPrefService2);
+ mm.sendAsyncMessage("testRemoteContentPrefs:test2", {});
+ mm.addMessageListener("testRemoteContentPrefs:test2poke", function() {
+ cps.setGlobal("testName", 42, {usePrivateBrowsing: isPrivate});
+ });
+ mm.addMessageListener("testRemoteContentPrefs:test2poke2", function() {
+ cps.removeGlobal("testName", {usePrivateBrowsing: isPrivate});
+ });
+
+ lastResult = yield;
+ processResults(lastResult.results);
+
+ mm.sendAsyncMessage("testRemoteContentPrefs:test3", {});
+ lastResult = yield;
+ processResults(lastResult.results);
+
+ mm.addMessageListener("testRemoteContentPrefs:getPref", function(msg) {
+ let results = [];
+ cps.getByDomainAndName(msg.data.group, msg.data.name, null, {
+ handleResult: function(pref) {
+ results.push(pref);
+ },
+ handleCompletion: function(reason) {
+ mm.sendAsyncMessage("testRemoteContentPrefs:prefResults",
+ { results: results });
+ }
+ });
+ });
+
+ mm.sendAsyncMessage("testRemoteContentPrefs:test4", {});
+ lastResult = yield;
+ processResults(lastResult.results);
+
+ document.getElementById('iframe').remove();
+ setTimeout(callback, 0);
+ }
+
+ function runTest(isPrivate, callback) {
+ info("testing with isPrivate=" + isPrivate);
+ let iframe = document.createElement("iframe");
+ SpecialPowers.wrap(iframe).mozbrowser = true;
+ if (isPrivate) {
+ SpecialPowers.wrap(iframe).mozprivatebrowsing = true;
+ }
+ iframe.id = "iframe";
+ iframe.src = childFrameURL;
+
+ iframe.addEventListener("mozbrowserloadend", function() {
+ info("Got iframe load event.");
+ let mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
+ mm.loadFrameScript("data:,(" + childFrameScript.toString() + ")(" + isPrivate + ");",
+ false);
+
+ test = testStructure(mm, isPrivate, callback);
+ test.next();
+ });
+
+ document.body.appendChild(iframe);
+ }
+
+ function runTests() {
+ info("Browser prefs set.");
+ runTest(false, function() {
+ runTest(true, function() {
+ SimpleTest.finish();
+ });
+ });
+ }
+
+ addEventListener("load", function() {
+ info("Got load event.");
+
+ SpecialPowers.addPermission("browser", true, document);
+ SpecialPowers.pushPrefEnv({
+ "set": [
+ ["dom.ipc.browser_frames.oop_by_default", true],
+ ["dom.mozBrowserFramesEnabled", true],
+ ["browser.pagethumbnails.capturing_disabled", true]
+ ]
+ }, runTests);
+ });
+ </script>
+</body>
+</html>