Fix pane focus accelerator handling for Help Bubbles.

Previously, HelpBubbleViews::ToggleFocusForAccessibility() was
attempting to determine where focus was and then appropriately focusing
the bubble or the element it was anchored to.

However, this was triggered on F6 (CMD+OPT+DOWN on Mac), which is a
browser-specific accelerator. The logic chain becomes:
- User presses accelerator
  - If focus is in browser, ToggleFocusForAccessibility() gets called as
    expected, which detects focus is not in bubble, so bubble is focused
  - If focus in in bubble:
    - Accelerator processing determines that bubble does not handle the
	  accelerator
	- Accelerator processing hands the accelerator off to the anchor
	  view, which implicitly focuses the anchor view
	- ToggleFocusForAccessibility() gets called, but focus is no longer
	  in the help bubble
	- The help bubble is re-focused (incorrect behavior)

We previously had a complicated workaround that did not work in all
cases (specifically when the anchor view was not in the main browser
view, but in another bubble).

This CL replaces this with actually handling the accelerator for rotate
focus in the bubble itself. Since HelpBubbleViews is not specific to
browser (it will be componentized later), we create a new delegate class
that is capable of reporting the accelerators used for focus toggle, and
explicitly registering for those with the correct handler (which calls
ToggleFocusForAccessibility() directly).

Some small changes needed to be added to

constructor argument forwarding, but those should have been there all
along.

FrameworkSpecificImplementation: :MaybeRegister() to allow for
Change-Id: I6bd0458d75ca661d5bec421ba3ab311978eb6590
Bug: 1310126, 1310124
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3550606
Reviewed-by: David Pennington <dpenning@chromium.org>
Commit-Queue: Dana Fried <dfried@chromium.org>
Cr-Commit-Position: refs/heads/main@{#986305}
8 files changed
tree: 513c7b99fe4273b3b28610ab9c3d88ffd03b79be
  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/
  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. weblayer/
  51. .clang-format
  52. .clang-tidy
  53. .eslintrc.js
  54. .git-blame-ignore-revs
  55. .gitattributes
  56. .gitignore
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. 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.