diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 8b1c0557c55..c2babf713e1 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -2508,16 +2508,32 @@ void Document::set_focused_element(GC::Ptr element) update_active_element(); } -void Document::set_active_element(Element* element) +void Document::set_active_element(GC::Ptr element) { if (m_active_element.ptr() == element) return; - GC::Ptr old_active_element = move(m_active_element); - m_active_element = element; + auto old_active_element = move(m_active_element); + auto* common_ancestor = find_common_ancestor(old_active_element, element); - if (auto* invalidation_target = find_common_ancestor(old_active_element, m_active_element) ?: this) - invalidation_target->invalidate_style(StyleInvalidationReason::TargetElementChange); + GC::Ptr old_active_node_root = nullptr; + GC::Ptr new_active_node_root = nullptr; + if (old_active_element) + old_active_node_root = old_active_element->root(); + if (element) + new_active_node_root = element->root(); + if (old_active_node_root != new_active_node_root) { + if (old_active_node_root) { + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Active, m_active_element, *old_active_node_root, element); + } + if (new_active_node_root) { + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Active, m_active_element, *new_active_node_root, element); + } + } else { + invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Active, m_active_element, *common_ancestor, element); + } + + m_active_element = element; if (paintable()) paintable()->set_needs_display(); diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index e5214429393..d5ad75a9b4e 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -431,8 +431,7 @@ public: void set_focused_element(GC::Ptr); Element const* active_element() const { return m_active_element.ptr(); } - - void set_active_element(Element*); + void set_active_element(GC::Ptr); Element const* target_element() const { return m_target_element.ptr(); } void set_target_element(GC::Ptr);