[A11y] Don't do any work when AXTreeCombiner combines only 1 tree

* tl;dr
This is a workaround in order to fix AXAssistantStructure, which
currently produces incorrect results for contenteditable values when AXTreeCombiner renumbers the nodes. It is also needed to unblock "stable ids" and per-tab auto disable accessibility.

* Description of bug
The value of a contenteditable node is the combined text of all
descendants, with newlines added for readability. AXAssistantStructure
currently produces incorrect results, because AXTreeCombiner renumbers
the tree, and when AXPosition looks up nodes by number, it gets the
wrong nodes.

The bug can already be seen in current results for the test
org.chromium.content.browser.accessibility.WebContentsAccessibilityTreeTest#test_ariaTextboxWithAriaTextboxChild. The current test expectations
are incorrect. If you look at the expected output file
(content/test/data/accessibility/aria/aria-textbox-with-aria-textbox-child-expected-android-assist-data.txt), the parent node should
have the same text property value as the child, "Baz".
Unfortunately, it uses another child "Bar" in its place (and the "Bar"
parent ends up using "Baz"). IOW, the parents have swapped children
for purposes of the contenteditable value computation.

* Cause of bug
The cause of this is that when AXPosition, which is used to aggregate
the descendant text, stores a node it uses an AXTreeID/AXNodeID pair.
However, in order to turn this into an AXNode, the AXTreeManagerMap is
used, but the AXTreeID being used is still points to the original tree
that was not renumbered.

* Workaround
This CL provides a workaround but does not fix the root problem.
The workaround is to fix the majority of cases (and those used in
tests), by having AXTreeCombiner be a noop in cases where there is
only one tree. Unfortunately, this means the bug would still exist
in a page with iframes.

* Long term fix
The long term way to fix this is to make AXPosition store weak pointers
to AXNodes, rather than AXTreeID/AXNodeID pairs. It also has
performance benefits. That has been
landed and reverted several times, because of issues with
text interfaces in UIA. See CL:5300830 for more information.

* Other possibilities
Another fix is to consider whether contenteditable values need to
aggregate the value of their descendants for use with snapshots or
AXTreeCombiner. Consumers of these APIs are unlikely to need the
text to be repeated, and in fact it would be a potential performance
fix as well.

Bug: none
Change-Id: Ia90e4e0a2b29f64c7fabbd6063e16e5c08e69245
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5301248
Reviewed-by: Mark Schillaci <mschillaci@google.com>
Commit-Queue: Aaron Leventhal <aleventhal@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1262735}
3 files changed
tree: 26b33ba810ba7704cf6c619af994aedaf7a0f669
  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. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitallowed
  57. .gitattributes
  58. .gitignore
  59. .gitmodules
  60. .gn
  61. .mailmap
  62. .rustfmt.toml
  63. .vpython3
  64. .yapfignore
  65. ATL_OWNERS
  66. AUTHORS
  67. BUILD.gn
  68. CODE_OF_CONDUCT.md
  69. codereview.settings
  70. DEPS
  71. DIR_METADATA
  72. LICENSE
  73. LICENSE.chromium_os
  74. OWNERS
  75. PRESUBMIT.py
  76. PRESUBMIT_test.py
  77. PRESUBMIT_test_mocks.py
  78. README.md
  79. 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.

If you found a bug, please file it at https://crbug.com/new.