Commit b3214f51 authored by Morgan Rae Reschenberg's avatar Morgan Rae Reschenberg
Browse files

Bug 1752054: Map radio and checkbox menu items to MOX classes for radio...

Bug 1752054: Map radio and checkbox menu items to MOX classes for radio buttons and checkboxes r=eeejay

Differential Revision: https://phabricator.services.mozilla.com/D162170
parent 1d3a57ca
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -316,9 +316,11 @@ Class a11y::GetTypeFromRole(roles::Role aRole) {
    case roles::CHECKBUTTON:
    case roles::TOGGLE_BUTTON:
    case roles::SWITCH:
    case roles::CHECK_MENU_ITEM:
      return [mozCheckboxAccessible class];

    case roles::RADIOBUTTON:
    case roles::RADIO_MENU_ITEM:
      return [mozRadioButtonAccessible class];

    case roles::SPINBUTTON:
+4 −0
Original line number Diff line number Diff line
@@ -72,6 +72,8 @@ addAccessibleTask(
  <div id="switch" role="switch"></div>
  <div id="timer" role="timer"></div>
  <div id="tooltip" role="tooltip"></div>
  <input type="radio" role="menuitemradio" id="menuitemradio">
  <input type="checkbox" role="menuitemcheckbox" id="menuitemcheckbox">

  <!-- text entries -->
  <div id="textbox_multiline" role="textbox" aria-multiline="true"></div>
@@ -183,6 +185,8 @@ addAccessibleTask(
    testRoleAndSubRole(accDoc, "switch", "AXCheckBox", "AXSwitch");
    testRoleAndSubRole(accDoc, "timer", null, "AXApplicationTimer");
    testRoleAndSubRole(accDoc, "tooltip", "AXGroup", "AXUserInterfaceTooltip");
    testRoleAndSubRole(accDoc, "menuitemradio", "AXMenuItem", null);
    testRoleAndSubRole(accDoc, "menuitemcheckbox", "AXMenuItem", null);

    // Text boxes
    testRoleAndSubRole(accDoc, "textbox_multiline", "AXTextArea");
+81 −0
Original line number Diff line number Diff line
@@ -218,3 +218,84 @@ addAccessibleTask(
    );
  }
);

/**
 * Test input[type=checkbox] with role=menuitemcheckbox
 */
addAccessibleTask(
  `<input type="checkbox" role="menuitemcheckbox" id="vehicle"><label for="vehicle"> Bike</label>`,
  async (browser, accDoc) => {
    let checkbox = getNativeInterface(accDoc, "vehicle");
    await untilCacheIs(
      () => checkbox.getAttributeValue("AXValue"),
      0,
      "Correct initial value"
    );

    let actions = checkbox.actionNames;
    ok(actions.includes("AXPress"), "Has press action");

    let evt = waitForMacEvent("AXValueChanged", "vehicle");
    checkbox.performAction("AXPress");
    await evt;
    await untilCacheIs(
      () => checkbox.getAttributeValue("AXValue"),
      1,
      "Correct checked value"
    );

    evt = waitForMacEvent("AXValueChanged", "vehicle");
    checkbox.performAction("AXPress");
    await evt;
    await untilCacheIs(
      () => checkbox.getAttributeValue("AXValue"),
      0,
      "Correct checked value"
    );
  }
);

/**
 * Test input[type=radio] with role=menuitemradio
 */
addAccessibleTask(
  `<input type="radio" role="menuitemradio" id="huey" name="drone" value="huey" checked>
   <label for="huey">Huey</label>
   <input type="radio" role="menuitemradio" id="dewey" name="drone" value="dewey">
   <label for="dewey">Dewey</label>`,
  async (browser, accDoc) => {
    let huey = getNativeInterface(accDoc, "huey");
    await untilCacheIs(
      () => huey.getAttributeValue("AXValue"),
      1,
      "Correct initial value for huey"
    );

    let dewey = getNativeInterface(accDoc, "dewey");
    await untilCacheIs(
      () => dewey.getAttributeValue("AXValue"),
      0,
      "Correct initial value for dewey"
    );

    let actions = dewey.actionNames;
    ok(actions.includes("AXPress"), "Has press action");

    let evt = Promise.all([
      waitForMacEvent("AXValueChanged", "huey"),
      waitForMacEvent("AXValueChanged", "dewey"),
    ]);
    dewey.performAction("AXPress");
    await evt;
    await untilCacheIs(
      () => dewey.getAttributeValue("AXValue"),
      1,
      "Correct checked value for dewey"
    );
    await untilCacheIs(
      () => huey.getAttributeValue("AXValue"),
      0,
      "Correct checked value for huey"
    );
  }
);