diff --git a/components/style/gecko/pseudo_element.rs b/components/style/gecko/pseudo_element.rs index 5b1cbfdf2a5..05e2ebbfb6a 100644 --- a/components/style/gecko/pseudo_element.rs +++ b/components/style/gecko/pseudo_element.rs @@ -115,6 +115,13 @@ impl PseudoElement { (self.flags() & structs::CSS_PSEUDO_ELEMENT_SUPPORTS_USER_ACTION_STATE) != 0 } + /// Whether this pseudo-element skips flex/grid container display-based + /// fixup. + #[inline] + pub fn skip_item_based_display_fixup(&self) -> bool { + (self.flags() & structs::CSS_PSEUDO_ELEMENT_IS_FLEX_OR_GRID_ITEM) == 0 + } + /// Whether this pseudo-element is precomputed. #[inline] pub fn is_precomputed(&self) -> bool { diff --git a/components/style/servo/selector_parser.rs b/components/style/servo/selector_parser.rs index 12060f3e738..784a839c800 100644 --- a/components/style/servo/selector_parser.rs +++ b/components/style/servo/selector_parser.rs @@ -150,6 +150,13 @@ impl PseudoElement { self.is_precomputed() } + /// Whether this pseudo-element skips flex/grid container + /// display-based fixup. + #[inline] + pub fn skip_item_based_display_fixup(&self) -> bool { + !self.is_before_or_after() + } + /// Whether this pseudo-element is precomputed. #[inline] pub fn is_precomputed(&self) -> bool { diff --git a/components/style/style_resolver.rs b/components/style/style_resolver.rs index cf512c4fbdd..d83a5961c24 100644 --- a/components/style/style_resolver.rs +++ b/components/style/style_resolver.rs @@ -442,7 +442,8 @@ where let mut cascade_info = CascadeInfo::new(); let mut cascade_flags = CascadeFlags::empty(); - if self.element.skip_root_and_item_based_display_fixup() { + if self.element.skip_root_and_item_based_display_fixup() || + pseudo.map_or(false, |p| p.skip_item_based_display_fixup()) { cascade_flags.insert(SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP); }