--- a/accessible/src/generic/HyperTextAccessible.cpp
+++ b/accessible/src/generic/HyperTextAccessible.cpp
@@ -1079,18 +1079,21 @@ HyperTextAccessible::GetTextAtOffset(int
NS_OK : NS_ERROR_INVALID_ARG;
case BOUNDARY_WORD_START:
*aEndOffset = FindWordBoundary(offset, eDirNext, eStartWord);
*aStartOffset = FindWordBoundary(*aEndOffset, eDirPrevious, eStartWord);
return GetText(*aStartOffset, *aEndOffset, aText);
case BOUNDARY_WORD_END:
- *aStartOffset = FindWordBoundary(offset, eDirPrevious, eEndWord);
- *aEndOffset = FindWordBoundary(*aStartOffset, eDirNext, eEndWord);
+ // Ignore the spec and follow what WebKitGtk does because Orca expects it,
+ // i.e. return a next word at word end offset of the current word
+ // (WebKitGtk behavior) instead the current word (AKT spec).
+ *aEndOffset = FindWordBoundary(offset, eDirNext, eEndWord);
+ *aStartOffset = FindWordBoundary(*aEndOffset, eDirPrevious, eEndWord);
return GetText(*aStartOffset, *aEndOffset, aText);
case BOUNDARY_LINE_START:
case BOUNDARY_LINE_END:
case BOUNDARY_ATTRIBUTE_RANGE:
return GetTextHelper(eGetAt, aBoundaryType, aOffset,
aStartOffset, aEndOffset, aText);
--- a/accessible/tests/mochitest/text/test_multiline.html
+++ b/accessible/tests/mochitest/text/test_multiline.html
@@ -331,29 +331,19 @@
"editable", kOk, kOk, kOk,
"editablebr", kTodo, kTodo, kTodo,
"textarea", kOk, kOk, kOk);
testTextAtOffset(9, BOUNDARY_WORD_START, "two ", 9, 13, IDs);
testTextAtOffset(13, BOUNDARY_WORD_START, "words\n", 13, 19, IDs);
// BOUNDARY_WORD_END
testTextAtOffset(0, BOUNDARY_WORD_END, "oneword", 0, 7, IDs);
- testTextAtOffset(8, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
- "div", kOk, kOk, kOk,
- "divbr", kTodo, kTodo, kTodo,
- "editable", kOk, kOk, kOk,
- "editablebr", kTodo, kTodo, kTodo,
- "textarea", kOk, kOk, kOk);
- testTextAtOffset(9, BOUNDARY_WORD_END, "\n\ntwo", 7, 12,
- "div", kOk, kOk, kOk,
- "divbr", kTodo, kTodo, kTodo,
- "editable", kOk, kOk, kOk,
- "editablebr", kTodo, kTodo, kTodo,
- "textarea", kOk, kOk, kOk);
- testTextAtOffset(12, BOUNDARY_WORD_END, "\n\ntwo", 7, 12, IDs);
+ testTextAtOffset(8, BOUNDARY_WORD_END, "\n\ntwo", 7, 12, IDs);
+ testTextAtOffset(9, BOUNDARY_WORD_END, "\n\ntwo", 7, 12, IDs);
+ testTextAtOffset(12, BOUNDARY_WORD_END, " words", 12, 18, IDs);
testTextAtOffset(13, BOUNDARY_WORD_END, " words", 12, 18,
"div", kOk, kOk, kOk,
"divbr", kOk, kOk, kOk,
"editable", kOk, kOk, kOk,
"editablebr", kOk, kOk, kOk,
"textarea", kOk, kOk, kOk);
// BOUNDARY_LINE_START
--- a/accessible/tests/mochitest/text/test_singleline.html
+++ b/accessible/tests/mochitest/text/test_singleline.html
@@ -310,20 +310,20 @@
testTextAtOffset(9, BOUNDARY_WORD_START, "friend", 9, 15, IDs);
testTextAtOffset(10, BOUNDARY_WORD_START, "friend", 9, 15, IDs);
testTextAtOffset(14, BOUNDARY_WORD_START, "friend", 9, 15, IDs);
testTextAtOffset(15, BOUNDARY_WORD_START, "friend", 9, 15, IDs);
// BOUNDARY_WORD_END
testTextAtOffset(0, BOUNDARY_WORD_END, "hello", 0, 5, IDs);
testTextAtOffset(1, BOUNDARY_WORD_END, "hello", 0, 5, IDs);
- testTextAtOffset(5, BOUNDARY_WORD_END, "hello", 0, 5, IDs);
+ testTextAtOffset(5, BOUNDARY_WORD_END, " my", 5, 8, IDs);
testTextAtOffset(6, BOUNDARY_WORD_END, " my", 5, 8, IDs);
testTextAtOffset(7, BOUNDARY_WORD_END, " my", 5, 8, IDs);
- testTextAtOffset(8, BOUNDARY_WORD_END, " my", 5, 8, IDs);
+ testTextAtOffset(8, BOUNDARY_WORD_END, " friend", 8, 15, IDs);
testTextAtOffset(9, BOUNDARY_WORD_END, " friend", 8, 15, IDs);
testTextAtOffset(10, BOUNDARY_WORD_END, " friend", 8, 15, IDs);
testTextAtOffset(14, BOUNDARY_WORD_END, " friend", 8, 15, IDs);
testTextAtOffset(15, BOUNDARY_WORD_END, " friend", 8, 15, IDs);
// BOUNDARY_LINE_START
testTextAtOffset(0, BOUNDARY_LINE_START, "hello my friend", 0, 15,
"input", kOk, kOk, kOk,
--- a/accessible/tests/mochitest/text/test_whitespaces.html
+++ b/accessible/tests/mochitest/text/test_whitespaces.html
@@ -337,30 +337,31 @@
"input", kOk, kOk, kOk,
"div", kOk, kOk, kOk,
"editable", kOk, kOk, kOk,
"textarea", kTodo, kOk, kTodo);
// BOUNDARY_WORD_END
testTextAtOffset(0, BOUNDARY_WORD_END, "Brave", 0, 5, IDs);
testTextAtOffset(4, BOUNDARY_WORD_END, "Brave", 0, 5, IDs);
- testTextAtOffset(5, BOUNDARY_WORD_END, "Brave", 0, 5, IDs);
+ testTextAtOffset(5, BOUNDARY_WORD_END, " Sir", 5, 9, IDs);
testTextAtOffset(6, BOUNDARY_WORD_END, " Sir", 5, 9, IDs);
testTextAtOffset(8, BOUNDARY_WORD_END, " Sir", 5, 9, IDs);
- testTextAtOffset(9, BOUNDARY_WORD_END, " Sir", 5, 9, IDs);
+ testTextAtOffset(9, BOUNDARY_WORD_END, " Robin", 9, 16, IDs);
testTextAtOffset(10, BOUNDARY_WORD_END, " Robin", 9, 16, IDs);
testTextAtOffset(11, BOUNDARY_WORD_END, " Robin", 9, 16, IDs);
testTextAtOffset(15, BOUNDARY_WORD_END, " Robin", 9, 16, IDs);
- testTextAtOffset(16, BOUNDARY_WORD_END, " Robin", 9, 16, IDs);
+ testTextAtOffset(16, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
testTextAtOffset(17, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
testTextAtOffset(18, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
testTextAtOffset(19, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
testTextAtOffset(20, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
testTextAtOffset(21, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
- testTextAtOffset(22, BOUNDARY_WORD_END, " ran", 16, 22, IDs);
+ testTextAtOffset(22, BOUNDARY_WORD_END, " ran", 16, 22, ["input", "div", "editable"]);
+ testTextAtOffset(22, BOUNDARY_WORD_END, " ran\n", 16, 23, [ "textarea" ]);
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
</script>
</head>