diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 56071a95bc3..8b1c0557c55 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -2523,16 +2523,36 @@ void Document::set_active_element(Element* element) paintable()->set_needs_display(); } -void Document::set_target_element(Element* element) +void Document::set_target_element(GC::Ptr element) { if (m_target_element.ptr() == element) return; GC::Ptr old_target_element = move(m_target_element); - m_target_element = element; - if (auto* invalidation_target = find_common_ancestor(old_target_element, m_target_element) ?: this) - invalidation_target->invalidate_style(StyleInvalidationReason::TargetElementChange); + auto* common_ancestor = find_common_ancestor(old_target_element, element); + + GC::Ptr old_target_node_root = nullptr; + GC::Ptr new_target_node_root = nullptr; + if (old_target_element) + old_target_node_root = old_target_element->root(); + if (element) + new_target_node_root = element->root(); + if (old_target_node_root != new_target_node_root) { + if (old_target_node_root) { + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Target, m_target_element, *old_target_node_root, element); + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::TargetWithin, m_target_element, *old_target_node_root, element); + } + if (new_target_node_root) { + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Target, m_target_element, *new_target_node_root, element); + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::TargetWithin, m_target_element, *new_target_node_root, element); + } + } else { + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Target, m_target_element, *common_ancestor, element); + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::TargetWithin, m_target_element, *common_ancestor, element); + } + + m_target_element = element; if (paintable()) paintable()->set_needs_display(); diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 87243c65e17..e5214429393 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -435,7 +435,7 @@ public: void set_active_element(Element*); Element const* target_element() const { return m_target_element.ptr(); } - void set_target_element(Element*); + void set_target_element(GC::Ptr); void try_to_scroll_to_the_fragment(); void scroll_to_the_fragment();