Bug 1690225 - Remove focus-visible feature flag. r=edgar

This shipped in 85, we can remove the feature flag now. Keep
:-moz-focusring as an alias to :focus-visible at parse time.

Differential Revision: https://phabricator.services.mozilla.com/D103752
This commit is contained in:
Emilio Cobos Álvarez 2021-02-02 23:45:25 +00:00
Родитель 4e494b48f7
Коммит 217ddbe75f
15 изменённых файлов: 25 добавлений и 71 удалений

Просмотреть файл

@ -1160,6 +1160,10 @@ nsFocusManager::BlurredElementInfo::~BlurredElementInfo() = default;
static bool ShouldMatchFocusVisible( static bool ShouldMatchFocusVisible(
const Element& aElement, int32_t aFocusFlags, const Element& aElement, int32_t aFocusFlags,
const Maybe<nsFocusManager::BlurredElementInfo>& aBlurredElementInfo) { const Maybe<nsFocusManager::BlurredElementInfo>& aBlurredElementInfo) {
// If we were explicitly requested to show the ring, do it.
if (aFocusFlags & nsIFocusManager::FLAG_SHOWRING) {
return true;
}
// Any element which supports keyboard input (such as an input element, or any // Any element which supports keyboard input (such as an input element, or any
// other element which may trigger a virtual keyboard to be shown on focus if // other element which may trigger a virtual keyboard to be shown on focus if
// a physical keyboard is not present) should always match :focus-visible when // a physical keyboard is not present) should always match :focus-visible when
@ -1213,31 +1217,6 @@ static bool ShouldMatchFocusVisible(
return false; return false;
} }
static bool ShouldFocusRingBeVisible(
Element& aElement, int32_t aFlags,
const Maybe<nsFocusManager::BlurredElementInfo>& aBlurredElementInfo) {
if (aFlags & nsIFocusManager::FLAG_SHOWRING) {
return true;
}
const bool focusVisibleEnabled =
StaticPrefs::layout_css_focus_visible_enabled();
#if defined(XP_MACOSX) || defined(ANDROID)
if (!focusVisibleEnabled) {
// Preserve historical behavior if the focus visible pseudo-class is not
// enabled.
if (aFlags & nsIFocusManager::FLAG_BYMOUSE) {
return !nsContentUtils::ContentIsLink(&aElement) &&
!aElement.IsAnyOfHTMLElements(nsGkAtoms::video, nsGkAtoms::audio);
}
return true;
}
#endif
return focusVisibleEnabled &&
ShouldMatchFocusVisible(aElement, aFlags, aBlurredElementInfo);
}
/* static */ /* static */
void nsFocusManager::NotifyFocusStateChange( void nsFocusManager::NotifyFocusStateChange(
Element* aElement, Element* aElementToFocus, Element* aElement, Element* aElementToFocus,
@ -1253,7 +1232,7 @@ void nsFocusManager::NotifyFocusStateChange(
if (aGettingFocus) { if (aGettingFocus) {
EventStates eventStateToAdd = NS_EVENT_STATE_FOCUS; EventStates eventStateToAdd = NS_EVENT_STATE_FOCUS;
if (aWindowShouldShowFocusRing || if (aWindowShouldShowFocusRing ||
ShouldFocusRingBeVisible(*aElement, aFlags, aBlurredElementInfo)) { ShouldMatchFocusVisible(*aElement, aFlags, aBlurredElementInfo)) {
eventStateToAdd |= NS_EVENT_STATE_FOCUSRING; eventStateToAdd |= NS_EVENT_STATE_FOCUSRING;
} }
aElement->AddStates(eventStateToAdd); aElement->AddStates(eventStateToAdd);

Просмотреть файл

@ -18,8 +18,6 @@
SimpleTest.waitForExplicitFinish(); SimpleTest.waitForExplicitFinish();
const kFocusVisibleEnabled = SpecialPowers.getBoolPref("layout.css.focus-visible.enabled");
function snapShot(element) { function snapShot(element) {
var rect = element.getBoundingClientRect(); var rect = element.getBoundingClientRect();
adjustedRect = { left: rect.left - 6, top: rect.top - 6, adjustedRect = { left: rect.left - 6, top: rect.top - 6,
@ -70,12 +68,12 @@ function runTest()
is(getComputedStyle($("l1"), "").outlineWidth, "0px", "appearance on previous list after focus() with :focus"); is(getComputedStyle($("l1"), "").outlineWidth, "0px", "appearance on previous list after focus() with :focus");
synthesizeMouse($("l1"), 4, 4, { }); synthesizeMouse($("l1"), 4, 4, { });
checkFocus($("l1"), expectedVisible && !kFocusVisibleEnabled, "appearance on list after mouse focus with :moz-focusring"); checkFocus($("l1"), false, "appearance on list after mouse focus with :moz-focusring");
synthesizeMouse($("l2"), 4, 4, { }); synthesizeMouse($("l2"), 4, 4, { });
checkFocus($("l2"), true, "appearance on list after mouse focus with :focus"); checkFocus($("l2"), true, "appearance on list after mouse focus with :focus");
synthesizeMouse($("b1"), 4, 4, { }); synthesizeMouse($("b1"), 4, 4, { });
checkFocus($("b1"), !isMac && expectedVisible && !kFocusVisibleEnabled, "appearance on button after mouse focus with :moz-focusring"); checkFocus($("b1"), false, "appearance on button after mouse focus with :moz-focusring");
if (navigator.platform.includes("Mac")) { if (navigator.platform.includes("Mac")) {
ok(compareSnapshots(snapShot($("b1")), snapShot($("b2")), false)[0], "focus after mouse shows no ring"); ok(compareSnapshots(snapShot($("b1")), snapShot($("b2")), false)[0], "focus after mouse shows no ring");
} }
@ -143,7 +141,7 @@ function testHTMLElements(list, isMac, expectedNoRingsOnWin)
var expectedMatchWithMouse = shouldFocus && !expectedNoRingsOnWin; var expectedMatchWithMouse = shouldFocus && !expectedNoRingsOnWin;
var mouseRingSize = ringSize; var mouseRingSize = ringSize;
if (shouldFocus && kFocusVisibleEnabled) { if (shouldFocus) {
var textControl = (function() { var textControl = (function() {
if (elem.localName == "textarea") if (elem.localName == "textarea")
return true; return true;

Просмотреть файл

@ -62,7 +62,7 @@ ms[rquote]:after {
text-decoration: none !important; text-decoration: none !important;
} }
*:-moz-focusring { :focus-visible {
/* Don't specify the outline-color, we should always use initial value. */ /* Don't specify the outline-color, we should always use initial value. */
outline: 1px dotted; outline: 1px dotted;
} }

Просмотреть файл

@ -492,10 +492,10 @@ input:is([type=radio], [type=checkbox]):is(:disabled, :disabled:active, :disable
cursor: unset; cursor: unset;
} }
input:not([type=file], [type=image]):-moz-focusring, input:not([type=file], [type=image]):focus-visible,
select:-moz-focusring, select:focus-visible,
button:-moz-focusring, button:focus-visible,
textarea:-moz-focusring { textarea:focus-visible {
/* These elements can handle outline themselves when themed, so we use /* These elements can handle outline themselves when themed, so we use
* outline-style: auto and skip rendering the outline only when themed and * outline-style: auto and skip rendering the outline only when themed and
* the theme allows so */ * the theme allows so */
@ -637,7 +637,7 @@ input:is([type=reset], [type=button], [type=submit]):active:hover {
border: 1px dotted transparent; border: 1px dotted transparent;
} }
:-moz-focusring::-moz-focus-inner { :focus-visible::-moz-focus-inner {
border-color: currentColor; border-color: currentColor;
} }
@ -728,7 +728,7 @@ optgroup:before {
box-shadow: 0 0 1.5px 1px red; box-shadow: 0 0 1.5px 1px red;
} }
:-moz-ui-invalid:-moz-focusring { :-moz-ui-invalid:focus-visible {
box-shadow: 0 0 2px 2px rgba(255,0,0,0.4); box-shadow: 0 0 2px 2px rgba(255,0,0,0.4);
} }

Просмотреть файл

@ -702,14 +702,14 @@ canvas {
} }
/* focusable content: anything w/ tabindex >=0 is focusable */ /* focusable content: anything w/ tabindex >=0 is focusable */
:-moz-focusring { :focus-visible {
/* Don't specify the outline-color, we should always use initial value. */ /* Don't specify the outline-color, we should always use initial value. */
outline: 1px dotted; outline: 1px dotted;
} }
iframe:-moz-focusring, iframe:focus-visible,
body:-moz-focusring, body:focus-visible,
html:-moz-focusring { html:focus-visible {
/* These elements historically don't show outlines when focused by default. /* These elements historically don't show outlines when focused by default.
* We could consider changing that if needed. */ * We could consider changing that if needed. */
outline-style: none; outline-style: none;

Просмотреть файл

@ -152,8 +152,10 @@
cursor: pointer; cursor: pointer;
} }
*|*:any-link:-moz-focusring { *|*:any-link:focus-visible {
/* Don't specify the outline-color, we should always use initial value. */ /* Don't specify the outline-color, we should always use initial value. */
/* TODO(emilio): I think this is redundant, html.css does the same for all
* :focus-visible elements. */
outline: 1px dotted; outline: 1px dotted;
} }

Просмотреть файл

@ -97,7 +97,7 @@ foreignObject {
opacity: inherit; opacity: inherit;
} }
*:-moz-focusring { :focus-visible {
/* Don't specify the outline-color, we should always use initial value. */ /* Don't specify the outline-color, we should always use initial value. */
outline: 1px dotted; outline: 1px dotted;
} }

Просмотреть файл

@ -969,9 +969,7 @@
# #
# This behavior matches both historical and GTK / Windows focus behavior. # This behavior matches both historical and GTK / Windows focus behavior.
# #
# :focus-visible is intended to provide better heuristics than this, so for now # :focus-visible is intended to provide better heuristics than this.
# we make this false whenever layout.css.focus-visible.enabled is enabled by
# default.
- name: browser.display.always_show_rings_after_key_focus - name: browser.display.always_show_rings_after_key_focus
type: bool type: bool
value: false value: false
@ -6082,17 +6080,6 @@
mirror: always mirror: always
rust: true rust: true
# Whether the `:focus-visible` pseudo-class is enabled.
#
# NOTE: You probably want to change the default value of
# browser.display.always_show_rings_after_key_focus whenever you change the
# default value of this pref.
- name: layout.css.focus-visible.enabled
type: RelaxedAtomicBool
value: true
mirror: always
rust: true
# Whether the `:autofill` pseudo-class is exposed to content. # Whether the `:autofill` pseudo-class is exposed to content.
- name: layout.css.autofill.enabled - name: layout.css.autofill.enabled
type: RelaxedAtomicBool type: RelaxedAtomicBool

Просмотреть файл

@ -55,8 +55,6 @@ macro_rules! apply_non_ts_list {
("fullscreen", Fullscreen, IN_FULLSCREEN_STATE, _), ("fullscreen", Fullscreen, IN_FULLSCREEN_STATE, _),
("-moz-modal-dialog", MozModalDialog, IN_MODAL_DIALOG_STATE, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS), ("-moz-modal-dialog", MozModalDialog, IN_MODAL_DIALOG_STATE, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS),
("-moz-topmost-modal-dialog", MozTopmostModalDialog, IN_TOPMOST_MODAL_DIALOG_STATE, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS), ("-moz-topmost-modal-dialog", MozTopmostModalDialog, IN_TOPMOST_MODAL_DIALOG_STATE, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS),
// TODO(emilio): This is inconsistently named (the capital R).
("-moz-focusring", MozFocusRing, IN_FOCUSRING_STATE, _),
("-moz-broken", MozBroken, IN_BROKEN_STATE, _), ("-moz-broken", MozBroken, IN_BROKEN_STATE, _),
("-moz-loading", MozLoading, IN_LOADING_STATE, _), ("-moz-loading", MozLoading, IN_LOADING_STATE, _),
("-moz-has-dir-attr", MozHasDirAttr, IN_HAS_DIR_ATTR_STATE, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS), ("-moz-has-dir-attr", MozHasDirAttr, IN_HAS_DIR_ATTR_STATE, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS),

Просмотреть файл

@ -102,6 +102,7 @@ impl NonTSPseudoClass {
"-moz-full-screen" => Some(NonTSPseudoClass::Fullscreen), "-moz-full-screen" => Some(NonTSPseudoClass::Fullscreen),
"-moz-read-only" => Some(NonTSPseudoClass::ReadOnly), "-moz-read-only" => Some(NonTSPseudoClass::ReadOnly),
"-moz-read-write" => Some(NonTSPseudoClass::ReadWrite), "-moz-read-write" => Some(NonTSPseudoClass::ReadWrite),
"-moz-focusring" => Some(NonTSPseudoClass::FocusVisible),
"-webkit-autofill" => Some(NonTSPseudoClass::Autofill), "-webkit-autofill" => Some(NonTSPseudoClass::Autofill),
_ => None, _ => None,
} }
@ -136,9 +137,6 @@ impl NonTSPseudoClass {
/// Returns whether the pseudo-class is enabled in content sheets. /// Returns whether the pseudo-class is enabled in content sheets.
#[inline] #[inline]
fn is_enabled_in_content(&self) -> bool { fn is_enabled_in_content(&self) -> bool {
if let NonTSPseudoClass::FocusVisible = *self {
return static_prefs::pref!("layout.css.focus-visible.enabled");
}
if let NonTSPseudoClass::Autofill = *self { if let NonTSPseudoClass::Autofill = *self {
return static_prefs::pref!("layout.css.autofill.enabled"); return static_prefs::pref!("layout.css.autofill.enabled");
} }

Просмотреть файл

@ -2042,7 +2042,6 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
NonTSPseudoClass::MozDragOver | NonTSPseudoClass::MozDragOver |
NonTSPseudoClass::MozDevtoolsHighlighted | NonTSPseudoClass::MozDevtoolsHighlighted |
NonTSPseudoClass::MozStyleeditorTransitioning | NonTSPseudoClass::MozStyleeditorTransitioning |
NonTSPseudoClass::MozFocusRing |
NonTSPseudoClass::MozMathIncrementScriptLevel | NonTSPseudoClass::MozMathIncrementScriptLevel |
NonTSPseudoClass::InRange | NonTSPseudoClass::InRange |
NonTSPseudoClass::OutOfRange | NonTSPseudoClass::OutOfRange |

Просмотреть файл

@ -1,3 +1,2 @@
prefs: [layout.css.focus-visible.enabled:true]
lsan-disabled: true lsan-disabled: true
leak-threshold: [default:3276800, tab:460800] leak-threshold: [default:3276800, tab:460800]

Просмотреть файл

@ -1,2 +0,0 @@
[drawFocusIfNeeded_001.html]
prefs: [layout.css.focus-visible.enabled:true]

Просмотреть файл

@ -1,2 +0,0 @@
[drawFocusIfNeeded_004.html]
prefs: [layout.css.focus-visible.enabled:true]

Просмотреть файл

@ -1,2 +0,0 @@
[drawFocusIfNeeded_005.html]
prefs: [layout.css.focus-visible.enabled:true]