Bug 1309735 - Test container isolation with mozbrowser frames. r=baku draft
authorJ. Ryan Stinnett <jryans@gmail.com>
Wed, 06 Jun 2018 17:15:51 -0500
changeset 805017 7f1e43998257ce1b85c45f8d23d66ef3048c901b
parent 804831 798bf46c5356fd1a99f83c7174295d309887b5d3
push id112522
push userbmo:jryans@gmail.com
push dateWed, 06 Jun 2018 22:28:33 +0000
reviewersbaku
bugs1309735
milestone62.0a1
Bug 1309735 - Test container isolation with mozbrowser frames. r=baku MozReview-Commit-ID: FcydOsaVZvs
browser/components/contextualidentity/test/browser/browser_broadcastchannel.js
--- a/browser/components/contextualidentity/test/browser/browser_broadcastchannel.js
+++ b/browser/components/contextualidentity/test/browser/browser_broadcastchannel.js
@@ -1,37 +1,76 @@
 const BASE_ORIGIN = "http://example.com";
 const URI = BASE_ORIGIN +
   "/browser/browser/components/contextualidentity/test/browser/empty_file.html";
 
-// opens `uri' in a new tab with the provided userContextId and focuses it.
-// returns the newly opened tab
+// Opens `uri' in a new tab with the provided userContextId and focuses it.
+// Returns the newly opened tab and browser.
 async function openTabInUserContext(uri, userContextId) {
   // open the tab in the correct userContextId
   let tab = BrowserTestUtils.addTab(gBrowser, uri, {userContextId});
 
   // select tab and make sure its browser is focused
   gBrowser.selectedTab = tab;
   tab.ownerGlobal.focus();
 
   let browser = gBrowser.getBrowserForTab(tab);
   await BrowserTestUtils.browserLoaded(browser);
   return {tab, browser};
 }
 
-add_task(async function setup() {
-  // make sure userContext is enabled.
-  await SpecialPowers.pushPrefEnv({"set": [
-    ["privacy.userContext.enabled", true]
-  ]});
-});
+// Opens `uri' in a new <iframe mozbrowser> with the provided userContextId.
+// Returns the newly opened browser.
+async function addBrowserFrameInUserContext(uri, userContextId) {
+  // Create a browser frame with the user context and uri
+  const browser = document.createElementNS("http://www.w3.org/1999/xhtml", "iframe");
+  browser.setAttribute("remote", "true");
+  browser.setAttribute("usercontextid", userContextId);
+  browser.setAttribute("mozbrowser", "true");
+  // `noisolation = true` means `OA.mInIsolatedMozBrowser = false` which matches
+  // the default for a XUL browser. It is indepedent from user contexts.
+  browser.setAttribute("noisolation", "true");
+  browser.setAttribute("src", uri);
+  gBrowser.tabpanels.appendChild(browser);
+
+  // Create a XUL browser-like API expected by test helpers
+  Object.defineProperty(browser, "messageManager", {
+    get() {
+      return browser.frameLoader.messageManager;
+    },
+    configurable: true,
+    enumerable: true,
+  });
+
+  await browserFrameLoaded(browser);
 
-add_task(async function test() {
-  let receiver = await openTabInUserContext(URI, 2);
+  return { browser };
+}
 
+function browserFrameLoaded(browser) {
+  const mm = browser.messageManager;
+  return new Promise(resolve => {
+    const eventName = "browser-test-utils:loadEvent";
+    mm.addMessageListener(eventName, function onLoad(msg) {
+      if (msg.target != browser) {
+        return;
+      }
+      mm.removeMessageListener(eventName, onLoad);
+      resolve(msg.data.internalURL);
+    });
+  });
+}
+
+function removeBrowserFrame({ browser }) {
+  browser.remove();
+  // Clean up Browser API parent-side data
+  delete window._browserElementParents;
+}
+
+async function runTestForReceiver(receiver) {
   let channelName = "contextualidentity-broadcastchannel";
 
   // reflect the received message on title
   await ContentTask.spawn(receiver.browser, channelName,
     function(name) {
       content.window.testPromise = new content.window.Promise(resolve => {
         content.window.bc = new content.window.BroadcastChannel(name);
         content.window.bc.onmessage = function(e) {
@@ -67,10 +106,33 @@ add_task(async function test() {
         is(content.document.title, message,
            "should only receive messages from the same user context");
       });
     }
   );
 
   gBrowser.removeTab(sender1.tab);
   gBrowser.removeTab(sender2.tab);
+}
+
+add_task(async function setup() {
+  // make sure userContext is enabled.
+  await SpecialPowers.pushPrefEnv({"set": [
+    ["privacy.userContext.enabled", true]
+  ]});
+});
+
+add_task(async function test() {
+  info("Checking broadcast channel with browser tab receiver");
+  let receiver = await openTabInUserContext(URI, 2);
+  await runTestForReceiver(receiver);
   gBrowser.removeTab(receiver.tab);
 });
+
+add_task(async function test() {
+  info("Checking broadcast channel with <iframe mozbrowser> receiver");
+  await SpecialPowers.pushPrefEnv({"set": [
+    ["dom.mozBrowserFramesEnabled", true]
+  ]});
+  let receiver = await addBrowserFrameInUserContext(URI, 2);
+  await runTestForReceiver(receiver);
+  removeBrowserFrame(receiver);
+});