tor-browser

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

browser_textSelectionContainer.js (4228B)


      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/text.js */
      8 
      9 loadScripts({ name: "text.js", dir: MOCHITESTS_DIR });
     10 
     11 function checkSelection(root, ranges) {
     12  const selRanges = root.selectionRanges;
     13  is(selRanges.length, ranges.length, "Correct number of selection ranges");
     14  for (let r = 0; r < ranges.length; ++r) {
     15    const selRange = selRanges.queryElementAt(r, nsIAccessibleTextRange);
     16    testTextRange(selRange, root.id, ...ranges[r]);
     17  }
     18 }
     19 
     20 /**
     21 * Test IAccessibleTextSelectionContainer::setSelections.
     22 */
     23 addAccessibleTask(
     24  `<p id="p">ab<a id="link" href="/">cd</a>ef<img id="img" src="https://example.com/a11y/accessible/tests/mochitest/moz.png" alt="g"></p>`,
     25  async function testSetSelections(browser, docAcc) {
     26    docAcc.QueryInterface(nsIAccessibleText);
     27    await runPython(`
     28      global doc, docSel, p, link
     29      doc = getDocIa2()
     30      docSel = doc.QueryInterface(IAccessibleTextSelectionContainer)
     31      p = findIa2ByDomId(doc, "p").QueryInterface(IAccessibleText)
     32      link = findIa2ByDomId(doc, "link").QueryInterface(IAccessibleText)
     33    `);
     34 
     35    info("Selecting ab, end at link 0");
     36    const p = findAccessibleChildByID(docAcc, "p");
     37    let selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     38    await runPython(`
     39      docSel.setSelections(1, byref(IA2TextSelection(p, 0, link, 0, False)))
     40    `);
     41    await selected;
     42    const link = findAccessibleChildByID(docAcc, "link");
     43    checkSelection(docAcc, [[p, 0, link, 0]]);
     44 
     45    info("Selecting bc");
     46    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     47    await runPython(`
     48      docSel.setSelections(1, byref(IA2TextSelection(p, 1, link, 1, False)))
     49    `);
     50    await selected;
     51    checkSelection(docAcc, [[p, 1, link, 1]]);
     52 
     53    info("Selecting ab, end before link");
     54    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     55    await runPython(`
     56      docSel.setSelections(1, byref(IA2TextSelection(p, 0, p, 2, False)))
     57    `);
     58    await selected;
     59    checkSelection(docAcc, [[p, 0, link, 0]]);
     60 
     61    info("Selecting de");
     62    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     63    await runPython(`
     64      docSel.setSelections(1, byref(IA2TextSelection(link, 1, p, 4, False)))
     65    `);
     66    await selected;
     67    checkSelection(docAcc, [[link, 1, p, 4]]);
     68 
     69    info("Selecting f");
     70    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     71    await runPython(`
     72      docSel.setSelections(1, byref(IA2TextSelection(p, 4, p, 5, False)))
     73    `);
     74    await selected;
     75    checkSelection(docAcc, [[p, 4, p, 5]]);
     76    // DOM treats an end point of (img, 0) as including the image. Ensure we
     77    // used a DOM child index.
     78    await invokeContentTask(browser, [], () => {
     79      const sel = content.getSelection();
     80      is(sel.focusNode.id, "p", "DOM selection focus node correct");
     81      is(sel.focusOffset, 3, "DOM selection focus offset correct");
     82    });
     83 
     84    info("Selecting fg");
     85    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     86    await runPython(`
     87      docSel.setSelections(1, byref(IA2TextSelection(p, 4, p, 6, False)))
     88    `);
     89    await selected;
     90    checkSelection(docAcc, [[p, 4, p, 6]]);
     91 
     92    info("Selecting g");
     93    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p);
     94    await runPython(`
     95      docSel.setSelections(1, byref(IA2TextSelection(p, 5, p, 6, False)))
     96    `);
     97    await selected;
     98    checkSelection(docAcc, [[p, 5, p, 6]]);
     99 
    100    info("Selecting a, c");
    101    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, link);
    102    await runPython(`
    103      docSel.setSelections(2, (IA2TextSelection * 2)(
    104        IA2TextSelection(p, 0, p, 1, False),
    105        IA2TextSelection(link, 0, link, 1, False)
    106      ))
    107    `);
    108    await selected;
    109    checkSelection(docAcc, [
    110      [p, 0, p, 1],
    111      [link, 0, link, 1],
    112    ]);
    113 
    114    info("Clearing selection");
    115    selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, docAcc);
    116    await runPython(`
    117      docSel.setSelections(0, byref(IA2TextSelection()))
    118    `);
    119    await selected;
    120    checkSelection(docAcc, []);
    121  }
    122 );