forked from mirrors/gecko-dev
		
	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
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
});
 |