summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/pageActions/head.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/pageActions/head.js')
-rw-r--r--browser/base/content/test/pageActions/head.js147
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;
+ });
+}