Bug 1233497 - Don't yield or resolve CPOWs from Tasks or Promises in devtools tests. r?jryans draft
authorMike Conley <mconley@mozilla.com>
Thu, 07 Jan 2016 13:40:41 -0500
changeset 322531 b4ddd78bc307e9223e06770f74986332a7dc412c
parent 322530 a786692fc39e3af507e39c24bea64e0eae1ae3b2
child 322532 635751333df189ac82cfcdf12e74071f0b957098
push id9629
push usermconley@mozilla.com
push dateMon, 18 Jan 2016 22:25:49 +0000
reviewersjryans
bugs1233497
milestone46.0a1
Bug 1233497 - Don't yield or resolve CPOWs from Tasks or Promises in devtools tests. r?jryans
devtools/client/storage/test/browser_storage_dynamic_updates.js
devtools/client/storage/test/head.js
devtools/server/tests/browser/browser_canvasframe_helper_01.js
devtools/server/tests/browser/browser_canvasframe_helper_02.js
devtools/server/tests/browser/browser_canvasframe_helper_03.js
devtools/server/tests/browser/browser_canvasframe_helper_04.js
devtools/server/tests/browser/browser_canvasframe_helper_05.js
devtools/server/tests/browser/browser_canvasframe_helper_06.js
devtools/server/tests/browser/browser_directorscript_actors.js
devtools/server/tests/browser/browser_directorscript_actors_error_events.js
devtools/server/tests/browser/browser_directorscript_actors_exports.js
devtools/server/tests/browser/browser_markers-cycle-collection.js
devtools/server/tests/browser/browser_markers-docloading-01.js
devtools/server/tests/browser/browser_markers-docloading-02.js
devtools/server/tests/browser/browser_markers-docloading-03.js
devtools/server/tests/browser/browser_markers-gc.js
devtools/server/tests/browser/browser_markers-parse-html.js
devtools/server/tests/browser/browser_markers-styles.js
devtools/server/tests/browser/browser_markers-timestamp.js
devtools/server/tests/browser/browser_navigateEvents.js
devtools/server/tests/browser/browser_perf-allocation-data.js
devtools/server/tests/browser/browser_perf-profiler-01.js
devtools/server/tests/browser/browser_perf-realtime-markers.js
devtools/server/tests/browser/browser_perf-recording-actor-01.js
devtools/server/tests/browser/browser_perf-recording-actor-02.js
devtools/server/tests/browser/browser_perf-samples-01.js
devtools/server/tests/browser/browser_perf-samples-02.js
devtools/server/tests/browser/browser_storage_dynamic_windows.js
devtools/server/tests/browser/browser_storage_listings.js
devtools/server/tests/browser/browser_storage_updates.js
devtools/server/tests/browser/browser_stylesheets_nested-iframes.js
devtools/server/tests/browser/browser_timeline.js
devtools/server/tests/browser/browser_timeline_actors.js
devtools/server/tests/browser/browser_timeline_iframes.js
devtools/server/tests/browser/head.js
--- a/devtools/client/storage/test/browser_storage_dynamic_updates.js
+++ b/devtools/client/storage/test/browser_storage_dynamic_updates.js
@@ -192,18 +192,22 @@ add_task(function*() {
 
   yield gUI.once("sidebar-updated");
 
   is($("#value [data-id='ss2']").value, "changed=ss2",
       "Value got updated for session storage in the table");
 
   yield findVariableViewProperties([{name: "ss2", value: "changed=ss2"}]);
 
-  // Clearing items
-  yield gWindow.clear();
+  // Clearing items. Bug 1233497 makes it so that we can no longer yield
+  // CPOWs from Tasks. We work around this by calling clear via a ContentTask
+  // instead.
+  yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+    return Task.spawn(content.wrappedJSObject.clear);
+  });
 
   yield gUI.once("store-objects-cleared");
 
   is($$("#value .table-widget-cell").length, 0,
      "Table should be cleared");
 
   yield finishTests();
 });
--- a/devtools/client/storage/test/head.js
+++ b/devtools/client/storage/test/head.js
@@ -195,50 +195,53 @@ function waitForToolboxFrameFocus(toolbo
  */
 function forceCollections() {
   Cu.forceGC();
   Cu.forceCC();
   Cu.forceShrinkingGC();
 }
 
 /**
- * Get all windows including frames recursively.
- *
- * @param {Window} [baseWindow]
- *        The base window at which to start looking for child windows
- *        (optional).
- * @return {Set}
- *         A set of windows.
- */
-function getAllWindows(baseWindow=gWindow) {
-  let windows = new Set();
-
-  let _getAllWindows = function(win) {
-    windows.add(win);
-
-    for (let i = 0; i < win.length; i++) {
-      _getAllWindows(win[i]);
-    }
-  };
-  _getAllWindows(baseWindow);
-
-  return windows;
-}
-
-/**
  * Cleans up and finishes the test
  */
 function* finishTests() {
-  for (let win of getAllWindows()) {
-    if (win.clear) {
-      console.log("Clearing cookies, localStorage and indexedDBs from " +
-                  win.document.location);
-      yield win.clear();
+  // Bug 1233497 makes it so that we can no longer yield CPOWs from Tasks.
+  // We work around this by calling clear() via a ContentTask instead.
+  yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+    /**
+     * Get all windows including frames recursively.
+     *
+     * @param {Window} [baseWindow]
+     *        The base window at which to start looking for child windows
+     *        (optional).
+     * @return {Set}
+     *         A set of windows.
+     */
+    function getAllWindows(baseWindow) {
+      let windows = new Set();
+
+      let _getAllWindows = function(win) {
+        windows.add(win);
+
+        for (let i = 0; i < win.length; i++) {
+          _getAllWindows(win[i]);
+        }
+      };
+      _getAllWindows(baseWindow);
+
+      return windows;
     }
-  }
+
+    let windows = getAllWindows(content.wrappedJSObject);
+    for (let win of windows) {
+      if (win.clear) {
+        yield Task.spawn(win.clear);
+      }
+    }
+  });
 
   forceCollections();
   finish();
 }
 
 // Sends a click event on the passed DOM node in an async manner
 function* click(node) {
   let def = promise.defer();
--- a/devtools/server/tests/browser/browser_canvasframe_helper_01.js
+++ b/devtools/server/tests/browser/browser_canvasframe_helper_01.js
@@ -13,17 +13,18 @@ const {HighlighterEnvironment} = require
 
 const {
   CanvasFrameAnonymousContentHelper
 } = require("devtools/server/actors/highlighters/utils/markup");
 
 const TEST_URL = "data:text/html;charset=utf-8,CanvasFrameAnonymousContentHelper test";
 
 add_task(function*() {
-  let doc = yield addTab(TEST_URL);
+  let browser = yield addTab(TEST_URL);
+  let doc = browser.contentDocument;
 
   let nodeBuilder = () => {
     let root = doc.createElement("div");
     let child = doc.createElement("div");
     child.style = "width:200px;height:200px;background:red;";
     child.id = "child-element";
     child.className = "child-element";
     child.textContent = "test element";
--- a/devtools/server/tests/browser/browser_canvasframe_helper_02.js
+++ b/devtools/server/tests/browser/browser_canvasframe_helper_02.js
@@ -13,17 +13,18 @@ require("devtools/server/actors/inspecto
 
 const {HighlighterEnvironment} = require("devtools/server/actors/highlighters");
 
 const {
   CanvasFrameAnonymousContentHelper
 } = require("devtools/server/actors/highlighters/utils/markup");
 
 add_task(function*() {
-  let doc = yield addTab("about:preferences");
+  let browser = yield addTab("about:preferences");
+  let doc = browser.contentDocument;
 
   let nodeBuilder = () => {
     let root = doc.createElement("div");
     let child = doc.createElement("div");
     child.style = "width:200px;height:200px;background:red;";
     child.id = "child-element";
     child.className = "child-element";
     child.textContent = "test element";
--- a/devtools/server/tests/browser/browser_canvasframe_helper_03.js
+++ b/devtools/server/tests/browser/browser_canvasframe_helper_03.js
@@ -14,17 +14,18 @@ const {HighlighterEnvironment} = require
 
 const {
   CanvasFrameAnonymousContentHelper
 } = require("devtools/server/actors/highlighters/utils/markup");
 
 const TEST_URL = "data:text/html;charset=utf-8,CanvasFrameAnonymousContentHelper test";
 
 add_task(function*() {
-  let doc = yield addTab(TEST_URL);
+  let browser = yield addTab(TEST_URL);
+  let doc = browser.contentDocument;
 
   let nodeBuilder = () => {
     let root = doc.createElement("div");
     let child = doc.createElement("div");
     child.style = "pointer-events:auto;width:200px;height:200px;background:red;";
     child.id = "child-element";
     child.className = "child-element";
     root.appendChild(child);
--- a/devtools/server/tests/browser/browser_canvasframe_helper_04.js
+++ b/devtools/server/tests/browser/browser_canvasframe_helper_04.js
@@ -17,17 +17,18 @@ const {HighlighterEnvironment} = require
 const {
   CanvasFrameAnonymousContentHelper
 } = require("devtools/server/actors/highlighters/utils/markup");
 
 const TEST_URL_1 = "data:text/html;charset=utf-8,CanvasFrameAnonymousContentHelper test 1";
 const TEST_URL_2 = "data:text/html;charset=utf-8,CanvasFrameAnonymousContentHelper test 2";
 
 add_task(function*() {
-  let doc = yield addTab(TEST_URL_2);
+  let browser = yield addTab(TEST_URL_2);
+  let doc = browser.contentDocument;
 
   let nodeBuilder = () => {
     let root = doc.createElement("div");
     let child = doc.createElement("div");
     child.style = "pointer-events:auto;width:200px;height:200px;background:red;";
     child.id = "child-element";
     child.className = "child-element";
     child.textContent= "test content";
--- a/devtools/server/tests/browser/browser_canvasframe_helper_05.js
+++ b/devtools/server/tests/browser/browser_canvasframe_helper_05.js
@@ -15,17 +15,18 @@ const {HighlighterEnvironment} = require
 
 const {
   CanvasFrameAnonymousContentHelper
 } = require("devtools/server/actors/highlighters/utils/markup");
 
 const TEST_URL = "data:text/html;charset=utf-8,CanvasFrameAnonymousContentHelper test";
 
 add_task(function*() {
-  let doc = yield addTab(TEST_URL);
+  let browser = yield addTab(TEST_URL);
+  let doc = browser.contentDocument;
 
   let nodeBuilder = () => {
     let root = doc.createElement("div");
 
     let parent = doc.createElement("div");
     parent.style = "pointer-events:auto;width:300px;height:300px;background:yellow;";
     parent.id = "parent-element";
     root.appendChild(parent);
--- a/devtools/server/tests/browser/browser_canvasframe_helper_06.js
+++ b/devtools/server/tests/browser/browser_canvasframe_helper_06.js
@@ -15,17 +15,18 @@ const {HighlighterEnvironment} = require
 
 const {
   CanvasFrameAnonymousContentHelper
 } = require("devtools/server/actors/highlighters/utils/markup");
 
 const TEST_URL = "data:text/html;charset=utf-8,CanvasFrameAnonymousContentHelper test";
 
 add_task(function*() {
-  let doc = yield addTab(TEST_URL);
+  let browser = yield addTab(TEST_URL);
+  let doc = browser.contentDocument;
 
   let nodeBuilder = () => {
     let root = doc.createElement("div");
 
     let parent = doc.createElement("div");
     parent.style = "pointer-events:auto;width:300px;height:300px;background:yellow;";
     parent.id = "parent-element";
     root.appendChild(parent);
--- a/devtools/server/tests/browser/browser_directorscript_actors.js
+++ b/devtools/server/tests/browser/browser_directorscript_actors.js
@@ -3,17 +3,18 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const {DirectorManagerFront} = require("devtools/server/actors/director-manager");
 const {DirectorRegistry} = require("devtools/server/actors/director-registry");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+  let browser = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
 
   DirectorRegistry.clear();
   let directorManager = DirectorManagerFront(client, form);
 
--- a/devtools/server/tests/browser/browser_directorscript_actors_error_events.js
+++ b/devtools/server/tests/browser/browser_directorscript_actors_error_events.js
@@ -3,17 +3,18 @@
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const {DirectorManagerFront} = require("devtools/server/actors/director-manager");
 const {DirectorRegistry} = require("devtools/server/actors/director-registry");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+  let browser = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
 
   DirectorRegistry.clear();
   let directorManager = DirectorManagerFront(client, form);
 
--- a/devtools/server/tests/browser/browser_directorscript_actors_exports.js
+++ b/devtools/server/tests/browser/browser_directorscript_actors_exports.js
@@ -5,17 +5,18 @@
 "use strict";
 
 const {DirectorManagerFront} = require("devtools/server/actors/director-manager");
 const {DirectorRegistry} = require("devtools/server/actors/director-registry");
 
 DirectorRegistry.clear();
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+  let browser = yield addTab(MAIN_DOMAIN + "director-script-target.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
 
   DirectorRegistry.clear();
   let directorManager = DirectorManagerFront(client, form);
 
--- a/devtools/server/tests/browser/browser_markers-cycle-collection.js
+++ b/devtools/server/tests/browser/browser_markers-cycle-collection.js
@@ -7,17 +7,18 @@
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
   // This test runs very slowly on linux32 debug EC2 instances.
   requestLongerTimeout(2);
 
-  let doc = yield addTab(MAIN_DOMAIN + "doc_force_cc.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_force_cc.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
   let rec = yield front.startRecording({ withMarkers: true });
 
--- a/devtools/server/tests/browser/browser_markers-docloading-01.js
+++ b/devtools/server/tests/browser/browser_markers-docloading-01.js
@@ -4,17 +4,18 @@
 /**
  * Test that we get DOMContentLoaded and Load markers
  */
 
 const { TimelineFront } = require("devtools/server/actors/timeline");
 const MARKER_NAMES = ["document::DOMContentLoaded", "document::Load"];
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = TimelineFront(client, form);
   let rec = yield front.start({ withMarkers: true });
 
   front.once("doc-loading", e => {
--- a/devtools/server/tests/browser/browser_markers-docloading-02.js
+++ b/devtools/server/tests/browser/browser_markers-docloading-02.js
@@ -4,17 +4,18 @@
 /**
  * Test that we get DOMContentLoaded and Load markers
  */
 
 const { TimelineFront } = require("devtools/server/actors/timeline");
 const MARKER_NAMES = ["document::DOMContentLoaded", "document::Load"];
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = TimelineFront(client, form);
   let rec = yield front.start({ withMarkers: true, withDocLoadingEvents: true });
 
   yield new Promise(resolve => {
--- a/devtools/server/tests/browser/browser_markers-docloading-03.js
+++ b/devtools/server/tests/browser/browser_markers-docloading-03.js
@@ -4,17 +4,18 @@
 /**
  * Test that we get DOMContentLoaded and Load markers
  */
 
 const { TimelineFront } = require("devtools/server/actors/timeline");
 const MARKER_NAMES = ["document::DOMContentLoaded", "document::Load"];
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = TimelineFront(client, form);
   let rec = yield front.start({ withDocLoadingEvents: true });
 
   waitForMarkerType(front, MARKER_NAMES, () => true, e => e, "markers").then(e => {
--- a/devtools/server/tests/browser/browser_markers-gc.js
+++ b/devtools/server/tests/browser/browser_markers-gc.js
@@ -4,17 +4,18 @@
 /**
  * Test that we get "GarbageCollection" markers.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 const MARKER_NAME = "GarbageCollection";
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_force_gc.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_force_gc.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
   let rec = yield front.startRecording({ withMarkers: true });
 
--- a/devtools/server/tests/browser/browser_markers-parse-html.js
+++ b/devtools/server/tests/browser/browser_markers-parse-html.js
@@ -4,17 +4,18 @@
 /**
  * Test that we get "Parse HTML" markers.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 const MARKER_NAME = "Parse HTML";
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_innerHTML.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
   let rec = yield front.startRecording({ withMarkers: true });
 
--- a/devtools/server/tests/browser/browser_markers-styles.js
+++ b/devtools/server/tests/browser/browser_markers-styles.js
@@ -4,17 +4,18 @@
 /**
  * Test that we get "Styles" markers with correct meta.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 const MARKER_NAME = "Styles";
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
   let rec = yield front.startRecording({ withMarkers: true });
 
--- a/devtools/server/tests/browser/browser_markers-timestamp.js
+++ b/devtools/server/tests/browser/browser_markers-timestamp.js
@@ -5,17 +5,18 @@
  * Test that we get a "TimeStamp" marker.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 const { consoleMethod, PMM_loadFrameScripts } = require("devtools/shared/performance/process-communication");
 const MARKER_NAME = "TimeStamp";
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
   let rec = yield front.startRecording({ withMarkers: true });
 
--- a/devtools/server/tests/browser/browser_navigateEvents.js
+++ b/devtools/server/tests/browser/browser_navigateEvents.js
@@ -112,28 +112,28 @@ function getServerTabActor(callback) {
 
   client.addListener("tabNavigated", function (aEvent, aPacket) {
     assertEvent("tabNavigated", aPacket);
   });
 }
 
 function test() {
   // Open a test tab
-  addTab(URL1).then(function(doc) {
+  addTab(URL1).then(function(browser) {
+    let doc = browser.contentDocument;
     getServerTabActor(function (tabActor) {
       // In order to listen to internal will-navigate/navigate events
       events.on(tabActor, "will-navigate", function (data) {
         assertEvent("will-navigate", data);
       });
       events.on(tabActor, "navigate", function (data) {
         assertEvent("navigate", data);
       });
 
       // Start listening for page load events
-      let browser = gBrowser.selectedBrowser;
       browser.addEventListener("DOMContentLoaded", onDOMContentLoaded, true);
       browser.addEventListener("load", onLoad, true);
 
       // Listen for alert() call being made in navigate-first during unload
       waitForOnBeforeUnloadDialog(browser, function (btnLeave, btnStay) {
         assertEvent("unload-dialog");
         // accept to quit this page to another
         btnLeave.click();
--- a/devtools/server/tests/browser/browser_perf-allocation-data.js
+++ b/devtools/server/tests/browser/browser_perf-allocation-data.js
@@ -3,17 +3,18 @@
 
 /**
  * Test that we have allocation data coming from the front.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_allocations.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_allocations.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   let rec = yield front.startRecording({ withMarkers: true, withAllocations: true, withTicks: true });
--- a/devtools/server/tests/browser/browser_perf-profiler-01.js
+++ b/devtools/server/tests/browser/browser_perf-profiler-01.js
@@ -6,17 +6,18 @@
  * profiler module if not necessary, and doesn't deactivate it when
  * a recording is stopped.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 const { sendProfilerCommand, PMM_isProfilerActive, PMM_stopProfiler, PMM_loadFrameScripts } = require("devtools/shared/performance/process-communication");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   PMM_loadFrameScripts(gBrowser);
--- a/devtools/server/tests/browser/browser_perf-realtime-markers.js
+++ b/devtools/server/tests/browser/browser_perf-realtime-markers.js
@@ -3,17 +3,18 @@
 
 /**
  * Test functionality of real time markers.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   let lastMemoryDelta = 0;
--- a/devtools/server/tests/browser/browser_perf-recording-actor-01.js
+++ b/devtools/server/tests/browser/browser_perf-recording-actor-01.js
@@ -4,17 +4,18 @@
 /**
  * Tests the state of a recording rec from start to finish for recording,
  * completed, and rec data.
  */
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   let rec = yield front.startRecording({ withMarkers: true, withTicks: true, withMemory: true });
--- a/devtools/server/tests/browser/browser_perf-recording-actor-02.js
+++ b/devtools/server/tests/browser/browser_perf-recording-actor-02.js
@@ -6,17 +6,18 @@
  */
 
 var BUFFER_SIZE = 20000;
 var config = { bufferSize: BUFFER_SIZE };
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   yield front.setProfilerStatusInterval(10);
--- a/devtools/server/tests/browser/browser_perf-samples-01.js
+++ b/devtools/server/tests/browser/browser_perf-samples-01.js
@@ -6,17 +6,18 @@
  * normalized before passed to consumers.
  */
 
 const WAIT_TIME = 1000; // ms
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   // Perform the first recording...
--- a/devtools/server/tests/browser/browser_perf-samples-02.js
+++ b/devtools/server/tests/browser/browser_perf-samples-02.js
@@ -7,17 +7,18 @@
  * devtools/client/performance/modules/logic/tree-model.js will have to be changed.
  */
 
 const WAIT_TIME = 1000; // ms
 
 const { PerformanceFront } = require("devtools/server/actors/performance");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let browser = yield addTab(MAIN_DOMAIN + "doc_perf.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = PerformanceFront(client, form);
   yield front.connect();
 
   let rec = yield front.startRecording();
--- a/devtools/server/tests/browser/browser_storage_dynamic_windows.js
+++ b/devtools/server/tests/browser/browser_storage_dynamic_windows.js
@@ -297,17 +297,18 @@ function testRemoveIframe() {
         iframe.remove();
         break;
       }
     }
   });
 }
 
 function test() {
-  addTab(MAIN_DOMAIN + "storage-dynamic-windows.html").then(function(doc) {
+  addTab(MAIN_DOMAIN + "storage-dynamic-windows.html").then(function(browser) {
+    let doc = browser.contentDocument;
     initDebuggerServer();
 
     let createConnection = () => {
       let client = new DebuggerClient(DebuggerServer.connectPipe());
       connectDebuggerClient(client).then(form => {
         gFront = StorageFront(client, form);
         gFront.listStores().then(data => testStores(data, client));
       });
--- a/devtools/server/tests/browser/browser_storage_listings.js
+++ b/devtools/server/tests/browser/browser_storage_listings.js
@@ -631,17 +631,18 @@ var testIDBEntries = Task.async(function
   }
   if (index == Object.keys(hosts).length - 1) {
     return;
   }
   yield testObjectStores(++index, hosts, indexedDBActor);
 });
 
 function test() {
-  addTab(MAIN_DOMAIN + "storage-listings.html").then(function(doc) {
+  addTab(MAIN_DOMAIN + "storage-listings.html").then(function(browser) {
+    let doc = browser.contentDocument;
     initDebuggerServer();
 
     let createConnection = () => {
       let client = new DebuggerClient(DebuggerServer.connectPipe());
       connectDebuggerClient(client).then(form => {
         let front = StorageFront(client, form);
         front.listStores().then(data => testStores(data))
                           .then(() => finishTests(client));
--- a/devtools/server/tests/browser/browser_storage_updates.js
+++ b/devtools/server/tests/browser/browser_storage_updates.js
@@ -277,17 +277,18 @@ function storesCleared(data) {
 
 function* finishTests(client) {
   yield client.close();
   DebuggerServer.destroy();
   finish();
 }
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "storage-updates.html");
+  let browser = yield addTab(MAIN_DOMAIN + "storage-updates.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
 
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = StorageFront(client, form);
   let win = doc.defaultView.wrappedJSObject;
 
--- a/devtools/server/tests/browser/browser_stylesheets_nested-iframes.js
+++ b/devtools/server/tests/browser/browser_stylesheets_nested-iframes.js
@@ -5,17 +5,18 @@
 "use strict";
 
 // Test that StyleSheetsActor.getStyleSheets() works if an iframe does not have
 // a content document.
 
 const {StyleSheetsFront} = require("devtools/server/actors/stylesheets");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "stylesheets-nested-iframes.html");
+  let browser = yield addTab(MAIN_DOMAIN + "stylesheets-nested-iframes.html");
+  let doc = browser.contentDocument;
 
   info("Initialising the debugger server and client.");
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
 
   info("Attaching to the active tab.");
   yield client.attachTab(form.actor);
--- a/devtools/server/tests/browser/browser_timeline.js
+++ b/devtools/server/tests/browser/browser_timeline.js
@@ -8,17 +8,18 @@
 // simple use case, and that markers events are sent when operations occur.
 // Note that this test isn't concerned with which markers are actually recorded,
 // just that markers are recorded at all.
 // Trying to check marker types here may lead to intermittents, see bug 1066474.
 
 const {TimelineFront} = require("devtools/server/actors/timeline");
 
 add_task(function*() {
-  let doc = yield addTab("data:text/html;charset=utf-8,mop");
+  let browser = yield addTab("data:text/html;charset=utf-8,mop");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = TimelineFront(client, form);
 
   ok(front, "The TimelineFront was created");
 
--- a/devtools/server/tests/browser/browser_timeline_actors.js
+++ b/devtools/server/tests/browser/browser_timeline_actors.js
@@ -5,17 +5,18 @@
 "use strict";
 
 // Test that the timeline can also record data from the memory and framerate
 // actors, emitted as events in tadem with the markers.
 
 const {TimelineFront} = require("devtools/server/actors/timeline");
 
 add_task(function*() {
-  let doc = yield addTab("data:text/html;charset=utf-8,mop");
+  let browser = yield addTab("data:text/html;charset=utf-8,mop");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = TimelineFront(client, form);
 
   info("Start timeline marker recording");
   yield front.start({ withMemory: true, withTicks: true });
--- a/devtools/server/tests/browser/browser_timeline_iframes.js
+++ b/devtools/server/tests/browser/browser_timeline_iframes.js
@@ -5,17 +5,18 @@
 "use strict";
 
 // Test the timeline front receives markers events for operations that occur in
 // iframes.
 
 const {TimelineFront} = require("devtools/server/actors/timeline");
 
 add_task(function*() {
-  let doc = yield addTab(MAIN_DOMAIN + "timeline-iframe-parent.html");
+  let browser = yield addTab(MAIN_DOMAIN + "timeline-iframe-parent.html");
+  let doc = browser.contentDocument;
 
   initDebuggerServer();
   let client = new DebuggerClient(DebuggerServer.connectPipe());
   let form = yield connectDebuggerClient(client);
   let front = TimelineFront(client, form);
 
   info("Start timeline marker recording");
   yield front.start({ withMarkers: true });
--- a/devtools/server/tests/browser/head.js
+++ b/devtools/server/tests/browser/head.js
@@ -20,34 +20,37 @@ const ALT_DOMAIN = "http://sectest1.exam
 const ALT_DOMAIN_SECURED = "https://sectest1.example.org:443/" + PATH;
 
 // All tests are asynchronous.
 waitForExplicitFinish();
 
 /**
  * Add a new test tab in the browser and load the given url.
  * @param {String} url The url to be loaded in the new tab
- * @return a promise that resolves to the document when the url is loaded
+ * @return a promise that resolves to the new browser that the document
+ *         is loaded in. Note that we cannot return the document
+ *         directly, since this would be a CPOW in the e10s case,
+ *         and Promises cannot be resolved with CPOWs (see bug 1233497).
  */
 var addTab = Task.async(function* (url) {
   info("Adding a new tab with URL: '" + url + "'");
   let tab = gBrowser.selectedTab = gBrowser.addTab();
   let loaded = once(gBrowser.selectedBrowser, "load", true);
 
   content.location = url;
   yield loaded;
 
   info("URL '" + url + "' loading complete");
 
   yield new Promise(resolve => {
     let isBlank = url == "about:blank";
     waitForFocus(resolve, content, isBlank);
   });
 
-  return tab.linkedBrowser.contentWindow.document;
+  return tab.linkedBrowser;
 });
 
 function* initAnimationsFrontForUrl(url) {
   const {AnimationsFront} = require("devtools/server/actors/animation");
   const {InspectorFront} = require("devtools/server/actors/inspector");
 
   yield addTab(url);