fune/browser/components/customizableui/test/browser_panel_keyboard_navigation.js
Mike de Boer 34074f18c2 Bug 1366205 - add a browser mochitest with full coverage of the new menu panel keyboard navigation feature. r=Gijs
This also fixes two issues I found whilst writing the tests:
1. Exclude hidden items from the set of navigable buttons and
2. Exclude disabled items from the set of navigable buttons whilst navigating,
because they may get disabled in the meantime (like with the edit controls).

MozReview-Commit-ID: 5WThVoTZjbV

--HG--
extra : rebase_source : e0bd85192e7b1043ecf04b7d9d3b546aadb004c9
2017-05-26 13:44:55 +02:00

140 lines
5.3 KiB
JavaScript

"use strict";
/**
* Test keyboard navigation in the app menu panel.
*/
const {PanelMultiView} = Cu.import("resource:///modules/PanelMultiView.jsm", {});
const kHelpButtonId = "appMenu-help-button";
let gHelperInstance;
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({set: [["browser.photon.structure.enabled", true]]});
gHelperInstance = new PanelMultiView(PanelUI.panel, true);
});
add_task(async function testUpDownKeys() {
let promise = promisePanelShown(window);
PanelUI.show();
await promise;
let buttons = gHelperInstance._getNavigableElements(PanelUI.mainView);
for (let button of buttons) {
if (button.disabled)
continue;
EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
Assert.equal(document.commandDispatcher.focusedElement, button,
"The correct button should be focused after navigating downward");
}
EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
Assert.equal(document.commandDispatcher.focusedElement, buttons[0],
"Pressing upwards should cycle around and select the first button again");
for (let i = buttons.length - 1; i >= 0; --i) {
let button = buttons[i];
if (button.disabled)
continue;
EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
Assert.equal(document.commandDispatcher.focusedElement, button,
"The first button should be focused after navigating upward");
}
promise = promisePanelHidden(window);
PanelUI.hide();
await promise;
});
add_task(async function testEnterKeyBehaviors() {
let promise = promisePanelShown(window);
PanelUI.show();
await promise;
let buttons = gHelperInstance._getNavigableElements(PanelUI.mainView);
// Navigate to the 'Help' button, which points to a subview.
EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
let focusedElement = document.commandDispatcher.focusedElement;
Assert.equal(focusedElement, buttons[buttons.length - 1],
"The last button should be focused after navigating upward");
promise = BrowserTestUtils.waitForEvent(PanelUI.helpView, "ViewShown");
// Make sure the Help button is in focus.
while (!focusedElement || !focusedElement.id || focusedElement.id != kHelpButtonId) {
EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
focusedElement = document.commandDispatcher.focusedElement;
}
EventUtils.synthesizeKey("VK_RETURN", { code: "Enter" });
await promise;
let helpButtons = gHelperInstance._getNavigableElements(PanelUI.helpView);
Assert.ok(helpButtons[0].classList.contains("subviewbutton-back"),
"First button in help view should be a back button");
// For posterity, check navigating the subview using up/ down arrow keys as well.
for (let i = helpButtons.length - 1; i >= 0; --i) {
let button = helpButtons[i];
if (button.disabled)
continue;
EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
focusedElement = document.commandDispatcher.focusedElement;
Assert.equal(focusedElement, button, "The first button should be focused after navigating upward");
}
// Make sure the back button is in focus again.
while (focusedElement != helpButtons[0]) {
EventUtils.synthesizeKey("KEY_ArrowDown", { code: "ArrowDown" });
focusedElement = document.commandDispatcher.focusedElement;
}
// The first button is the back button. Hittin Enter should navigate us back.
promise = BrowserTestUtils.waitForEvent(PanelUI.mainView, "ViewShown");
EventUtils.synthesizeKey("VK_RETURN", { code: "Enter" });
await promise;
// Let's test a 'normal' command button.
focusedElement = document.commandDispatcher.focusedElement;
const kFindButtonId = "appMenu-find-button";
while (!focusedElement || !focusedElement.id || focusedElement.id != kFindButtonId) {
EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
focusedElement = document.commandDispatcher.focusedElement;
}
Assert.equal(focusedElement.id, kFindButtonId, "Find button should be selected");
promise = promisePanelHidden(window);
EventUtils.synthesizeKey("VK_RETURN", { code: "Enter" });
await promise;
Assert.ok(!gFindBar.hidden, "Findbar should have opened");
gFindBar.close();
});
add_task(async function testLeftRightKeys() {
let promise = promisePanelShown(window);
PanelUI.show();
await promise;
// Navigate to the 'Help' button, which points to a subview.
let focusedElement = document.commandDispatcher.focusedElement;
while (!focusedElement || !focusedElement.id || focusedElement.id != kHelpButtonId) {
EventUtils.synthesizeKey("KEY_ArrowUp", { code: "ArrowUp" });
focusedElement = document.commandDispatcher.focusedElement;
}
Assert.equal(focusedElement.id, kHelpButtonId, "The last button should be focused after navigating upward");
// Hitting ArrowRight on a button that points to a subview should navigate us
// there.
promise = BrowserTestUtils.waitForEvent(PanelUI.helpView, "ViewShown");
EventUtils.synthesizeKey("KEY_ArrowRight", { code: "ArrowRight" });
await promise;
// Hitting ArrowLeft should navigate us back.
promise = BrowserTestUtils.waitForEvent(PanelUI.mainView, "ViewShown");
EventUtils.synthesizeKey("KEY_ArrowLeft", { code: "ArrowLeft" });
await promise;
promise = promisePanelHidden(window);
PanelUI.hide();
await promise;
});