Fire parent-changed events when an accessible node becomes (un)ignored

If an existing node becomes ignored or unignored, we notify platform ATs
that the parent of that node has changed children, but not that the
children of that node have a changed parent. Some platforms, such as
AT-SPI2, cache parent information separately from child information and
expect notifications about parent changes to maintain an accurate cache.
Address this problem by creating a new AXEventGenerator parent-changed
event and emit it on the existing children of a newly-un(ignored) node.

It turns out that the ordering of these notifications can also matter.
If an about-to-become-focused node is in an about-to-be-reparented
subtree, we need to notify ATs about the reparenting before we notify
them about the focus change. If we do the reverse, the AT may have
stale information about where the new focus is with respect to the
accessibility tree which in turn can break AT-driven navigation. But
BrowserAccessibilityManager::OnAccessibilityEvents was firing focus
events prior to events for any other tree updates in order to ensure
screen readers will correctly process events associated with the
focused node. We should be able to address both needs by first firing
tree updates that come from the ancestors of the focused node, then
then firing a focus event if needed, and finally firing the remaining

Also add expectations for existing related content browser tests for
which AuraLinux expectations did not exist, along with fixing a bug in
the AuraLinux accessible-event recorder and adding detail for children-
changed events.

AXRelnotes: The Orca screen reader has a non-performant workaround for
the lack of parent-changed notifications, namely to not use the AT-SPI
parent caching feature. This fix will make it possible for Orca to use
AT-SPI's parent caching and improve performance.

Bug: 1047496
Change-Id: I6421543f471054c10cf6a4fa657de4d184cd6bfb
Commit-Queue: Joanmarie Diggs <>
Reviewed-by: Dominic Mazzoni <>
Cr-Commit-Position: refs/heads/master@{#814638}
50 files changed
tree: 416dc450a73c9c5e2309c92b45a32be5dcd71727
  1. .clang-format
  2. .clang-tidy
  3. .eslintrc.js
  4. .git-blame-ignore-revs
  5. .gitattributes
  6. .gitignore
  7. .gn
  8. .vpython
  9. .vpython3
  10. .yapfignore
  14. DEPS
  18. LICENSE.chromium_os
  19. OWNERS
  25. android_webview/
  26. apps/
  27. ash/
  28. base/
  29. build/
  30. build_overrides/
  31. buildtools/
  32. cc/
  33. chrome/
  34. chromecast/
  35. chromeos/
  36. cloud_print/
  37. codereview.settings
  38. components/
  39. content/
  40. courgette/
  41. crypto/
  42. dbus/
  43. device/
  44. docs/
  45. extensions/
  46. fuchsia/
  47. gin/
  48. google_apis/
  49. google_update/
  50. gpu/
  51. headless/
  52. infra/
  53. ios/
  54. ipc/
  55. jingle/
  56. media/
  57. mojo/
  58. native_client_sdk/
  59. net/
  60. pdf/
  61. ppapi/
  62. printing/
  63. remoting/
  64. rlz/
  65. sandbox/
  66. services/
  67. skia/
  68. sql/
  69. storage/
  70. styleguide/
  71. testing/
  72. third_party/
  73. tools/
  74. ui/
  75. url/
  76. weblayer/

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

Documentation in the source is rooted in docs/

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.