Fix for ISelectionItemProvider::Select on focused element

The motivation behind this change is that for content like below,
Windows Narrator cannot trigger the links in the tabs.
  <div role="tablist">
    <a href="https://twitter.com" role="tab">tab1</a>
    <a href="https://wikipedia.org" role="tab">tab2</a>
    <a href="https://w3.org" role="tab">tab3</a>
  </div>
This is because for single-selection container we have the behavior
that selection follows focus.
https://www.w3.org/TR/wai-aria-practices-1.1/#kbd_selection_follows_focus
In Item Navigation, Narrator sets focus first to the tab, but upon
focus the a11y selected state is set to true. When Narrator attempts
to perform ISelectionItemProvider::Select (Enter) on the tab to
trigger the link, no action would occur because the selected state is
already set to true.

This CL fixes UIA::ISelectionItemProvider::Select() to still
perform action::kDoDefault if the element is already selected due to
focus. Previously, if an element is already selected, for any reason,
Select() would not perform any a11y action.
This CL also introduces ax::mojom::BoolAttribute::kSelectedFromFocus
and uses it to communicate between renderer process and browser
process that an element is selected due to it being focused.
This CL should not affect ISelectionItemProvider::Select()
behavior on multiselectable containers.

AX-Relnotes: Windows Narrator can now trigger default action on an
element in a single-selection container such as a tabitem.

Bug: 847971
Change-Id: I12026b37ed25b867384895eb520eba658aad6f20
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2219155
Reviewed-by: Kevin Babbitt <kbabbitt@microsoft.com>
Reviewed-by: Kinuko Yasuda <kinuko@chromium.org>
Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
Commit-Queue: Victor Fei <vicfei@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#774693}
34 files changed
tree: 09ba484f1bccfed9e83cdd696f21ce6661bc4774
  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. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. ENG_REVIEW_OWNERS
  68. LICENSE
  69. LICENSE.chromium_os
  70. OWNERS
  71. PRESUBMIT.py
  72. PRESUBMIT_test.py
  73. PRESUBMIT_test_mocks.py
  74. README.md
  75. 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.

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.