Bug 1300822 - Fix tab load event wait in devtools test helpers. r=jryans draft
authorAlexandre Poirot <poirot.alex@gmail.com>
Tue, 06 Sep 2016 07:05:32 -0700
changeset 410300 582601d29f1175ffa3eeacfbf1562d64efd41de7
parent 410066 8c9c4e816e86f903c1d820f3f29715dc070a5a4a
child 530562 f7c6228f9a3bf8e271b0a1f3cb63355c964d12be
push id28718
push userbmo:poirot.alex@gmail.com
push dateTue, 06 Sep 2016 16:51:49 +0000
reviewersjryans
bugs1300822
milestone51.0a1
Bug 1300822 - Fix tab load event wait in devtools test helpers. r=jryans MozReview-Commit-ID: 8vSSaDloJND
devtools/client/framework/test/shared-head.js
devtools/client/inspector/markup/test/browser_markup_links_05.js
devtools/client/inspector/markup/test/browser_markup_links_07.js
--- a/devtools/client/framework/test/shared-head.js
+++ b/devtools/client/framework/test/shared-head.js
@@ -108,17 +108,17 @@ registerCleanupFunction(function* cleanu
  * 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 tab object when the url is loaded
  */
 var addTab = Task.async(function* (url) {
   info("Adding a new tab with URL: " + url);
 
   let tab = gBrowser.selectedTab = gBrowser.addTab(url);
-  yield once(gBrowser.selectedBrowser, "load", true);
+  yield waitForTabLoad(gBrowser.selectedBrowser);
 
   info("Tab added and finished loading");
 
   return tab;
 });
 
 /**
  * Remove the given tab.
@@ -137,23 +137,43 @@ var removeTab = Task.async(function* (ta
 
 /**
  * Refresh the given tab.
  * @param {Object} tab The tab to be refreshed.
  * @return Promise<undefined> resolved when the tab is successfully refreshed.
  */
 var refreshTab = Task.async(function*(tab) {
   info("Refreshing tab.");
-  const finished = once(gBrowser.selectedBrowser, "load", true);
+  const finished = waitForTabLoad(gBrowser.selectedBrowser);
   gBrowser.reloadTab(gBrowser.selectedTab);
   yield finished;
   info("Tab finished refreshing.");
 });
 
 /**
+ * Wait for tab load. Ignore iframes load event.
+ * @param {Object} browser The browser element for a given tab
+ * @return Promise<undefined> resolved when the tab is successfully loaded.
+ */
+var waitForTabLoad = function (browser) {
+  return ContentTask.spawn(browser, null, function* () {
+    yield new Promise(done => {
+      let listener = function (event) {
+        // Only consider top document load to ignore iframes
+        if (event.target == content.document) {
+          removeEventListener("load", listener, true);
+          done();
+        }
+      };
+      addEventListener("load", listener, true);
+    });
+  });
+}
+
+/**
  * Simulate a key event from a <key> element.
  * @param {DOMNode} key
  */
 function synthesizeKeyFromKeyTag(key) {
   is(key && key.tagName, "key", "Successfully retrieved the <key> node");
 
   let modifiersAttr = key.getAttribute("modifiers");
 
--- a/devtools/client/inspector/markup/test/browser_markup_links_05.js
+++ b/devtools/client/inspector/markup/test/browser_markup_links_05.js
@@ -20,17 +20,17 @@ add_task(function* () {
   openContextMenuAndGetAllItems(inspector, {
     target: editor.attrElements.get("poster").querySelector(".link"),
   });
 
   info("Follow the link and wait for the new tab to open");
   let onTabOpened = once(gBrowser.tabContainer, "TabOpen");
   inspector.onFollowLink();
   let {target: tab} = yield onTabOpened;
-  yield waitForTabLoad(tab);
+  yield waitForTabLoad(tab.linkedBrowser);
 
   ok(true, "A new tab opened");
   is(tab.linkedBrowser.currentURI.spec, URL_ROOT + "doc_markup_tooltip.png",
     "The URL for the new tab is correct");
   gBrowser.removeTab(tab);
 
   info("Select a node with a IDREF attribute");
   yield selectNode("label", inspector);
@@ -62,21 +62,8 @@ add_task(function* () {
   let onFailed = inspector.once("idref-attribute-link-failed");
   inspector.onFollowLink();
   yield onFailed;
 
   ok(true, "The node selection failed");
   is(inspector.selection.nodeFront.tagName.toLowerCase(), "output",
     "The <output> node is still selected");
 });
-
-function waitForTabLoad(tab) {
-  let def = defer();
-  tab.addEventListener("load", function onLoad(e) {
-    // Skip load event for about:blank
-    if (tab.linkedBrowser.currentURI.spec === "about:blank") {
-      return;
-    }
-    tab.removeEventListener("load", onLoad);
-    def.resolve();
-  });
-  return def.promise;
-}
--- a/devtools/client/inspector/markup/test/browser_markup_links_07.js
+++ b/devtools/client/inspector/markup/test/browser_markup_links_07.js
@@ -53,29 +53,16 @@ add_task(function* () {
 
   info("Try to follow link wiith middle-click, check no new node selected");
   yield followLinkNoNewNode(linkEl, false, inspector);
 
   info("Try to follow link wiith meta/ctrl-click, check no new node selected");
   yield followLinkNoNewNode(linkEl, true, inspector);
 });
 
-function waitForTabLoad(tab) {
-  let def = defer();
-  tab.addEventListener("load", function onLoad() {
-    // Skip load event for about:blank
-    if (tab.linkedBrowser.currentURI.spec === "about:blank") {
-      return;
-    }
-    tab.removeEventListener("load", onLoad);
-    def.resolve();
-  });
-  return def.promise;
-}
-
 function performMouseDown(linkEl, metactrl) {
   let evt = linkEl.ownerDocument.createEvent("MouseEvents");
 
   let button = -1;
 
   if (metactrl) {
     info("Performing Meta/Ctrl+Left Click");
     button = 0;
@@ -90,17 +77,17 @@ function performMouseDown(linkEl, metact
 
   linkEl.dispatchEvent(evt);
 }
 
 function* followLinkWaitForTab(linkEl, isMetaClick, expectedTabURI) {
   let onTabOpened = once(gBrowser.tabContainer, "TabOpen");
   performMouseDown(linkEl, isMetaClick);
   let {target} = yield onTabOpened;
-  yield waitForTabLoad(target);
+  yield waitForTabLoad(target.linkedBrowser);
   ok(true, "A new tab opened");
   is(target.linkedBrowser.currentURI.spec, expectedTabURI,
      "The URL for the new tab is correct");
   gBrowser.removeTab(target);
 }
 
 function* followLinkWaitForNewNode(linkEl, isMetaClick, inspector) {
   let onSelection = inspector.selection.once("new-node-front");