mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			292 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
registerCleanupFunction(() => {
 | 
						|
  SidebarController.hide();
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper function that opens a sidebar switcher panel popup menu
 | 
						|
 * @returns Promise that resolves when the switcher panel popup is shown
 | 
						|
 *          without any action from a user/test
 | 
						|
 */
 | 
						|
function showSwitcherPanelPromise() {
 | 
						|
  return new Promise(resolve => {
 | 
						|
    SidebarController._switcherPanel.addEventListener(
 | 
						|
      "popupshown",
 | 
						|
      () => {
 | 
						|
        resolve();
 | 
						|
      },
 | 
						|
      { once: true }
 | 
						|
    );
 | 
						|
    SidebarController.showSwitcherPanel();
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper function that waits for a sidebar switcher panel's "popupshown" event
 | 
						|
 * @returns Promise which resolves when the popup menu is opened
 | 
						|
 */
 | 
						|
async function waitForSwitcherPopupShown() {
 | 
						|
  return BrowserTestUtils.waitForEvent(
 | 
						|
    SidebarController._switcherPanel,
 | 
						|
    "popupshown"
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper function that sends a mouse click to a specific menu item or a key
 | 
						|
 * event to a active menu item of the sidebar switcher menu popup. Provide a
 | 
						|
 * querySelector parameter when a click behavior is needed.
 | 
						|
 * @param {String} [querySelector=null]  An HTML attribute of the menu item
 | 
						|
 *                                       to be clicked
 | 
						|
 * @returns Promise that resolves when both the menu popup is hidden and
 | 
						|
 *          the sidebar itself is focused
 | 
						|
 */
 | 
						|
function pickSwitcherMenuitem(querySelector = null) {
 | 
						|
  let sidebarPopup = document.querySelector("#sidebarMenu-popup");
 | 
						|
  let hideSwitcherPanelPromise = Promise.all([
 | 
						|
    BrowserTestUtils.waitForEvent(window, "SidebarFocused"),
 | 
						|
    BrowserTestUtils.waitForEvent(sidebarPopup, "popuphidden"),
 | 
						|
  ]);
 | 
						|
  if (querySelector) {
 | 
						|
    document.querySelector(querySelector).click();
 | 
						|
  } else {
 | 
						|
    EventUtils.synthesizeKey("KEY_Enter", {});
 | 
						|
  }
 | 
						|
  return hideSwitcherPanelPromise;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Helper function to test a key handling of sidebar menu popup items used to
 | 
						|
 * access a specific sidebar
 | 
						|
 * @param {String} key           Event.key to open the switcher menu popup
 | 
						|
 * @param {String} sidebarTitle  Title of the sidebar that is to be activated
 | 
						|
 *                               during the test (capitalized one word versions),
 | 
						|
 *                               i.e. "History" or "Tabs"
 | 
						|
 */
 | 
						|
async function testSidebarMenuKeyToggle(key, sidebarTitle) {
 | 
						|
  info(`Testing "${key}" key handling of sidebar menu popup items
 | 
						|
  to access ${sidebarTitle} sidebar`);
 | 
						|
 | 
						|
  Assert.ok(SidebarController.isOpen, "Sidebar is open");
 | 
						|
 | 
						|
  let sidebarSwitcher = document.querySelector("#sidebar-switcher-target");
 | 
						|
  let sidebar = document.getElementById("sidebar");
 | 
						|
  let searchBox = sidebar.firstElementChild;
 | 
						|
 | 
						|
  // If focus is on the search field (i.e. on the History sidebar),
 | 
						|
  // or if the focus is on the awesomebar (bug 1835899),
 | 
						|
  // move it to the switcher target:
 | 
						|
 | 
						|
  if (searchBox && searchBox.matches(":focus")) {
 | 
						|
    EventUtils.synthesizeKey("KEY_Tab", { shiftKey: true, repeat: 2 });
 | 
						|
  } else if (!sidebarSwitcher.matches(":focus")) {
 | 
						|
    sidebarSwitcher.focus();
 | 
						|
  }
 | 
						|
 | 
						|
  Assert.equal(
 | 
						|
    document.activeElement,
 | 
						|
    sidebarSwitcher,
 | 
						|
    "The sidebar switcher target button is focused"
 | 
						|
  );
 | 
						|
  Assert.ok(
 | 
						|
    sidebarSwitcher.matches(":focus"),
 | 
						|
    "The sidebar switcher target button is focused"
 | 
						|
  );
 | 
						|
  Assert.equal(
 | 
						|
    SidebarController._switcherPanel.state,
 | 
						|
    "closed",
 | 
						|
    "Sidebar menu popup is closed"
 | 
						|
  );
 | 
						|
 | 
						|
  let promisePopupShown = waitForSwitcherPopupShown();
 | 
						|
 | 
						|
  // Activate sidebar switcher target to open its sidebar menu popup:
 | 
						|
  EventUtils.synthesizeKey(key, {});
 | 
						|
 | 
						|
  await promisePopupShown;
 | 
						|
 | 
						|
  Assert.equal(
 | 
						|
    SidebarController._switcherPanel.state,
 | 
						|
    "open",
 | 
						|
    "Sidebar menu popup is open"
 | 
						|
  );
 | 
						|
 | 
						|
  info("Testing keyboard navigation between sidebar menu popup controls");
 | 
						|
 | 
						|
  let arrowDown = async (menuitemId, msg) => {
 | 
						|
    let menuItemActive = BrowserTestUtils.waitForEvent(
 | 
						|
      SidebarController._switcherPanel,
 | 
						|
      "DOMMenuItemActive"
 | 
						|
    );
 | 
						|
    EventUtils.synthesizeKey("KEY_ArrowDown", {});
 | 
						|
    await menuItemActive;
 | 
						|
    Assert.ok(
 | 
						|
      document.getElementById(menuitemId).hasAttribute("_moz-menuactive"),
 | 
						|
      msg
 | 
						|
    );
 | 
						|
  };
 | 
						|
 | 
						|
  // Move to the first sidebar switcher option:
 | 
						|
  await arrowDown(
 | 
						|
    "sidebar-switcher-bookmarks",
 | 
						|
    "The 1st sidebar menu item (Bookmarks) is active"
 | 
						|
  );
 | 
						|
 | 
						|
  // Move to the next sidebar switcher option:
 | 
						|
  await arrowDown(
 | 
						|
    "sidebar-switcher-history",
 | 
						|
    "The 2nd sidebar menu item (History) is active"
 | 
						|
  );
 | 
						|
 | 
						|
  if (sidebarTitle === "Tabs") {
 | 
						|
    await arrowDown(
 | 
						|
      "sidebar-switcher-tabs",
 | 
						|
      "The 3rd sidebar menu item (Synced Tabs) is active"
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  // Activate the tested sidebar switcher option to open the tested sidebar:
 | 
						|
  let sidebarShown = BrowserTestUtils.waitForEvent(window, "SidebarShown");
 | 
						|
  await pickSwitcherMenuitem(/* querySelector = */ null);
 | 
						|
  await sidebarShown;
 | 
						|
 | 
						|
  info("Testing keyboard navigation when a sidebar menu popup is closed");
 | 
						|
 | 
						|
  Assert.equal(
 | 
						|
    SidebarController._switcherPanel.state,
 | 
						|
    "closed",
 | 
						|
    "Sidebar menu popup is closed"
 | 
						|
  );
 | 
						|
  // Test the sidebar panel is updated
 | 
						|
  Assert.equal(
 | 
						|
    SidebarController._box.getAttribute("sidebarcommand"),
 | 
						|
    `view${sidebarTitle}Sidebar` /* e.g. "viewHistorySidebar" */,
 | 
						|
    `${sidebarTitle} sidebar loaded`
 | 
						|
  );
 | 
						|
  Assert.equal(
 | 
						|
    SidebarController.currentID,
 | 
						|
    `view${sidebarTitle}Sidebar` /* e.g. "viewHistorySidebar" */,
 | 
						|
    `${sidebarTitle}'s current ID is updated to a target view`
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
add_task(async function markup() {
 | 
						|
  // If a sidebar is already open, close it.
 | 
						|
  if (!document.getElementById("sidebar-box").hidden) {
 | 
						|
    Assert.ok(
 | 
						|
      false,
 | 
						|
      "Unexpected sidebar found - a previous test failed to cleanup correctly"
 | 
						|
    );
 | 
						|
    SidebarController.hide();
 | 
						|
  }
 | 
						|
 | 
						|
  let sidebarPopup = document.querySelector("#sidebarMenu-popup");
 | 
						|
  let sidebarSwitcher = document.querySelector("#sidebar-switcher-target");
 | 
						|
  let sidebarTitle = document.querySelector("#sidebar-title");
 | 
						|
 | 
						|
  info("Test default markup of the sidebar switcher control");
 | 
						|
 | 
						|
  Assert.equal(
 | 
						|
    sidebarSwitcher.tagName,
 | 
						|
    "toolbarbutton",
 | 
						|
    "Sidebar switcher target control is a toolbarbutton"
 | 
						|
  );
 | 
						|
  Assert.equal(
 | 
						|
    sidebarSwitcher.children[1],
 | 
						|
    sidebarTitle,
 | 
						|
    "Sidebar switcher target control has a child label element"
 | 
						|
  );
 | 
						|
  Assert.equal(
 | 
						|
    sidebarTitle.tagName,
 | 
						|
    "label",
 | 
						|
    "Sidebar switcher target control has a label element (that is expected to provide its accessible name"
 | 
						|
  );
 | 
						|
  Assert.equal(
 | 
						|
    sidebarSwitcher.getAttribute("aria-expanded"),
 | 
						|
    "false",
 | 
						|
    "Sidebar switcher button is collapsed by default"
 | 
						|
  );
 | 
						|
 | 
						|
  info("Test dynamic changes in the markup of the sidebar switcher control");
 | 
						|
 | 
						|
  await SidebarController.show("viewBookmarksSidebar");
 | 
						|
  await showSwitcherPanelPromise();
 | 
						|
 | 
						|
  Assert.equal(
 | 
						|
    sidebarSwitcher.getAttribute("aria-expanded"),
 | 
						|
    "true",
 | 
						|
    "Sidebar switcher button is expanded when a sidebar menu is shown"
 | 
						|
  );
 | 
						|
 | 
						|
  let waitForPopupHidden = BrowserTestUtils.waitForEvent(
 | 
						|
    sidebarPopup,
 | 
						|
    "popuphidden"
 | 
						|
  );
 | 
						|
 | 
						|
  // Close on Escape anywhere
 | 
						|
  EventUtils.synthesizeKey("KEY_Escape", {});
 | 
						|
  await waitForPopupHidden;
 | 
						|
 | 
						|
  Assert.equal(
 | 
						|
    sidebarSwitcher.getAttribute("aria-expanded"),
 | 
						|
    "false",
 | 
						|
    "Sidebar switcher button is collapsed when a sidebar menu is dismissed"
 | 
						|
  );
 | 
						|
 | 
						|
  SidebarController.hide();
 | 
						|
});
 | 
						|
 | 
						|
add_task(async function keynav() {
 | 
						|
  // If a sidebar is already open, close it.
 | 
						|
  if (SidebarController.isOpen) {
 | 
						|
    Assert.ok(
 | 
						|
      false,
 | 
						|
      "Unexpected sidebar found - a previous test failed to cleanup correctly"
 | 
						|
    );
 | 
						|
    SidebarController.hide();
 | 
						|
  }
 | 
						|
 | 
						|
  await SidebarController.show("viewBookmarksSidebar");
 | 
						|
 | 
						|
  await testSidebarMenuKeyToggle("KEY_Enter", "History");
 | 
						|
  await testSidebarMenuKeyToggle(" ", "Tabs");
 | 
						|
 | 
						|
  SidebarController.hide();
 | 
						|
});
 | 
						|
 | 
						|
add_task(async function mouse() {
 | 
						|
  // If a sidebar is already open, close it.
 | 
						|
  if (!document.getElementById("sidebar-box").hidden) {
 | 
						|
    Assert.ok(
 | 
						|
      false,
 | 
						|
      "Unexpected sidebar found - a previous test failed to cleanup correctly"
 | 
						|
    );
 | 
						|
    SidebarController.hide();
 | 
						|
  }
 | 
						|
 | 
						|
  let sidebar = document.querySelector("#sidebar-box");
 | 
						|
  await SidebarController.show("viewBookmarksSidebar");
 | 
						|
 | 
						|
  await showSwitcherPanelPromise();
 | 
						|
  await pickSwitcherMenuitem("#sidebar-switcher-history");
 | 
						|
  Assert.equal(
 | 
						|
    sidebar.getAttribute("sidebarcommand"),
 | 
						|
    "viewHistorySidebar",
 | 
						|
    "History sidebar loaded"
 | 
						|
  );
 | 
						|
 | 
						|
  await showSwitcherPanelPromise();
 | 
						|
  await pickSwitcherMenuitem("#sidebar-switcher-tabs");
 | 
						|
  Assert.equal(
 | 
						|
    sidebar.getAttribute("sidebarcommand"),
 | 
						|
    "viewTabsSidebar",
 | 
						|
    "Tabs sidebar loaded"
 | 
						|
  );
 | 
						|
 | 
						|
  await showSwitcherPanelPromise();
 | 
						|
  await pickSwitcherMenuitem("#sidebar-switcher-bookmarks");
 | 
						|
  Assert.equal(
 | 
						|
    sidebar.getAttribute("sidebarcommand"),
 | 
						|
    "viewBookmarksSidebar",
 | 
						|
    "Bookmarks sidebar loaded"
 | 
						|
  );
 | 
						|
});
 |