tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser_required.js (5052B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 /* import-globals-from ../../mochitest/role.js */
      8 /* import-globals-from ../../mochitest/states.js */
      9 loadScripts(
     10  { name: "role.js", dir: MOCHITESTS_DIR },
     11  { name: "states.js", dir: MOCHITESTS_DIR }
     12 );
     13 
     14 /**
     15 * Test required and aria-required attributes on checkboxes
     16 * and radio buttons.
     17 */
     18 addAccessibleTask(
     19  `
     20  <form>
     21    <input type="checkbox" id="checkbox" required>
     22   <br>
     23    <input type="radio" id="radio" required>
     24   <br>
     25    <input type="checkbox" id="ariaCheckbox" aria-required="true">
     26   <br>
     27    <input type="radio" id="ariaRadio" aria-required="true">
     28  </form>
     29  `,
     30  async (browser, accDoc) => {
     31    // Check initial AXRequired values are correct
     32    let radio = getNativeInterface(accDoc, "radio");
     33    is(
     34      radio.getAttributeValue("AXRequired"),
     35      1,
     36      "Correct required val for radio"
     37    );
     38 
     39    let ariaRadio = getNativeInterface(accDoc, "ariaRadio");
     40    is(
     41      ariaRadio.getAttributeValue("AXRequired"),
     42      1,
     43      "Correct required val for ariaRadio"
     44    );
     45 
     46    let checkbox = getNativeInterface(accDoc, "checkbox");
     47    is(
     48      checkbox.getAttributeValue("AXRequired"),
     49      1,
     50      "Correct required val for checkbox"
     51    );
     52 
     53    let ariaCheckbox = getNativeInterface(accDoc, "ariaCheckbox");
     54    is(
     55      ariaCheckbox.getAttributeValue("AXRequired"),
     56      1,
     57      "Correct required val for ariaCheckbox"
     58    );
     59 
     60    // Change aria-required, verify AXRequired is updated
     61    let stateChanged = waitForEvent(EVENT_STATE_CHANGE, "ariaCheckbox");
     62    await SpecialPowers.spawn(browser, [], () => {
     63      content.document
     64        .getElementById("ariaCheckbox")
     65        .setAttribute("aria-required", "false");
     66    });
     67    await stateChanged;
     68 
     69    is(
     70      ariaCheckbox.getAttributeValue("AXRequired"),
     71      0,
     72      "Correct required after false set for ariaCheckbox"
     73    );
     74 
     75    // Change aria-required, verify AXRequired is updated
     76    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "ariaCheckbox");
     77    await SpecialPowers.spawn(browser, [], () => {
     78      content.document
     79        .getElementById("ariaCheckbox")
     80        .setAttribute("aria-required", "true");
     81    });
     82    await stateChanged;
     83 
     84    is(
     85      ariaCheckbox.getAttributeValue("AXRequired"),
     86      1,
     87      "Correct required after true set for ariaCheckbox"
     88    );
     89 
     90    // Remove aria-required, verify AXRequired is updated
     91    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "ariaCheckbox");
     92    await SpecialPowers.spawn(browser, [], () => {
     93      content.document
     94        .getElementById("ariaCheckbox")
     95        .removeAttribute("aria-required");
     96    });
     97    await stateChanged;
     98 
     99    is(
    100      ariaCheckbox.getAttributeValue("AXRequired"),
    101      0,
    102      "Correct required after removal for ariaCheckbox"
    103    );
    104 
    105    // Change aria-required, verify AXRequired is updated
    106    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "ariaRadio");
    107    await SpecialPowers.spawn(browser, [], () => {
    108      content.document
    109        .getElementById("ariaRadio")
    110        .setAttribute("aria-required", "false");
    111    });
    112    await stateChanged;
    113 
    114    is(
    115      ariaRadio.getAttributeValue("AXRequired"),
    116      0,
    117      "Correct required after false set for ariaRadio"
    118    );
    119 
    120    // Change aria-required, verify AXRequired is updated
    121    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "ariaRadio");
    122    await SpecialPowers.spawn(browser, [], () => {
    123      content.document
    124        .getElementById("ariaRadio")
    125        .setAttribute("aria-required", "true");
    126    });
    127    await stateChanged;
    128 
    129    is(
    130      ariaRadio.getAttributeValue("AXRequired"),
    131      1,
    132      "Correct required after true set for ariaRadio"
    133    );
    134 
    135    // Remove aria-required, verify AXRequired is updated
    136    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "ariaRadio");
    137    await SpecialPowers.spawn(browser, [], () => {
    138      content.document
    139        .getElementById("ariaRadio")
    140        .removeAttribute("aria-required");
    141    });
    142    await stateChanged;
    143 
    144    is(
    145      ariaRadio.getAttributeValue("AXRequired"),
    146      0,
    147      "Correct required after removal for ariaRadio"
    148    );
    149 
    150    // Remove required, verify AXRequired is updated
    151    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "checkbox");
    152    await SpecialPowers.spawn(browser, [], () => {
    153      content.document.getElementById("checkbox").removeAttribute("required");
    154    });
    155    await stateChanged;
    156 
    157    is(
    158      checkbox.getAttributeValue("AXRequired"),
    159      0,
    160      "Correct required after removal for checkbox"
    161    );
    162 
    163    stateChanged = waitForEvent(EVENT_STATE_CHANGE, "radio");
    164    await SpecialPowers.spawn(browser, [], () => {
    165      content.document.getElementById("radio").removeAttribute("required");
    166    });
    167    await stateChanged;
    168 
    169    is(
    170      checkbox.getAttributeValue("AXRequired"),
    171      0,
    172      "Correct required after removal for radio"
    173    );
    174  }
    175 );