Bug 1270115 - Rewrite browser_ConsoleStorageAPITests.js to run in e10s. r=bz
authorMichael Layzell <michael@thelayzells.com>
Tue, 03 May 2016 13:51:55 -0400
changeset 298155 2fb9523055a61f02804393dc6f479bfd0427a1a8
parent 298154 4bcefd153a9e515ddbde1961d9b26126ba689f04
child 298156 28176df6d571538bc28ec2ed88177ccd5da707ab
push id30273
push userkwierso@gmail.com
push dateFri, 20 May 2016 21:08:12 +0000
treeherdermozilla-central@c403ac05b8f4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbz
bugs1270115
milestone49.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1270115 - Rewrite browser_ConsoleStorageAPITests.js to run in e10s. r=bz
dom/tests/browser/browser.ini
dom/tests/browser/browser_ConsoleStorageAPITests.js
--- a/dom/tests/browser/browser.ini
+++ b/dom/tests/browser/browser.ini
@@ -15,17 +15,16 @@ support-files =
   test_new_window_from_content_child.html
 [browser_bug1008941_dismissGeolocationHanger.js]
 skip-if = buildapp == 'mulet'
 [browser_test__content.js]
 [browser_ConsoleAPITests.js]
 skip-if = e10s
 [browser_ConsoleAPI_originAttributes.js]
 [browser_ConsoleStorageAPITests.js]
-skip-if = e10s
 [browser_ConsoleStoragePBTest_perwindowpb.js]
 [browser_autofocus_background.js]
 skip-if= buildapp == 'mulet'
 [browser_autofocus_preference.js]
 [browser_bug1238427.js]
 [browser_bug396843.js]
 [browser_focus_steal_from_chrome.js]
 [browser_focus_steal_from_chrome_during_mousedown.js]
--- a/dom/tests/browser/browser_ConsoleStorageAPITests.js
+++ b/dom/tests/browser/browser_ConsoleStorageAPITests.js
@@ -1,103 +1,104 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
-const TEST_URI = "http://example.com/browser/dom/tests/browser/test-console-api.html";
 const TEST_URI_NAV = "http://example.com/browser/dom/tests/browser/";
 
-var ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"]
-                          .getService(Ci.nsIConsoleAPIStorage);
-
-var apiCallCount;
-
-var ConsoleObserver = {
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
-
-  init: function CO_init()
-  {
-    Services.obs.addObserver(this, "console-storage-cache-event", false);
-    apiCallCount = 0;
-  },
-
-  observe: function CO_observe(aSubject, aTopic, aData)
-  {
-    if (aTopic == "console-storage-cache-event") {
-      apiCallCount ++;
-      if (apiCallCount == 4) {
-        Services.obs.removeObserver(this, "console-storage-cache-event");
-
-        try {
-        let tab = gBrowser.selectedTab;
-        let browser = gBrowser.selectedBrowser;
-        let win = browser.contentWindow;
-        let windowID = getWindowId(win);
-        let messages = ConsoleAPIStorage.getEvents(windowID);
-        ok(messages.length >= 4, "Some messages found in the storage service");
-
-        ConsoleAPIStorage.clearEvents();
-        messages = ConsoleAPIStorage.getEvents(windowID);
-        is(messages.length, 0, "Cleared Storage");
-
-        // make sure a closed window's events are in fact removed from the
-        // storage cache
-        win.console.log("adding a new event");
-        // Close the window.
-        gBrowser.removeTab(tab, {animate: false});
-        // Ensure actual window destruction is not delayed (too long).
-        SpecialPowers.DOMWindowUtils.garbageCollect();
-        // Ensure "inner-window-destroyed" event is processed,
-        // so the storage cache is cleared.
-        executeSoon(function () {
-          // use the old windowID again to see if we have any stray cached messages
-          messages = ConsoleAPIStorage.getEvents(windowID);
-          is(messages.length, 0, "tab close is clearing the cache");
-          finish();
-        });
-        } catch (ex) {
-          dump(ex + "\n\n\n");
-          dump(ex.stack + "\n\n\n");
-          ok(false, "We got an unexpected exception");
-        }
-      }
-    }
-  }
-};
-
 function tearDown()
 {
   while (gBrowser.tabs.length > 1)
     gBrowser.removeCurrentTab();
 }
 
-function test()
+add_task(function*()
 {
   // Don't cache removed tabs, so "clear console cache on tab close" triggers.
   Services.prefs.setIntPref("browser.tabs.max_tabs_undo", 0);
   registerCleanupFunction(function() {
     Services.prefs.clearUserPref("browser.tabs.max_tabs_undo");
   });
 
   registerCleanupFunction(tearDown);
 
-  ConsoleObserver.init();
+  // Open a keepalive tab in the background to make sure we don't accidentally
+  // kill the content process
+  var keepaliveTab = gBrowser.addTab("about:blank");
 
-  waitForExplicitFinish();
-
-  var tab = gBrowser.addTab(TEST_URI);
+  // Open the main tab to run the test in
+  var tab = gBrowser.addTab("about:blank");
   gBrowser.selectedTab = tab;
   var browser = gBrowser.selectedBrowser;
+
+  let observerPromise = ContentTask.spawn(browser, null, function(opt) {
+    const TEST_URI = "http://example.com/browser/dom/tests/browser/test-console-api.html";
+    let ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"]
+          .getService(Ci.nsIConsoleAPIStorage);
+
+    return new Promise(resolve => {
+      let apiCallCount = 0;
+      let ConsoleObserver = {
+        QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
+
+        observe: function(aSubject, aTopic, aData) {
+          if (aTopic == "console-storage-cache-event") {
+            apiCallCount++;
+            if (apiCallCount == 4) {
+              let windowId = content.window.QueryInterface(Ci.nsIInterfaceRequestor)
+                    .getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
+
+              Services.obs.removeObserver(this, "console-storage-cache-event");
+              Assert.ok(ConsoleAPIStorage.getEvents(windowId).length >= 4, "Some messages found in the storage service");
+              ConsoleAPIStorage.clearEvents();
+              Assert.equal(ConsoleAPIStorage.getEvents(windowId).length, 0, "Cleared Storage");
+
+              resolve(windowId);
+            }
+          }
+        }
+      };
+
+      Services.obs.addObserver(ConsoleObserver, "console-storage-cache-event", false);
+
+      // Redirect the browser to the test URI
+      content.window.location = TEST_URI;
+    });
+  });
+
+  let win;
   browser.addEventListener("DOMContentLoaded", function onLoad(event) {
     browser.removeEventListener("DOMContentLoaded", onLoad, false);
     executeSoon(function test_executeSoon() {
-      let win = browser.contentWindow;
+      win = browser.contentWindow;
       win.console.log("this", "is", "a", "log message");
       win.console.info("this", "is", "a", "info message");
       win.console.warn("this", "is", "a", "warn message");
       win.console.error("this", "is", "a", "error message");
     });
   }, false);
-}
+
+  let windowId = yield observerPromise;
+  // make sure a closed window's events are in fact removed from
+  // the storage cache
+  win.console.log("adding a new event");
+
+  // Close the window.
+  gBrowser.removeTab(tab, {animate: false});
+  // Ensure actual window destruction is not delayed (too long).
+  SpecialPowers.DOMWindowUtils.garbageCollect();
 
-function getWindowId(aWindow)
-{
-  return SpecialPowers.getDOMWindowUtils(aWindow).currentInnerWindowID;
-}
+  // Spawn the check in the keepaliveTab, so that we can read the ConsoleAPIStorage correctly
+  gBrowser.selectedTab = keepaliveTab;
+  browser = gBrowser.selectedBrowser;
+
+  // Ensure the "inner-window-destroyed" event is processed,
+  // so the storage cache is cleared. We do this in the content
+  // process because that is where the event will be processed.
+  yield ContentTask.spawn(browser, null, function() {
+    yield new Promise(resolve => setTimeout(resolve, 0));
+  });
+
+  yield ContentTask.spawn(browser, windowId, function(windowId) {
+    var ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"]
+          .getService(Ci.nsIConsoleAPIStorage);
+    Assert.equal(ConsoleAPIStorage.getEvents(windowId).length, 0, "tab close is clearing the cache");
+  });
+});