Fixed AXPosition's comparison operators in their handling of embedded objects and affinity

This patch needs to land before we would be able to merge BrowserAccessibilityPosition
with AXNodePosition.

Example AX tree referred to from below:
++kRootWebArea "<embedded><embedded>"
++++kParagraph1 "hello"
++++kParagraph2 "world"

1. Embedded objects:
According to the IAccessible2 Spec, a text position inside an embedded object is equivalent to an ancestor
position after the embedded object, unless the former is at its start.

A) In the middle of paragraph1.
TextPosition anchor=kParagraph1 text_offset=3 annotated_text=hel<l>o

B) Ancestor equivalent position to (A).
TextPosition anchor=kRootWebArea text_offset=1 affinity=upstream

Comparing (A) to (B) should return that they are equivalent.

The reason behind this decision is that there would always be some loss of information when
moving to an ancestor equivalent position from within an embedded object, and there had to be a default behavior
as to where that ancestor position would be placed for purposes of comparing caret positions.
If the caret position is after the embedded object character in the embedded object's parent, then
the caret is either inside or after the embedded object, and the AT needs to query the embedded object to find out a more
exact position.

Similarly, AXPosition needs to have a default way of comparing a text position with a nancestor position
in order to be able to compare caret and selection endpoints for Windows (IAccessible2) and Linux (ATK) AT clients.

2. Affinity:
Two text positions with different affinities were compared correctly.
However, in some cases, comparing a tree to a text position needs to have the same treatment.
If everything else is equivalent except affinities, then an upstream affinity should be less than
a downstream affinity.

A) Right before the second paragraph
TextPosition anchor=kRootWebArea text_offset=1 affinity=downstream

B) After the first paragraph's text (an "after text position").
TreePosition anchor=kParagraph1 child_id=0
(child_index=0 signifies "after text".)

Comparing (A) to (B) should not return that they are equal.

3. Re-enabled tests that had to be disabled in order to land
https://crrev.com/c/2665948
because of bugs in `AXPosition::CompareTo` and `AXPosition::SlowCompareTo`,
bugs that have been fixed by this patch.

4. Unexpectedly, this patch has also fixed a known bug (1039528) in one of our
Windows unittests.

R=dmazzoni@chromium.org, aleventhal@chromium.org, kschmi@microsoft.com

AX-Relnotes: n/a.
Change-Id: Ic075e18edaa97d0ece1bf795cc31a4b159d431ab
Bug: 1049261, 1039528
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2658639
Commit-Queue: Nektarios Paisios <nektar@chromium.org>
Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#852568}
8 files changed
tree: 604e32fa702d5b061a375e5d8a78d0cdf234bb09
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.