mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-12 14:20:14 +02:00
Differential Revision: https://phabricator.services.mozilla.com/D26067 --HG-- extra : moz-landing-system : lando
133 lines
4.7 KiB
JavaScript
133 lines
4.7 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
/**
|
|
* Test the focus behavior when opening PanelViews.
|
|
*/
|
|
|
|
const {PanelMultiView} = ChromeUtils.import("resource:///modules/PanelMultiView.jsm");
|
|
|
|
let gAnchor;
|
|
let gPanel;
|
|
let gPanelMultiView;
|
|
let gMainView;
|
|
let gMainButton;
|
|
let gMainSubButton;
|
|
let gSubView;
|
|
let gSubButton;
|
|
|
|
add_task(async function setup() {
|
|
let navBar = document.getElementById("nav-bar");
|
|
gAnchor = document.createXULElement("toolbarbutton");
|
|
// Must be focusable in order for key presses to work.
|
|
gAnchor.style["-moz-user-focus"] = "normal";
|
|
navBar.appendChild(gAnchor);
|
|
let onPress = event => PanelMultiView.openPopup(gPanel, gAnchor, {
|
|
triggerEvent: event,
|
|
});
|
|
gAnchor.addEventListener("keypress", onPress);
|
|
gAnchor.addEventListener("click", onPress);
|
|
gPanel = document.createXULElement("panel");
|
|
navBar.appendChild(gPanel);
|
|
gPanelMultiView = document.createXULElement("panelmultiview");
|
|
gPanelMultiView.setAttribute("mainViewId", "testMainView");
|
|
gPanel.appendChild(gPanelMultiView);
|
|
|
|
gMainView = document.createXULElement("panelview");
|
|
gMainView.id = "testMainView";
|
|
gPanelMultiView.appendChild(gMainView);
|
|
gMainButton = document.createXULElement("button");
|
|
gMainView.appendChild(gMainButton);
|
|
gMainSubButton = document.createXULElement("button");
|
|
gMainView.appendChild(gMainSubButton);
|
|
gMainSubButton.addEventListener("command", () =>
|
|
gPanelMultiView.showSubView("testSubView", gMainSubButton));
|
|
|
|
gSubView = document.createXULElement("panelview");
|
|
gSubView.id = "testSubView";
|
|
gPanelMultiView.appendChild(gSubView);
|
|
gSubButton = document.createXULElement("button");
|
|
gSubView.appendChild(gSubButton);
|
|
|
|
registerCleanupFunction(() => {
|
|
gAnchor.remove();
|
|
gPanel.remove();
|
|
});
|
|
});
|
|
|
|
// Activate the main view by pressing a key. Focus should be moved inside.
|
|
add_task(async function testMainViewByKeypress() {
|
|
gAnchor.focus();
|
|
await gCUITestUtils.openPanelMultiView(gPanel, gMainView,
|
|
() => EventUtils.synthesizeKey(" "));
|
|
Assert.equal(document.activeElement, gMainButton,
|
|
"Focus on button in main view");
|
|
await gCUITestUtils.hidePanelMultiView(gPanel,
|
|
() => PanelMultiView.hidePopup(gPanel));
|
|
});
|
|
|
|
// Activate the main view by clicking the mouse. Focus should not be moved
|
|
// inside.
|
|
add_task(async function testMainViewByClick() {
|
|
await gCUITestUtils.openPanelMultiView(gPanel, gMainView,
|
|
() => gAnchor.click());
|
|
Assert.notEqual(document.activeElement, gMainButton,
|
|
"Focus not on button in main view");
|
|
await gCUITestUtils.hidePanelMultiView(gPanel,
|
|
() => PanelMultiView.hidePopup(gPanel));
|
|
});
|
|
|
|
// Activate the subview by pressing a key. Focus should be moved to the first
|
|
// button after the Back button.
|
|
add_task(async function testSubViewByKeypress() {
|
|
await gCUITestUtils.openPanelMultiView(gPanel, gMainView,
|
|
() => gAnchor.click());
|
|
while (document.activeElement != gMainSubButton) {
|
|
EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
|
|
}
|
|
let shown = BrowserTestUtils.waitForEvent(gSubView, "ViewShown");
|
|
EventUtils.synthesizeKey(" ");
|
|
await shown;
|
|
Assert.equal(document.activeElement, gSubButton,
|
|
"Focus on first button after Back button in subview");
|
|
await gCUITestUtils.hidePanelMultiView(gPanel,
|
|
() => PanelMultiView.hidePopup(gPanel));
|
|
});
|
|
|
|
// Activate the subview by clicking the mouse. Focus should not be moved
|
|
// inside.
|
|
add_task(async function testSubViewByClick() {
|
|
await gCUITestUtils.openPanelMultiView(gPanel, gMainView,
|
|
() => gAnchor.click());
|
|
let shown = BrowserTestUtils.waitForEvent(gSubView, "ViewShown");
|
|
gMainSubButton.click();
|
|
await shown;
|
|
let backButton = gSubView.querySelector(".subviewbutton-back");
|
|
Assert.notEqual(document.activeElement, backButton,
|
|
"Focus not on Back button in subview");
|
|
Assert.notEqual(document.activeElement, gSubButton,
|
|
"Focus not on button after Back button in subview");
|
|
await gCUITestUtils.hidePanelMultiView(gPanel,
|
|
() => PanelMultiView.hidePopup(gPanel));
|
|
});
|
|
|
|
// Test that focus is restored when going back to a previous view.
|
|
add_task(async function testBackRestoresFocus() {
|
|
await gCUITestUtils.openPanelMultiView(gPanel, gMainView,
|
|
() => gAnchor.click());
|
|
while (document.activeElement != gMainSubButton) {
|
|
EventUtils.synthesizeKey("KEY_Tab", {shiftKey: true});
|
|
}
|
|
let shown = BrowserTestUtils.waitForEvent(gSubView, "ViewShown");
|
|
EventUtils.synthesizeKey(" ");
|
|
await shown;
|
|
shown = BrowserTestUtils.waitForEvent(gMainView, "ViewShown");
|
|
EventUtils.synthesizeKey("KEY_ArrowLeft");
|
|
await shown;
|
|
Assert.equal(document.activeElement, gMainSubButton,
|
|
"Focus on sub button in main view");
|
|
await gCUITestUtils.hidePanelMultiView(gPanel,
|
|
() => PanelMultiView.hidePopup(gPanel));
|
|
});
|