Bug 1408942 - Enable browser_webconsole_multiple_windows_and_tabs.js;r=honza draft
authorJulian Descottes <jdescottes@mozilla.com>
Tue, 28 Nov 2017 22:34:17 +0100
changeset 705196 18b430763e5abe055ba1d9188fa65dafd578553b
parent 705081 f45b608e5521fc8f2ca8dcd34f393f2ce28faaf8
child 742289 52ef57c86a15477def2c2461e9bc8bf24920fd06
push id91392
push userjdescottes@mozilla.com
push dateWed, 29 Nov 2017 16:21:46 +0000
reviewershonza
bugs1408942
milestone59.0a1
Bug 1408942 - Enable browser_webconsole_multiple_windows_and_tabs.js;r=honza MozReview-Commit-ID: 5AqqgKLvN7
devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
@@ -343,17 +343,16 @@ skip-if = true #	Bug 1403448
 skip-if = true #	Bug 1404384
 # old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
 [browser_webconsole_mixedcontent.js]
 tags = mcb
 skip-if = true #	Bug 1404886
 [browser_webconsole_multiline_input.js]
 skip-if = true # Bug 1408941
 [browser_webconsole_multiple_windows_and_tabs.js]
-skip-if = true # Bug 1408942
 [browser_webconsole_netlogging_reset_filter.js]
 skip-if = true #	Bug 1405636
 [browser_webconsole_network_attach.js]
 [browser_webconsole_network_exceptions.js]
 [browser_webconsole_network_messages_expand.js]
 [browser_webconsole_network_messages_openinnet.js]
 [browser_webconsole_network_requests_from_chrome.js]
 [browser_webconsole_nodes_highlight.js]
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
@@ -5,96 +5,82 @@
 
 // Tests that the Web Console doesn't leak when multiple tabs and windows are
 // opened and then closed. See Bug 595350.
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 595350";
 
-var win1 = window, win2;
-var openTabs = [];
-var loadedTabCount = 0;
-
-function test() {
+add_task(async function () {
   requestLongerTimeout(3);
 
-  // Add two tabs in the main window.
-  addTabs(win1);
-
-  // Open a new window.
-  win2 = OpenBrowserWindow();
-  win2.addEventListener("load", onWindowLoad, true);
-}
-
-function onWindowLoad(aEvent) {
-  win2.removeEventListener(aEvent.type, onWindowLoad, true);
+  const win1 = window;
 
-  // Add two tabs in the new window.
-  addTabs(win2);
-}
+  info("Add test tabs in first window");
+  let tab1 = await addTab(TEST_URI, {window: win1});
+  let tab2 = await addTab(TEST_URI, {window: win1});
+  info("Test tabs added in first window");
 
-function addTabs(aWindow) {
-  for (let i = 0; i < 2; i++) {
-    let tab = aWindow.gBrowser.addTab(TEST_URI);
-    openTabs.push(tab);
-
-    tab.linkedBrowser.addEventListener("load", function onLoad(aEvent) {
-      tab.linkedBrowser.removeEventListener(aEvent.type, onLoad, true);
+  info("Open a second window");
+  const win2 = OpenBrowserWindow();
+  await new Promise(r => {
+    win2.addEventListener("load", r, {capture: true, once: true});
+  });
 
-      loadedTabCount++;
-      info("tabs loaded: " + loadedTabCount);
-      if (loadedTabCount >= 4) {
-        executeSoon(openConsoles);
-      }
-    }, true);
-  }
-}
+  info("Add test tabs in second window");
+  let tab3 = await addTab(TEST_URI, {window: win2});
+  let tab4 = await addTab(TEST_URI, {window: win2});
 
-function openConsoles() {
-  function open(i) {
-    let tab = openTabs[i];
-    openConsole(tab).then(function (hud) {
-      ok(hud, "HUD is open for tab " + i);
-      let window = hud.target.tab.linkedBrowser.contentWindow;
-      window.console.log("message for tab " + i);
+  info("Opening console in each test tab");
+  let tabs = [tab1, tab2, tab3, tab4];
+  for (let tab of tabs) {
+    // Open the console in tab${i}.
+    let hud = await openConsole(tab);
+    let tabWindow = hud.target.tab.linkedBrowser.contentWindow;
+    let message = "message for tab " + tabs.indexOf(tab);
 
-      if (i >= openTabs.length - 1) {
-        // Use executeSoon() to allow the promise to resolve.
-        executeSoon(closeConsoles);
-      }
-      else {
-        executeSoon(() => open(i + 1));
-      }
-    });
+    // Log a message in the newly opened console.
+    let onMessage = waitForMessage(hud, message);
+    tabWindow.console.log(message);
+    await onMessage;
   }
 
-  // open the Web Console for each of the four tabs and log a message.
-  open(0);
-}
+  let onConsolesDestroyed = waitForNEvents("web-console-destroyed", 4);
+
+  info("Close the second window");
+  win2.close();
 
-function closeConsoles() {
-  let consolesClosed = 0;
+  info("Close the test tabs in the first window");
+  win1.gBrowser.removeTab(tab1);
+  win1.gBrowser.removeTab(tab2);
+
+  info("Wait for 4 web-console-destroyed events");
+  await onConsolesDestroyed;
+
+  ok(true, "Received web-console-destroyed for each console opened");
+});
 
-  function onWebConsoleClose(aSubject, aTopic) {
-    if (aTopic == "web-console-destroyed") {
-      consolesClosed++;
-      info("consoles destroyed: " + consolesClosed);
-      if (consolesClosed == 4) {
-        // Use executeSoon() to allow all the observers to execute.
-        executeSoon(finishTest);
+/**
+ * Wait for N events helper customized to work with Services.obs.add/removeObserver.
+ */
+function waitForNEvents(expectedTopic, times) {
+  return new Promise(resolve => {
+    let count = 0;
+
+    function onEvent(subject, topic) {
+      if (topic !== expectedTopic) {
+        return;
+      }
+
+      count++;
+      info(`Received ${expectedTopic} ${count} time(s).`);
+      if (count == times) {
+        resolve();
       }
     }
-  }
 
-  Services.obs.addObserver(onWebConsoleClose, "web-console-destroyed");
-
-  registerCleanupFunction(() => {
-    Services.obs.removeObserver(onWebConsoleClose, "web-console-destroyed");
+    registerCleanupFunction(() => {
+      Services.obs.removeObserver(onEvent, expectedTopic);
+    });
+    Services.obs.addObserver(onEvent, expectedTopic);
   });
-
-  win2.close();
-
-  win1.gBrowser.removeTab(openTabs[0]);
-  win1.gBrowser.removeTab(openTabs[1]);
-
-  openTabs = win1 = win2 = null;
 }