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 );