Rationalize the behavior of SupportsFocus, Is{keybd|mouse}Focusable

This CL cleans up three functions in Element:

 - SupportsFocus: true if the element is *capable* of being focused.  An
   element supports focus if, e.g. it has a tabindex attribute, or it is
   editable, or other conditions. Note that the element might *support*
   focus while not *being focusable*, for example if the element is
   disconnected from the document.

 - IsMouseFocusable: true if the element SupportsFocus() *and* is
   currently focusable using the mouse.

 - IsKeyboardFocusable: true if the element IsMouseFocusable(), *and*
   is currently focusable using the keyboard.

Note that each method is a subset of the one above it, by
construction.

This also adds IsScrollableContainerThatShouldBeKeyboardFocusable(),
which returns true for scrollers that should be made keyboard focusable if the feature flag for that behavior is enabled.

This also adds a `DocumentLifecycle::DisallowTransitionScope` to
make sure SupportsFocus() does not update the rendering lifecycle.

Note crbug.com/1474971 and the new baselines for the
video-playback-speed-menu.html test. That focus ring was there due
to a confluence of weirdness in the media controls code, and that
will need to be tackled separately, if desired. The new behavior
might also be ok.

Note that accessibility code is using `SupportsFocus()` to mean
`IsFocusable()`, but prior to this CL, there were cases in which
`SupportsFocus()` returned false and yet `IsFocusable()` returned
true. That has been fixed in this CL everywhere except a11y code,
which still uses `SupportsFocus()`. In addition, to avoid breaking
a11y code, `SupportsFocus()` is still not calling the new
`IsScrollableContainerThatShouldBeKeyboardFocusable()` method, which
means for focusable scrollers, SupportsFocus will be `false` while
`IsFocusable()` will be true. This will be fixed in a followup
CL [2].

This patch borrows heavily from [1].

[1] https://chromium-review.googlesource.com/c/chromium/src/+/4518938
[2] https://chromium-review.googlesource.com/c/chromium/src/+/4813829

Bug: 1444450, 1474971
Change-Id: Ieeb5f0bde2cf2130c19cd15df1bf4f9c0aa21e19
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4795287
Reviewed-by: Tommy Steimel <steimel@chromium.org>
Commit-Queue: Tommy Steimel <steimel@chromium.org>
Auto-Submit: Mason Freed <masonf@chromium.org>
Reviewed-by: Di Zhang <dizhangg@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1189598}
28 files changed
tree: ac61baceebbcdce5c96754bc344312748acd03b9
  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_web/
  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. webkit/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  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. DEPS
  70. DIR_METADATA
  71. LICENSE
  72. LICENSE.chromium_os
  73. OWNERS
  74. PRESUBMIT.py
  75. PRESUBMIT_test.py
  76. PRESUBMIT_test_mocks.py
  77. README.md
  78. 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.