diff options
Diffstat (limited to 'browser/base/content/test/pageActions/head.js')
-rw-r--r-- | browser/base/content/test/pageActions/head.js | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/browser/base/content/test/pageActions/head.js b/browser/base/content/test/pageActions/head.js new file mode 100644 index 0000000000..297ca00f65 --- /dev/null +++ b/browser/base/content/test/pageActions/head.js @@ -0,0 +1,147 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +const { PlacesTestUtils } = ChromeUtils.import( + "resource://testing-common/PlacesTestUtils.jsm" +); + +function promisePageActionPanelOpen(eventDict = {}) { + let dwu = window.windowUtils; + 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"); + let bounds = dwu.getBoundsWithoutFlushing( + BrowserPageActions.mainButtonNode + ); + return bounds.width > 0 && bounds.height > 0; + }) + .then(() => { + // Wait for the panel to become open, by clicking the button if necessary. + info("Waiting for main page action panel to be open"); + if (BrowserPageActions.panelNode.state == "open") { + return Promise.resolve(); + } + let shownPromise = promisePageActionPanelShown(); + EventUtils.synthesizeMouseAtCenter( + BrowserPageActions.mainButtonNode, + eventDict + ); + return shownPromise; + }) + .then(() => { + // Wait for items in the panel to become visible. + return promisePageActionViewChildrenVisible( + BrowserPageActions.mainViewNode + ); + }); +} + +async function waitForActivatedActionPanel() { + if (!BrowserPageActions.activatedActionPanelNode) { + info("Waiting for activated-action panel to be added to mainPopupSet"); + await new Promise(resolve => { + let observer = new MutationObserver(mutations => { + if (BrowserPageActions.activatedActionPanelNode) { + observer.disconnect(); + resolve(); + } + }); + let popupSet = document.getElementById("mainPopupSet"); + observer.observe(popupSet, { childList: true }); + }); + info("Activated-action panel added to mainPopupSet"); + } + if (!BrowserPageActions.activatedActionPanelNode.state == "open") { + info("Waiting for activated-action panel popupshown"); + await promisePanelShown(BrowserPageActions.activatedActionPanelNode); + info("Got activated-action panel popupshown"); + } + let panelView = BrowserPageActions.activatedActionPanelNode.querySelector( + "panelview" + ); + if (panelView) { + await BrowserTestUtils.waitForEvent( + BrowserPageActions.activatedActionPanelNode, + "ViewShown" + ); + await promisePageActionViewChildrenVisible(panelView); + } + return panelView; +} + +function promisePageActionPanelShown() { + return promisePanelShown(BrowserPageActions.panelNode); +} + +function promisePageActionPanelHidden() { + return promisePanelHidden(BrowserPageActions.panelNode); +} + +function promisePanelShown(panelIDOrNode) { + return promisePanelEvent(panelIDOrNode, "popupshown"); +} + +function promisePanelHidden(panelIDOrNode) { + return promisePanelEvent(panelIDOrNode, "popuphidden"); +} + +function promisePanelEvent(panelIDOrNode, eventType) { + return new Promise(resolve => { + 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 } + ); + }); +} + +function promisePageActionViewShown() { + info("promisePageActionViewShown waiting for ViewShown"); + return BrowserTestUtils.waitForEvent( + BrowserPageActions.panelNode, + "ViewShown" + ).then(async event => { + let panelViewNode = event.originalTarget; + await promisePageActionViewChildrenVisible(panelViewNode); + return panelViewNode; + }); +} + +function promisePageActionViewChildrenVisible(panelViewNode) { + return promiseNodeVisible(panelViewNode.firstElementChild.firstElementChild); +} + +function promiseNodeVisible(node) { + info( + `promiseNodeVisible waiting, node.id=${node.id} node.localeName=${node.localName}\n` + ); + let dwu = window.windowUtils; + return BrowserTestUtils.waitForCondition(() => { + let bounds = dwu.getBoundsWithoutFlushing(node); + if (bounds.width > 0 && bounds.height > 0) { + info( + `promiseNodeVisible OK, node.id=${node.id} node.localeName=${node.localName}\n` + ); + return true; + } + return false; + }); +} |