From f770fa368be73c07668fa7f2c72867d50c393c9f Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Thu, 24 Sep 2020 16:04:48 +0000 Subject: [PATCH] Bug 1661760 - Part 2: Refactor mac basic text test. r=morgan There are going to be a whole bunch of things we want to check for each text marker in a document. I think loops should be avoided as much as possible, but this lets us store a single array with everything we expect for each marker. This is going to expand in the future. Differential Revision: https://phabricator.services.mozilla.com/D90937 --- accessible/tests/browser/mac/browser.ini | 2 + .../tests/browser/mac/browser_text_basics.js | 313 ++------- .../browser/mac/browser_text_selection.js | 49 ++ .../browser/mac/doc_textmarker_test.html | 631 ++++++++++++++++++ accessible/tests/browser/mac/head.js | 14 +- 5 files changed, 754 insertions(+), 255 deletions(-) create mode 100644 accessible/tests/browser/mac/browser_text_selection.js create mode 100644 accessible/tests/browser/mac/doc_textmarker_test.html diff --git a/accessible/tests/browser/mac/browser.ini b/accessible/tests/browser/mac/browser.ini index d4d734d9dea2..d09b6b6ab796 100644 --- a/accessible/tests/browser/mac/browser.ini +++ b/accessible/tests/browser/mac/browser.ini @@ -3,6 +3,7 @@ skip-if = os != 'mac' support-files = head.js doc_aria_tabs.html + doc_textmarker_test.html !/accessible/tests/browser/shared-head.js !/accessible/tests/browser/*.jsm !/accessible/tests/mochitest/*.js @@ -34,3 +35,4 @@ skip-if = os == 'mac' && !debug #1648813 skip-if = os == 'mac' && debug # Bug 1664577 [browser_rotor.js] [browser_rootgroup.js] +[browser_text_selection.js] diff --git a/accessible/tests/browser/mac/browser_text_basics.js b/accessible/tests/browser/mac/browser_text_basics.js index fc130c5bf4ce..bde6b7c99909 100644 --- a/accessible/tests/browser/mac/browser_text_basics.js +++ b/accessible/tests/browser/mac/browser_text_basics.js @@ -4,285 +4,58 @@ "use strict"; -/* import-globals-from ../../mochitest/role.js */ -/* import-globals-from ../../mochitest/states.js */ -loadScripts( - { name: "role.js", dir: MOCHITESTS_DIR }, - { name: "states.js", dir: MOCHITESTS_DIR } -); -function stringForRange(macDoc, range) { - return macDoc.getParameterizedAttributeValue( - "AXStringForTextMarkerRange", - range - ); +function testRangeAtMarker(macDoc, marker, attribute, expected, msg) { + let range = macDoc.getParameterizedAttributeValue(attribute, marker); + is(stringForRange(macDoc, range), expected, msg); } -function testUIElementAtMarker(macDoc, marker, expectedString) { +function testUIElement(macDoc, marker, msg, expectedRole, expectedValue) { let elem = macDoc.getParameterizedAttributeValue( "AXUIElementForTextMarker", marker ); - is(elem.getAttributeValue("AXRole"), "AXStaticText"); - is(elem.getAttributeValue("AXValue"), expectedString); + is( + elem.getAttributeValue("AXRole"), + expectedRole, + `${msg}: element role matches` + ); + is(elem.getAttributeValue("AXValue"), expectedValue, `${msg}: element value`); let elemRange = macDoc.getParameterizedAttributeValue( "AXTextMarkerRangeForUIElement", elem ); - is(stringForRange(macDoc, elemRange), expectedString); + is( + stringForRange(macDoc, elemRange), + expectedValue, + `${msg}: element range matches element value` + ); } -function testWordAtMarker( - macDoc, - marker, - expectedLeft, - expectedRight, - options = {} -) { - let left = macDoc.getParameterizedAttributeValue( +function testWords(macDoc, marker, msg, expectedLeft, expectedRight) { + testRangeAtMarker( + macDoc, + marker, "AXLeftWordTextMarkerRangeForTextMarker", - marker - ); - let right = macDoc.getParameterizedAttributeValue( - "AXRightWordTextMarkerRangeForTextMarker", - marker - ); - (options.leftIs || is)( - stringForRange(macDoc, left), expectedLeft, - "Left word matches" + `${msg}: left word matches` ); - (options.rightIs || is)( - stringForRange(macDoc, right), + + testRangeAtMarker( + macDoc, + marker, + "AXRightWordTextMarkerRangeForTextMarker", expectedRight, - "Right word matches" + `${msg}: right word matches` ); } -// Read-only tests -addAccessibleTask(`

Hello World

`, async (browser, accDoc) => { - let macDoc = accDoc.nativeInterface.QueryInterface( - Ci.nsIAccessibleMacInterface - ); - - let startMarker = macDoc.getAttributeValue("AXStartTextMarker"); - let endMarker = macDoc.getAttributeValue("AXEndTextMarker"); - let range = macDoc.getParameterizedAttributeValue( - "AXTextMarkerRangeForUnorderedTextMarkers", - [startMarker, endMarker] - ); - is(stringForRange(macDoc, range), "Hello World"); - - let evt = waitForMacEvent("AXSelectedTextChanged"); - await SpecialPowers.spawn(browser, [], () => { - let p = content.document.getElementById("p"); - let r = new content.Range(); - r.setStart(p.firstChild, 1); - r.setEnd(p.firstChild, 8); - - let s = content.getSelection(); - s.addRange(r); - }); - await evt; - - range = macDoc.getAttributeValue("AXSelectedTextMarkerRange"); - is(stringForRange(macDoc, range), "ello Wo"); - - let firstWordRange = macDoc.getParameterizedAttributeValue( - "AXRightWordTextMarkerRangeForTextMarker", - startMarker - ); - is(stringForRange(macDoc, firstWordRange), "Hello"); - - evt = waitForMacEvent("AXSelectedTextChanged"); - macDoc.setAttributeValue("AXSelectedTextMarkerRange", firstWordRange); - await evt; - range = macDoc.getAttributeValue("AXSelectedTextMarkerRange"); - is(stringForRange(macDoc, range), "Hello"); -}); - -addAccessibleTask(`

hello world goodbye

`, (browser, accDoc) => { - let macDoc = accDoc.nativeInterface.QueryInterface( - Ci.nsIAccessibleMacInterface - ); - - let marker = macDoc.getAttributeValue("AXStartTextMarker"); - - function testWordAndAdvance(left, right) { - testWordAtMarker(macDoc, marker, left, right); - marker = macDoc.getParameterizedAttributeValue( - "AXNextTextMarkerForTextMarker", - marker - ); - } - - testWordAndAdvance("hello", "hello"); - testWordAndAdvance("hello", "hello"); - testWordAndAdvance("hello", "hello"); - testWordAndAdvance("hello", "hello"); - testWordAndAdvance("hello", "hello"); - testWordAndAdvance("hello", " "); - testWordAndAdvance(" ", "world"); - testWordAndAdvance("world", "world"); - testWordAndAdvance("world", "world"); - testWordAndAdvance("world", "world"); - testWordAndAdvance("world", "world"); - testWordAndAdvance("world", " "); - testWordAndAdvance(" ", "goodbye"); - testWordAndAdvance("goodbye", "goodbye"); - testWordAndAdvance("goodbye", "goodbye"); - testWordAndAdvance("goodbye", "goodbye"); - testWordAndAdvance("goodbye", "goodbye"); - testWordAndAdvance("goodbye", "goodbye"); - testWordAndAdvance("goodbye", "goodbye"); - testWordAndAdvance("goodbye", ""); - - ok(!marker, "Iterated through all markers"); - testMarkerIntegrity(accDoc); -}); - -addAccessibleTask( - `

hello world i love you goodbye

`, - (browser, accDoc) => { - let macDoc = accDoc.nativeInterface.QueryInterface( - Ci.nsIAccessibleMacInterface - ); - - let marker = macDoc.getAttributeValue("AXStartTextMarker"); - - function testWordAndAdvance(left, right, elemText) { - testWordAtMarker(macDoc, marker, left, right); - testUIElementAtMarker(macDoc, marker, elemText); - marker = macDoc.getParameterizedAttributeValue( - "AXNextTextMarkerForTextMarker", - marker - ); - } - - testWordAndAdvance("hello", "hello", "hello world "); - testWordAndAdvance("hello", "hello", "hello world "); - testWordAndAdvance("hello", "hello", "hello world "); - testWordAndAdvance("hello", "hello", "hello world "); - testWordAndAdvance("hello", "hello", "hello world "); - testWordAndAdvance("hello", " ", "hello world "); - testWordAndAdvance(" ", "world", "hello world "); - testWordAndAdvance("world", "world", "hello world "); - testWordAndAdvance("world", "world", "hello world "); - testWordAndAdvance("world", "world", "hello world "); - testWordAndAdvance("world", "world", "hello world "); - testWordAndAdvance("world", " ", "hello world "); - testWordAndAdvance(" ", "i", "i love you"); - testWordAndAdvance("i", " ", "i love you"); - testWordAndAdvance(" ", "love", "i love you"); - testWordAndAdvance("love", "love", "i love you"); - testWordAndAdvance("love", "love", "i love you"); - testWordAndAdvance("love", "love", "i love you"); - testWordAndAdvance("love", " ", "i love you"); - testWordAndAdvance(" ", "you", "i love you"); - testWordAndAdvance("you", "you", "i love you"); - testWordAndAdvance("you", "you", "i love you"); - testWordAndAdvance("you", " ", "i love you"); - testWordAndAdvance(" ", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "goodbye", " goodbye"); - testWordAndAdvance("goodbye", "", " goodbye"); - - ok(!marker, "Iterated through all markers"); - testMarkerIntegrity(accDoc); - } -); - -addAccessibleTask( - `

hello world goodbye

`, - (browser, accDoc) => { - let macDoc = accDoc.nativeInterface.QueryInterface( - Ci.nsIAccessibleMacInterface - ); - - let marker = macDoc.getAttributeValue("AXStartTextMarker"); - - function getMarkerAtIndex(index) { - return macDoc.getParameterizedAttributeValue( - "AXTextMarkerForIndex", - index - ); - } - - testUIElementAtMarker(macDoc, marker, "hello "); - - marker = getMarkerAtIndex(7); - testUIElementAtMarker(macDoc, marker, "wor"); - - let left = macDoc.getParameterizedAttributeValue( - "AXLeftWordTextMarkerRangeForTextMarker", - marker - ); - let right = macDoc.getParameterizedAttributeValue( - "AXRightWordTextMarkerRangeForTextMarker", - marker - ); - is(stringForRange(macDoc, left), "world", "Left word matches"); - is(stringForRange(macDoc, right), "world", "Right word matches"); - - marker = macDoc.getParameterizedAttributeValue( - "AXNextTextMarkerForTextMarker", - marker - ); - - left = macDoc.getParameterizedAttributeValue( - "AXLeftWordTextMarkerRangeForTextMarker", - marker - ); - right = macDoc.getParameterizedAttributeValue( - "AXRightWordTextMarkerRangeForTextMarker", - marker - ); - is(stringForRange(macDoc, left), "world", "Left word matches"); - is(stringForRange(macDoc, right), "world", "Right word matches"); - - marker = getMarkerAtIndex(14); - testUIElementAtMarker(macDoc, marker, "ld goodbye"); - - testMarkerIntegrity(accDoc); - } -); - -addAccessibleTask( - ` - `, - (browser, accDoc) => { - testMarkerIntegrity(accDoc); - } -); - -addAccessibleTask( - `
hello
world
`, - (browser, accDoc) => { - testMarkerIntegrity(accDoc); - } -); - -addAccessibleTask( - `

Lorem ipsum

`, - (browser, accDoc) => { - testMarkerIntegrity(accDoc); - } -); - -addAccessibleTask(`

hello world

`, (browser, accDoc) => { - testMarkerIntegrity(accDoc); -}); - // Tests consistency in text markers between: // 1. "Linked list" forward navagation // 2. Getting markers by index // 3. "Linked list" reverse navagation // For each iteration method check that the returned index is consistent -function testMarkerIntegrity(accDoc) { +function testMarkerIntegrity(accDoc, expectedMarkerValues) { let macDoc = accDoc.nativeInterface.QueryInterface( Ci.nsIAccessibleMacInterface ); @@ -302,6 +75,19 @@ function testMarkerIntegrity(accDoc) { `Correct index in "AXNextTextMarkerForTextMarker": ${count}` ); + testWords( + macDoc, + marker, + `At index ${count}`, + ...expectedMarkerValues[count].words + ); + testUIElement( + macDoc, + marker, + `At index ${count}`, + ...expectedMarkerValues[count].element + ); + marker = macDoc.getParameterizedAttributeValue( "AXNextTextMarkerForTextMarker", marker @@ -319,6 +105,13 @@ function testMarkerIntegrity(accDoc) { is(index, i, `Correct index in "AXTextMarkerForIndex": ${i}`); } + ok(!macDoc.getParameterizedAttributeValue( + "AXNextTextMarkerForTextMarker", + marker + ), + "Iterated through all markers" + ); + // Iterate backward with "AXPreviousTextMarkerForTextMarker" marker = macDoc.getAttributeValue("AXEndTextMarker"); while (marker) { @@ -340,3 +133,15 @@ function testMarkerIntegrity(accDoc) { is(count, 0, "Iterated backward through all text markers"); } + +addAccessibleTask("mac/doc_textmarker_test.html", async (browser, accDoc) => { + const expectedMarkerValues = await SpecialPowers.spawn( + browser, + [], + async () => { + return content.wrappedJSObject.EXPECTED; + } + ); + + testMarkerIntegrity(accDoc, expectedMarkerValues); +}); diff --git a/accessible/tests/browser/mac/browser_text_selection.js b/accessible/tests/browser/mac/browser_text_selection.js new file mode 100644 index 000000000000..6aa82b9addf4 --- /dev/null +++ b/accessible/tests/browser/mac/browser_text_selection.js @@ -0,0 +1,49 @@ +/* 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"; + +/** + * Test rotor with heading + */ +addAccessibleTask(`

Hello World

`, async (browser, accDoc) => { + let macDoc = accDoc.nativeInterface.QueryInterface( + Ci.nsIAccessibleMacInterface + ); + + let startMarker = macDoc.getAttributeValue("AXStartTextMarker"); + let endMarker = macDoc.getAttributeValue("AXEndTextMarker"); + let range = macDoc.getParameterizedAttributeValue( + "AXTextMarkerRangeForUnorderedTextMarkers", + [startMarker, endMarker] + ); + is(stringForRange(macDoc, range), "Hello World"); + + let evt = waitForMacEvent("AXSelectedTextChanged"); + await SpecialPowers.spawn(browser, [], () => { + let p = content.document.getElementById("p"); + let r = new content.Range(); + r.setStart(p.firstChild, 1); + r.setEnd(p.firstChild, 8); + + let s = content.getSelection(); + s.addRange(r); + }); + await evt; + + range = macDoc.getAttributeValue("AXSelectedTextMarkerRange"); + is(stringForRange(macDoc, range), "ello Wo"); + + let firstWordRange = macDoc.getParameterizedAttributeValue( + "AXRightWordTextMarkerRangeForTextMarker", + startMarker + ); + is(stringForRange(macDoc, firstWordRange), "Hello"); + + evt = waitForMacEvent("AXSelectedTextChanged"); + macDoc.setAttributeValue("AXSelectedTextMarkerRange", firstWordRange); + await evt; + range = macDoc.getAttributeValue("AXSelectedTextMarkerRange"); + is(stringForRange(macDoc, range), "Hello"); +}); \ No newline at end of file diff --git a/accessible/tests/browser/mac/doc_textmarker_test.html b/accessible/tests/browser/mac/doc_textmarker_test.html new file mode 100644 index 000000000000..5b6c0b806b27 --- /dev/null +++ b/accessible/tests/browser/mac/doc_textmarker_test.html @@ -0,0 +1,631 @@ + + + + + + + +

Bob Loblaw Lobs Law Bomb

+

I love all of my children equally

+

This is the best free scrapbooking class I have ever taken

+ + +

These are my awards, Mother. From Army.

+

I deceived you, mom.

+ + + \ No newline at end of file diff --git a/accessible/tests/browser/mac/head.js b/accessible/tests/browser/mac/head.js index a99ac2f401be..e052d2221b66 100644 --- a/accessible/tests/browser/mac/head.js +++ b/accessible/tests/browser/mac/head.js @@ -4,7 +4,8 @@ "use strict"; -/* exported getNativeInterface, waitForMacEventWithInfo, waitForMacEvent, NSRange, NSDictionary */ +/* exported getNativeInterface, waitForMacEventWithInfo, waitForMacEvent, + NSRange, NSDictionary, stringForRange */ // Load the shared-head file first. /* import-globals-from ../shared-head.js */ @@ -63,3 +64,14 @@ function NSDictionary(dict) { object: dict, }; } + +function stringForRange(macDoc, range) { + if (!range) { + return ""; + } + + return macDoc.getParameterizedAttributeValue( + "AXStringForTextMarkerRange", + range + ); +}