diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 3683c56d164..ff1a41b120c 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -3319,12 +3319,29 @@ impl<'a> SelectorsElement for DomRoot { self.is_html_element() && self.local_name() == &local_name!("slot") } - fn set_selector_flags(&self, flags: ElementSelectorFlags) { - #[allow(unsafe_code)] - unsafe { - Dom::from_ref(self.deref()) - .to_layout() - .insert_selector_flags(flags); + fn apply_selector_flags(&self, flags: ElementSelectorFlags) { + // Handle flags that apply to the element. + let self_flags = flags.for_self(); + if !self_flags.is_empty() { + #[allow(unsafe_code)] + unsafe { + Dom::from_ref(self.deref()) + .to_layout() + .insert_selector_flags(self_flags); + } + } + + // Handle flags that apply to the parent. + let parent_flags = flags.for_parent(); + if !parent_flags.is_empty() { + if let Some(p) = self.parent_element() { + #[allow(unsafe_code)] + unsafe { + Dom::from_ref(p.deref()) + .to_layout() + .insert_selector_flags(parent_flags); + } + } } } } diff --git a/components/script/layout_dom/element.rs b/components/script/layout_dom/element.rs index 3c070802974..7e9c1653dd1 100644 --- a/components/script/layout_dom/element.rs +++ b/components/script/layout_dom/element.rs @@ -672,8 +672,20 @@ impl<'dom, LayoutDataType: LayoutDataTrait> ::selectors::Element self.element.is_html_element() && self.as_node().owner_doc().is_html_document() } - fn set_selector_flags(&self, flags: ElementSelectorFlags) { - self.element.insert_selector_flags(flags); + fn apply_selector_flags(&self, flags: ElementSelectorFlags) { + // Handle flags that apply to the element. + let self_flags = flags.for_self(); + if !self_flags.is_empty() { + self.element.insert_selector_flags(flags); + } + + // Handle flags that apply to the parent. + let parent_flags = flags.for_parent(); + if !parent_flags.is_empty() { + if let Some(p) = self.as_node().parent_element() { + p.element.insert_selector_flags(flags); + } + } } } @@ -915,8 +927,20 @@ impl<'dom, LayoutDataType: LayoutDataTrait> ::selectors::Element false } - fn set_selector_flags(&self, flags: ElementSelectorFlags) { - self.element.element.insert_selector_flags(flags); + fn apply_selector_flags(&self, flags: ElementSelectorFlags) { + // Handle flags that apply to the element. + let self_flags = flags.for_self(); + if !self_flags.is_empty() { + self.element.element.insert_selector_flags(flags); + } + + // Handle flags that apply to the parent. + let parent_flags = flags.for_parent(); + if !parent_flags.is_empty() { + if let Some(p) = self.element.parent_element() { + p.element.insert_selector_flags(flags); + } + } } }