Blame devtools/server/tests/browser/browser_accessibility_node_events.js

Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
"use strict";
Packit f0b94e
Packit f0b94e
// Checks for the AccessibleActor events
Packit f0b94e
Packit f0b94e
add_task(async function () {
Packit f0b94e
  let {client, walker, accessibility} =
Packit f0b94e
    await initAccessibilityFrontForUrl(MAIN_DOMAIN + "doc_accessibility.html");
Packit f0b94e
Packit f0b94e
  let a11yWalker = await accessibility.getWalker();
Packit f0b94e
  await accessibility.enable();
Packit f0b94e
  let rootNode = await walker.getRootNode();
Packit f0b94e
  let a11yDoc = await a11yWalker.getAccessibleFor(rootNode);
Packit f0b94e
  let buttonNode = await walker.querySelector(walker.rootNode, "#button");
Packit f0b94e
  let accessibleFront = await a11yWalker.getAccessibleFor(buttonNode);
Packit f0b94e
  let sliderNode = await walker.querySelector(walker.rootNode, "#slider");
Packit f0b94e
  let accessibleSliderFront = await a11yWalker.getAccessibleFor(sliderNode);
Packit f0b94e
  let browser = gBrowser.selectedBrowser;
Packit f0b94e
Packit f0b94e
  checkA11yFront(accessibleFront, {
Packit f0b94e
    name: "Accessible Button",
Packit f0b94e
    role: "pushbutton",
Packit f0b94e
    value: "",
Packit f0b94e
    description: "Accessibility Test",
Packit f0b94e
    help: "",
Packit f0b94e
    keyboardShortcut: "",
Packit f0b94e
    childCount: 1,
Packit f0b94e
    domNodeType: 1,
Packit f0b94e
    indexInParent: 1,
Packit f0b94e
    states: ["focusable", "selectable text", "opaque", "enabled", "sensitive"],
Packit f0b94e
    actions: [ "Press" ],
Packit f0b94e
    attributes: {
Packit f0b94e
      "margin-top": "0px",
Packit f0b94e
      display: "inline-block",
Packit f0b94e
      "text-align": "center",
Packit f0b94e
      "text-indent": "0px",
Packit f0b94e
      "margin-left": "0px",
Packit f0b94e
      tag: "button",
Packit f0b94e
      "margin-right": "0px",
Packit f0b94e
      id: "button",
Packit f0b94e
      "margin-bottom": "0px"
Packit f0b94e
    }
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  info("Name change event");
Packit f0b94e
  await emitA11yEvent(accessibleFront, "name-change",
Packit f0b94e
    (name, parent) => {
Packit f0b94e
      checkA11yFront(accessibleFront, { name: "Renamed" });
Packit f0b94e
      checkA11yFront(parent, { }, a11yDoc);
Packit f0b94e
    }, () => ContentTask.spawn(browser, null, () =>
Packit f0b94e
      content.document.getElementById("button").setAttribute(
Packit f0b94e
        "aria-label", "Renamed")));
Packit f0b94e
Packit f0b94e
  info("Description change event");
Packit f0b94e
  await emitA11yEvent(accessibleFront, "description-change",
Packit f0b94e
    () => checkA11yFront(accessibleFront, { description: "" }),
Packit f0b94e
    () => ContentTask.spawn(browser, null, () =>
Packit f0b94e
      content.document.getElementById("button").removeAttribute("aria-describedby")));
Packit f0b94e
Packit f0b94e
  info("State change event");
Packit f0b94e
  let expectedStates = ["unavailable", "selectable text", "opaque"];
Packit f0b94e
  await emitA11yEvent(accessibleFront, "states-change",
Packit f0b94e
    newStates => {
Packit f0b94e
      checkA11yFront(accessibleFront, { states: expectedStates });
Packit f0b94e
      SimpleTest.isDeeply(newStates, expectedStates, "States are updated");
Packit f0b94e
    }, () => ContentTask.spawn(browser, null, () =>
Packit f0b94e
      content.document.getElementById("button").setAttribute("disabled", true)));
Packit f0b94e
Packit f0b94e
  info("Attributes change event");
Packit f0b94e
  await emitA11yEvent(accessibleFront, "attributes-change",
Packit f0b94e
    newAttrs => {
Packit f0b94e
      checkA11yFront(accessibleFront, { attributes: {
Packit f0b94e
        "container-live": "polite",
Packit f0b94e
        display: "inline-block",
Packit f0b94e
        "event-from-input": "false",
Packit f0b94e
        "explicit-name": "true",
Packit f0b94e
        id: "button",
Packit f0b94e
        live: "polite",
Packit f0b94e
        "margin-bottom": "0px",
Packit f0b94e
        "margin-left": "0px",
Packit f0b94e
        "margin-right": "0px",
Packit f0b94e
        "margin-top": "0px",
Packit f0b94e
        tag: "button",
Packit f0b94e
        "text-align": "center",
Packit f0b94e
        "text-indent": "0px"
Packit f0b94e
      }});
Packit f0b94e
      is(newAttrs.live, "polite", "Attributes are updated");
Packit f0b94e
    }, () => ContentTask.spawn(browser, null, () =>
Packit f0b94e
      content.document.getElementById("button").setAttribute("aria-live", "polite")));
Packit f0b94e
Packit f0b94e
  info("Value change event");
Packit f0b94e
  checkA11yFront(accessibleSliderFront, { value: "5" });
Packit f0b94e
  await emitA11yEvent(accessibleSliderFront, "value-change",
Packit f0b94e
    () => checkA11yFront(accessibleSliderFront, { value: "6" }),
Packit f0b94e
    () => ContentTask.spawn(browser, null, () =>
Packit f0b94e
      content.document.getElementById("slider").setAttribute("aria-valuenow", "6")));
Packit f0b94e
Packit f0b94e
  info("Reorder event");
Packit f0b94e
  is(accessibleSliderFront.childCount, 1, "Slider has only 1 child");
Packit f0b94e
  let [firstChild, ] = await accessibleSliderFront.children();
Packit f0b94e
  is(firstChild.indexInParent, 0, "Slider's first child has correct index in parent");
Packit f0b94e
  await emitA11yEvent(accessibleSliderFront, "reorder",
Packit f0b94e
    childCount => {
Packit f0b94e
      is(childCount, 2, "Child count is updated");
Packit f0b94e
      is(accessibleSliderFront.childCount, 2, "Child count is updated");
Packit f0b94e
      is(firstChild.indexInParent, 1,
Packit f0b94e
        "Slider's first child has an updated index in parent");
Packit f0b94e
    }, () => ContentTask.spawn(browser, null, () => {
Packit f0b94e
      let doc = content.document;
Packit f0b94e
      let slider = doc.getElementById("slider");
Packit f0b94e
      let button = doc.createElement("button");
Packit f0b94e
      button.innerText = "Slider button";
Packit f0b94e
      content.document.getElementById("slider").insertBefore(button, slider.firstChild);
Packit f0b94e
    }));
Packit f0b94e
Packit f0b94e
  await emitA11yEvent(firstChild, "index-in-parent-change", indexInParent =>
Packit f0b94e
    is(indexInParent, 0, "Slider's first child has an updated index in parent"), () =>
Packit f0b94e
    ContentTask.spawn(browser, null, () =>
Packit f0b94e
      content.document.getElementById("slider").firstChild.remove()));
Packit f0b94e
Packit f0b94e
  await accessibility.disable();
Packit f0b94e
  await waitForA11yShutdown();
Packit f0b94e
  await client.close();
Packit f0b94e
  gBrowser.removeCurrentTab();
Packit f0b94e
});