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}
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.