diff --git a/components/style/gecko/generated/pseudo_element_definition.rs b/components/style/gecko/generated/pseudo_element_definition.rs index fa715d94290..3071e140b2c 100644 --- a/components/style/gecko/generated/pseudo_element_definition.rs +++ b/components/style/gecko/generated/pseudo_element_definition.rs @@ -546,6 +546,26 @@ impl PseudoElement { PseudoElement::Before | PseudoElement::After | PseudoElement::FirstLine | PseudoElement::FirstLetter) } + /// Whether this pseudo-element is tree pseudo-element. + #[inline] + pub fn is_tree_pseudo_element(&self) -> bool { + match *self { + PseudoElement::MozTreeColumn(..) => true, + PseudoElement::MozTreeRow(..) => true, + PseudoElement::MozTreeSeparator(..) => true, + PseudoElement::MozTreeCell(..) => true, + PseudoElement::MozTreeIndentation(..) => true, + PseudoElement::MozTreeLine(..) => true, + PseudoElement::MozTreeTwisty(..) => true, + PseudoElement::MozTreeImage(..) => true, + PseudoElement::MozTreeCellText(..) => true, + PseudoElement::MozTreeCheckbox(..) => true, + PseudoElement::MozTreeProgressmeter(..) => true, + PseudoElement::MozTreeDropFeedback(..) => true, + _ => false, + } + } + /// Gets the flags associated to this pseudo-element, or 0 if it's an /// anonymous box. pub fn flags(&self) -> u32 { diff --git a/components/style/gecko/pseudo_element.rs b/components/style/gecko/pseudo_element.rs index fba462171f7..ac18522ce43 100644 --- a/components/style/gecko/pseudo_element.rs +++ b/components/style/gecko/pseudo_element.rs @@ -46,7 +46,7 @@ impl PseudoElement { return PseudoElementCascadeType::Eager } - if self.is_anon_box() { + if self.is_precomputed() { return PseudoElementCascadeType::Precomputed } @@ -137,7 +137,7 @@ impl PseudoElement { /// Whether this pseudo-element is precomputed. #[inline] pub fn is_precomputed(&self) -> bool { - self.is_anon_box() + self.is_anon_box() && !self.is_tree_pseudo_element() } /// Covert non-canonical pseudo-element to canonical one, and keep a diff --git a/components/style/gecko/pseudo_element_definition.mako.rs b/components/style/gecko/pseudo_element_definition.mako.rs index 9af00ace75c..3df77fa07f3 100644 --- a/components/style/gecko/pseudo_element_definition.mako.rs +++ b/components/style/gecko/pseudo_element_definition.mako.rs @@ -94,6 +94,17 @@ impl PseudoElement { ${" | ".join(map(lambda name: "PseudoElement::{}".format(name), EAGER_PSEUDOS))}) } + /// Whether this pseudo-element is tree pseudo-element. + #[inline] + pub fn is_tree_pseudo_element(&self) -> bool { + match *self { + % for pseudo in TREE_PSEUDOS: + ${pseudo_element_variant(pseudo)} => true, + % endfor + _ => false, + } + } + /// Gets the flags associated to this pseudo-element, or 0 if it's an /// anonymous box. pub fn flags(&self) -> u32 { diff --git a/components/style/stylist.rs b/components/style/stylist.rs index 5670dbebea4..ca3510fdc4d 100644 --- a/components/style/stylist.rs +++ b/components/style/stylist.rs @@ -1983,13 +1983,8 @@ impl CascadeData { let map = match selector.pseudo_element() { Some(pseudo) if pseudo.is_precomputed() => { - if !selector.is_universal() || - !matches!(origin, Origin::UserAgent) { - // ::-moz-tree selectors may appear in - // non-UA sheets (even though they never - // match). - continue; - } + debug_assert!(selector.is_universal()); + debug_assert!(matches!(origin, Origin::UserAgent)); precomputed_pseudo_element_decls .as_mut()