Reland "[A11yPerformance] Use AXBitset for bool attributes in AXNodeData"

This is a reland of commit f697c0257aed084a7a892c37690e5ab85f673b87.

The original change caused a 9% regression in blink_perf.accessibility
[1]. The use of std::variant and the subsequent conditional checks make
up the majority of the regression.

Instead of std::variant, this CL introduces an abstract interface,
AXBoolStore, and two implementations (AXVectorBoolStore and
AXBitsetBoolStore) to resolve the performance issues.

The new regression is now 2% (see first Pinpoint job on Patchset 13).

The conversion (from map to bitset) during serialization and
deserialization still contributes some overhead and will be addressed in
a future CL.

[1] https://buganizer.corp.google.com/issues/426648855

Original change's description:
> Save boolean attributes in AXNodeDate with an AXBitset instead of a
> vector. This is more performant and has a smaller footprint.
>
> For serialization, the bool_attributes getter in StructTraits iterates
> through the set attributes. If an attribute is set, it's added to the
> std::map that is returned for Mojo serialization.
>
> For deserialization, the Read method in StructTraits iterates over the
> BoolAttribute map, populating entries in the AXBitset in the C++
> AXNodeData object.
>
> The choice between AXBitset and the existing std::vector implementation
> is controlled with the feature flag kAccessibilityUseAXBitset and
> std::variant.
>
> Change-Id: I82774f642c5ceeda82ac0c252842361581336f24
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6526506
> Reviewed-by: Aaron Leventhal <aleventhal@chromium.org>
> Reviewed-by: Kevin Ellis <kevers@chromium.org>
> Reviewed-by: Joe Mason <joenotcharles@google.com>
> Commit-Queue: Jocelyn Tran <jocelyntran@google.com>
> Cr-Commit-Position: refs/heads/main@{#1475843}

Bug: 426648855
Change-Id: I4c849e70675ed421127e60cab59d23930082eea6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6673956
Commit-Queue: Jocelyn Tran <jocelyntran@google.com>
Reviewed-by: Kevin Ellis <kevers@chromium.org>
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Reviewed-by: Dominic Farolino <dom@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1486668}
12 files changed
tree: 77cf21a4d0666b9106ca5386ce63007555c618c3
  1. .github/
  2. agents/
  3. android_webview/
  4. apps/
  5. ash/
  6. base/
  7. build/
  8. build_overrides/
  9. buildtools/
  10. cc/
  11. chrome/
  12. chromecast/
  13. chromeos/
  14. codelabs/
  15. components/
  16. content/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia_web/
  23. gin/
  24. google_apis/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  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. .cursorignore
  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. SECURITY_OWNERS
  81. 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.