зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
4e494b48f7
Коммит
217ddbe75f
|
@ -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]
|
|
Загрузка…
Ссылка в новой задаче