/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; /* import-globals-from ../../../mochitest/text.js */ loadScripts({ name: "text.js", dir: MOCHITESTS_DIR }); function checkSelection(root, ranges) { const selRanges = root.selectionRanges; is(selRanges.length, ranges.length, "Correct number of selection ranges"); for (let r = 0; r < ranges.length; ++r) { const selRange = selRanges.queryElementAt(r, nsIAccessibleTextRange); testTextRange(selRange, root.id, ...ranges[r]); } } /** * Test IAccessibleTextSelectionContainer::setSelections. */ addAccessibleTask( `

abcdefg

`, async function testSetSelections(browser, docAcc) { docAcc.QueryInterface(nsIAccessibleText); await runPython(` global doc, docSel, p, link doc = getDocIa2() docSel = doc.QueryInterface(IAccessibleTextSelectionContainer) p = findIa2ByDomId(doc, "p").QueryInterface(IAccessibleText) link = findIa2ByDomId(doc, "link").QueryInterface(IAccessibleText) `); info("Selecting ab, end at link 0"); const p = findAccessibleChildByID(docAcc, "p"); let selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(p, 0, link, 0, False))) `); await selected; const link = findAccessibleChildByID(docAcc, "link"); checkSelection(docAcc, [[p, 0, link, 0]]); info("Selecting bc"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(p, 1, link, 1, False))) `); await selected; checkSelection(docAcc, [[p, 1, link, 1]]); info("Selecting ab, end before link"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(p, 0, p, 2, False))) `); await selected; checkSelection(docAcc, [[p, 0, link, 0]]); info("Selecting de"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(link, 1, p, 4, False))) `); await selected; checkSelection(docAcc, [[link, 1, p, 4]]); info("Selecting f"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(p, 4, p, 5, False))) `); await selected; checkSelection(docAcc, [[p, 4, p, 5]]); // DOM treats an end point of (img, 0) as including the image. Ensure we // used a DOM child index. await invokeContentTask(browser, [], () => { const sel = content.getSelection(); is(sel.focusNode.id, "p", "DOM selection focus node correct"); is(sel.focusOffset, 3, "DOM selection focus offset correct"); }); info("Selecting fg"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(p, 4, p, 6, False))) `); await selected; checkSelection(docAcc, [[p, 4, p, 6]]); info("Selecting g"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, p); await runPython(` docSel.setSelections(1, byref(IA2TextSelection(p, 5, p, 6, False))) `); await selected; checkSelection(docAcc, [[p, 5, p, 6]]); info("Selecting a, c"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, link); await runPython(` docSel.setSelections(2, (IA2TextSelection * 2)( IA2TextSelection(p, 0, p, 1, False), IA2TextSelection(link, 0, link, 1, False) )) `); await selected; checkSelection(docAcc, [ [p, 0, p, 1], [link, 0, link, 1], ]); info("Clearing selection"); selected = waitForEvent(EVENT_TEXT_SELECTION_CHANGED, docAcc); await runPython(` docSel.setSelections(0, byref(IA2TextSelection())) `); await selected; checkSelection(docAcc, []); } );