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
--- 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 });
});