[a11y] Repairs aria owns relations on children changed

This change fixes a bug where an element, when
receiving focus, would lose its aria owned nodes,
if it also has a pseudo element text.

Long explanation:
When the button receives focus, before sending the
focus event, blink engine recomputes the style of
the pseudo element text, which causes its parent
(the button), to delete its subtree. Thus:
- The button's subtree is removed; (layout not
  clean)
- The aria-owned element is cleared, and the
  relations are also cleared in the relations
  cache; (layout not clean)
- A children changed tree update is scheduled, to
  be executed when the lifecycle advances to
  process deferred events; (layout not clean)
  Layout clean operations:
- The button updates its cached values, as a
  result of processing the deferred update above;
- The button must update its children, so they get
  cleared;
- The button re-adds its children, and the
  aria-owned element is not added because it was
  not added to the cache.

This change forces a recomputation of aria owns
cache relations after a children changed tree
update during clean layout, to make sure that the
button will re-add children that are aria owned.

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