style: Correctly style dark scrollbars in tree components.

We need to ensure the rules that override all properties for scrollbar
part elements only apply to those that are NAC (and so will be eligible
for NAC style sharing).  We have some uses of non-NAC <scrollbar>
elements that should continue to inherit properties from their parents.

To avoid any changes in rule matching order that come with changing specificity,
we add a new :-moz-native-anonymous-no-specificity pseudo-class.

While we're here, we note :-moz-native-anonymous-no-specificity (and the
regular :-moz-native-anonymous pseudo-class) as not needing style
sharing cache revalidation, as we never share NAC styles.

Differential Revision: https://phabricator.services.mozilla.com/D56154
This commit is contained in:
Cameron McCormack 2019-12-09 03:16:03 +00:00 committed by Emilio Cobos Álvarez
parent e944962fe2
commit 6973317a58
6 changed files with 31 additions and 4 deletions

View file

@ -17,7 +17,7 @@
//! is non-trivial. This module encapsulates those details and presents an //! is non-trivial. This module encapsulates those details and presents an
//! easy-to-use API for the parser. //! easy-to-use API for the parser.
use crate::parser::{Combinator, Component, SelectorImpl}; use crate::parser::{Combinator, Component, NonTSPseudoClass, SelectorImpl};
use crate::sink::Push; use crate::sink::Push;
use servo_arc::{Arc, HeaderWithLength, ThinArc}; use servo_arc::{Arc, HeaderWithLength, ThinArc};
use smallvec::{self, SmallVec}; use smallvec::{self, SmallVec};
@ -322,9 +322,13 @@ where
Component::NthLastOfType(..) | Component::NthLastOfType(..) |
Component::FirstOfType | Component::FirstOfType |
Component::LastOfType | Component::LastOfType |
Component::OnlyOfType | Component::OnlyOfType => {
Component::NonTSPseudoClass(..) => {
specificity.class_like_selectors += 1; specificity.class_like_selectors += 1;
}
Component::NonTSPseudoClass(ref pseudo) => {
if !pseudo.has_zero_specificity() {
specificity.class_like_selectors += 1;
}
}, },
Component::ExplicitUniversalType | Component::ExplicitUniversalType |
Component::ExplicitAnyNamespace | Component::ExplicitAnyNamespace |

View file

@ -52,6 +52,9 @@ pub trait NonTSPseudoClass: Sized + ToCss {
/// ///
/// https://drafts.csswg.org/selectors-4/#useraction-pseudos /// https://drafts.csswg.org/selectors-4/#useraction-pseudos
fn is_user_action_state(&self) -> bool; fn is_user_action_state(&self) -> bool;
/// Whether this pseudo-class has zero specificity.
fn has_zero_specificity(&self) -> bool;
} }
/// Returns a Cow::Borrowed if `s` is already ASCII lowercase, and a /// Returns a Cow::Borrowed if `s` is already ASCII lowercase, and a
@ -2336,6 +2339,11 @@ pub mod tests {
fn is_user_action_state(&self) -> bool { fn is_user_action_state(&self) -> bool {
self.is_active_or_hover() self.is_active_or_hover()
} }
#[inline]
fn has_zero_specificity(&self) -> bool {
false
}
} }
impl ToCss for PseudoClass { impl ToCss for PseudoClass {

View file

@ -94,6 +94,7 @@ macro_rules! apply_non_ts_list {
("-moz-last-node", MozLastNode, lastNode, _, _), ("-moz-last-node", MozLastNode, lastNode, _, _),
("-moz-only-whitespace", MozOnlyWhitespace, mozOnlyWhitespace, _, _), ("-moz-only-whitespace", MozOnlyWhitespace, mozOnlyWhitespace, _, _),
("-moz-native-anonymous", MozNativeAnonymous, mozNativeAnonymous, _, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS), ("-moz-native-anonymous", MozNativeAnonymous, mozNativeAnonymous, _, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS),
("-moz-native-anonymous-no-specificity", MozNativeAnonymousNoSpecificity, mozNativeAnonymousNoSpecificity, _, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS),
("-moz-use-shadow-tree-root", MozUseShadowTreeRoot, mozUseShadowTreeRoot, _, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS), ("-moz-use-shadow-tree-root", MozUseShadowTreeRoot, mozUseShadowTreeRoot, _, PSEUDO_CLASS_ENABLED_IN_UA_SHEETS),
("-moz-is-html", MozIsHTML, mozIsHTML, _, _), ("-moz-is-html", MozIsHTML, mozIsHTML, _, _),
("-moz-placeholder", MozPlaceholder, mozPlaceholder, _, _), ("-moz-placeholder", MozPlaceholder, mozPlaceholder, _, _),

View file

@ -233,6 +233,9 @@ impl NonTSPseudoClass {
// across all the elements involved and the latter is already // across all the elements involved and the latter is already
// checked for by our caching precondtions. // checked for by our caching precondtions.
NonTSPseudoClass::MozIsHTML | NonTSPseudoClass::MozIsHTML |
// We prevent style sharing for NAC.
NonTSPseudoClass::MozNativeAnonymous |
NonTSPseudoClass::MozNativeAnonymousNoSpecificity |
// :-moz-placeholder is parsed but never matches. // :-moz-placeholder is parsed but never matches.
NonTSPseudoClass::MozPlaceholder | NonTSPseudoClass::MozPlaceholder |
// :-moz-locale-dir and :-moz-window-inactive depend only on // :-moz-locale-dir and :-moz-window-inactive depend only on
@ -275,6 +278,11 @@ impl ::selectors::parser::NonTSPseudoClass for NonTSPseudoClass {
NonTSPseudoClass::Hover | NonTSPseudoClass::Active | NonTSPseudoClass::Focus NonTSPseudoClass::Hover | NonTSPseudoClass::Active | NonTSPseudoClass::Focus
) )
} }
#[inline]
fn has_zero_specificity(&self) -> bool {
matches!(*self, NonTSPseudoClass::MozNativeAnonymousNoSpecificity)
}
} }
/// The dummy struct we use to implement our selector parsing. /// The dummy struct we use to implement our selector parsing.

View file

@ -2130,7 +2130,8 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
} }
true true
}, },
NonTSPseudoClass::MozNativeAnonymous => self.is_in_native_anonymous_subtree(), NonTSPseudoClass::MozNativeAnonymous |
NonTSPseudoClass::MozNativeAnonymousNoSpecificity => self.is_in_native_anonymous_subtree(),
NonTSPseudoClass::MozUseShadowTreeRoot => self.is_root_of_use_element_shadow_tree(), NonTSPseudoClass::MozUseShadowTreeRoot => self.is_root_of_use_element_shadow_tree(),
NonTSPseudoClass::MozTableBorderNonzero => unsafe { NonTSPseudoClass::MozTableBorderNonzero => unsafe {
bindings::Gecko_IsTableBorderNonzero(self.0) bindings::Gecko_IsTableBorderNonzero(self.0)

View file

@ -309,6 +309,11 @@ impl ::selectors::parser::NonTSPseudoClass for NonTSPseudoClass {
NonTSPseudoClass::Active | NonTSPseudoClass::Hover | NonTSPseudoClass::Focus NonTSPseudoClass::Active | NonTSPseudoClass::Hover | NonTSPseudoClass::Focus
) )
} }
#[inline]
fn has_zero_specificity(&self) -> bool {
false
}
} }
impl ToCss for NonTSPseudoClass { impl ToCss for NonTSPseudoClass {