Bug 1434883 - Part 1 - Fix tests for the activated page action panel. r=Gijs draft
authorPaolo Amadini <paolo.mozmail@amadzone.org>
Sun, 04 Feb 2018 16:32:20 +0000
changeset 751034 f95967444ffbd2bbdc99560104845af31b71e94b
parent 751015 cac3a4e6000d7079f8cf0118a5c509b2527b3289
child 751035 529b67a54c076012fc2ee731fb2d362b25d414b4
child 751094 e3e2db9138cd73b1a602814b6e8d292b54e769ce
child 751102 cf2db394dc0157a104200f58d4b7758a5a9004af
child 751402 7302ce6eed5364c80b7dfe9409e5c9d28e030e38
push id97824
push userpaolo.mozmail@amadzone.org
push dateSun, 04 Feb 2018 20:00:56 +0000
reviewersGijs
bugs1434883
milestone60.0a1
Bug 1434883 - Part 1 - Fix tests for the activated page action panel. r=Gijs The promisePanelEvent function was unreliable because it did not raise an error if the provided panel did not exist, which caused one of the callers to ignore a missing panel silently. All the callers have now been updated based on whether they expect the panel to exist or not. MozReview-Commit-ID: AGT4rHls4OB
browser/base/content/test/urlbar/browser_page_action_menu.js
browser/base/content/test/urlbar/head.js
browser/modules/test/browser/browser_PageActions.js
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -555,20 +555,20 @@ add_task(async function sendToDevice_inU
 
     // Click it to open its panel.
     let urlbarButton = document.getElementById(
       BrowserPageActions.urlbarButtonNodeIDForActionID(action.id)
     );
     Assert.notEqual(urlbarButton, null, "The urlbar button should exist");
     Assert.ok(!urlbarButton.disabled,
               "The urlbar button should not be disabled");
-    let panelPromise =
-      promisePanelShown(BrowserPageActions._activatedActionPanelID);
     EventUtils.synthesizeMouseAtCenter(urlbarButton, {});
-    await panelPromise;
+    // The panel element for _activatedActionPanelID is created synchronously
+    // only after the associated button has been clicked.
+    await promisePanelShown(BrowserPageActions._activatedActionPanelID);
     Assert.equal(urlbarButton.getAttribute("open"), "true",
       "Button has open attribute");
 
     // The devices should be shown in the subview.
     let expectedItems = [
       {
         id: "pageAction-urlbar-sendToDevice-notReady",
         display: "none",
--- a/browser/base/content/test/urlbar/head.js
+++ b/browser/base/content/test/urlbar/head.js
@@ -261,20 +261,24 @@ function promisePanelShown(panelIDOrNode
 }
 
 function promisePanelHidden(panelIDOrNode) {
   return promisePanelEvent(panelIDOrNode, "popuphidden");
 }
 
 function promisePanelEvent(panelIDOrNode, eventType) {
   return new Promise(resolve => {
-    let panel = typeof(panelIDOrNode) != "string" ? panelIDOrNode :
-                document.getElementById(panelIDOrNode);
-    if (!panel ||
-        (eventType == "popupshown" && panel.state == "open") ||
+    let panel = panelIDOrNode;
+    if (typeof panel == "string") {
+      panel = document.getElementById(panelIDOrNode);
+      if (!panel) {
+        throw new Error(`Panel with ID "${panelIDOrNode}" does not exist.`);
+      }
+    }
+    if ((eventType == "popupshown" && panel.state == "open") ||
         (eventType == "popuphidden" && panel.state == "closed")) {
       executeSoon(resolve);
       return;
     }
     panel.addEventListener(eventType, () => {
       executeSoon(resolve);
     }, { once: true });
   });
--- a/browser/modules/test/browser/browser_PageActions.js
+++ b/browser/modules/test/browser/browser_PageActions.js
@@ -426,17 +426,17 @@ add_task(async function withSubview() {
                "onSubviewPlacedCount should be inc'ed");
   Assert.equal(onSubviewShowingCount, 2,
                "onSubviewShowingCount should be inc'ed");
   let panelViewButtonNodeUrlbar =
     document.getElementById(panelViewButtonIDUrlbar);
   Assert.notEqual(panelViewButtonNodeUrlbar, null, "panelViewButtonNodeUrlbar");
   onButtonCommandExpectedButtonID = panelViewButtonIDUrlbar;
   EventUtils.synthesizeMouseAtCenter(panelViewButtonNodeUrlbar, {});
-  await promisePanelHidden(BrowserPageActions._activatedActionPanelID);
+  assertActivatedPageActionPanelHidden();
   Assert.equal(onButtonCommandCallCount, 2,
                "onButtonCommandCallCount should be inc'ed");
 
   // Remove the action.
   action.remove();
   panelButtonNode = document.getElementById(panelButtonID);
   Assert.equal(panelButtonNode, null, "panelButtonNode");
   urlbarButtonNode = document.getElementById(urlbarButtonID);
@@ -527,31 +527,31 @@ add_task(async function withIframe() {
 
   // The activated-action panel should have opened, anchored to the action's
   // urlbar button.
   let aaPanel =
     document.getElementById(BrowserPageActions._activatedActionPanelID);
   Assert.notEqual(aaPanel, null, "activated-action panel");
   Assert.equal(aaPanel.anchorNode.id, urlbarButtonID, "aaPanel.anchorNode.id");
   EventUtils.synthesizeMouseAtCenter(urlbarButtonNode, {});
-  await promisePanelHidden(BrowserPageActions._activatedActionPanelID);
+  assertActivatedPageActionPanelHidden();
 
   // Click the action's urlbar button.
   EventUtils.synthesizeMouseAtCenter(urlbarButtonNode, {});
   await promisePanelShown(BrowserPageActions._activatedActionPanelID);
   Assert.equal(onCommandCallCount, 0, "onCommandCallCount should remain 0");
   Assert.equal(onIframeShowingCount, 2, "onIframeShowingCount should be inc'ed");
 
   // The activated-action panel should have opened, again anchored to the
   // action's urlbar button.
   aaPanel = document.getElementById(BrowserPageActions._activatedActionPanelID);
   Assert.notEqual(aaPanel, null, "aaPanel");
   Assert.equal(aaPanel.anchorNode.id, urlbarButtonID, "aaPanel.anchorNode.id");
   EventUtils.synthesizeMouseAtCenter(urlbarButtonNode, {});
-  await promisePanelHidden(BrowserPageActions._activatedActionPanelID);
+  assertActivatedPageActionPanelHidden();
 
   // Hide the action's button in the urlbar.
   action.pinnedToUrlbar = false;
   urlbarButtonNode = document.getElementById(urlbarButtonID);
   Assert.equal(urlbarButtonNode, null, "urlbarButtonNode");
 
   // Open the panel, click the action's button.
   await promisePageActionPanelOpen();
@@ -562,17 +562,17 @@ add_task(async function withIframe() {
 
   // The activated-action panel should have opened, this time anchored to the
   // main page action button in the urlbar.
   aaPanel = document.getElementById(BrowserPageActions._activatedActionPanelID);
   Assert.notEqual(aaPanel, null, "aaPanel");
   Assert.equal(aaPanel.anchorNode.id, BrowserPageActions.mainButtonNode.id,
                "aaPanel.anchorNode.id");
   EventUtils.synthesizeMouseAtCenter(BrowserPageActions.mainButtonNode, {});
-  await promisePanelHidden(BrowserPageActions._activatedActionPanelID);
+  assertActivatedPageActionPanelHidden();
 
   // Remove the action.
   action.remove();
   panelButtonNode = document.getElementById(panelButtonID);
   Assert.equal(panelButtonNode, null, "panelButtonNode");
   urlbarButtonNode = document.getElementById(urlbarButtonID);
   Assert.equal(urlbarButtonNode, null, "urlbarButtonNode");
 });
@@ -1411,16 +1411,20 @@ add_task(async function contextMenu() {
   // urlbar tests that run after this one can break if the mouse is left over
   // the area where the urlbar popup appears, which seems to happen due to the
   // above synthesized mouse events.  Move it over the urlbar.
   EventUtils.synthesizeMouseAtCenter(gURLBar, { type: "mousemove" });
   gURLBar.focus();
 });
 
 
+function assertActivatedPageActionPanelHidden() {
+  Assert.ok(!document.getElementById(BrowserPageActions._activatedActionPanelID));
+}
+
 function promisePageActionPanelOpen() {
   let dwu = window.QueryInterface(Ci.nsIInterfaceRequestor)
                   .getInterface(Ci.nsIDOMWindowUtils);
   return BrowserTestUtils.waitForCondition(() => {
     // Wait for the main page action button to become visible.  It's hidden for
     // some URIs, so depending on when this is called, it may not yet be quite
     // visible.  It's up to the caller to make sure it will be visible.
     info("Waiting for main page action button to have non-0 size");
@@ -1454,20 +1458,24 @@ function promisePanelShown(panelIDOrNode
 }
 
 function promisePanelHidden(panelIDOrNode) {
   return promisePanelEvent(panelIDOrNode, "popuphidden");
 }
 
 function promisePanelEvent(panelIDOrNode, eventType) {
   return new Promise(resolve => {
-    let panel = typeof(panelIDOrNode) != "string" ? panelIDOrNode :
-                document.getElementById(panelIDOrNode);
-    if (!panel ||
-        (eventType == "popupshown" && panel.state == "open") ||
+    let panel = panelIDOrNode;
+    if (typeof panel == "string") {
+      panel = document.getElementById(panelIDOrNode);
+      if (!panel) {
+        throw new Error(`Panel with ID "${panelIDOrNode}" does not exist.`);
+      }
+    }
+    if ((eventType == "popupshown" && panel.state == "open") ||
         (eventType == "popuphidden" && panel.state == "closed")) {
       executeSoon(resolve);
       return;
     }
     panel.addEventListener(eventType, () => {
       executeSoon(resolve);
     }, { once: true });
   });