LibWeb: Use optimized invalidation for :active pseudo class

This commit is contained in:
Andreas Kling 2025-04-17 14:29:27 +02:00 committed by Andreas Kling
parent 6da48c60ca
commit 55ab8ff539
Notes: github-actions[bot] 2025-04-17 17:47:05 +00:00
2 changed files with 22 additions and 7 deletions

View file

@ -2508,16 +2508,32 @@ void Document::set_focused_element(GC::Ptr<Element> element)
update_active_element(); update_active_element();
} }
void Document::set_active_element(Element* element) void Document::set_active_element(GC::Ptr<Element> element)
{ {
if (m_active_element.ptr() == element) if (m_active_element.ptr() == element)
return; return;
GC::Ptr<Node> old_active_element = move(m_active_element); auto old_active_element = move(m_active_element);
m_active_element = 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) GC::Ptr<Node> old_active_node_root = nullptr;
invalidation_target->invalidate_style(StyleInvalidationReason::TargetElementChange); GC::Ptr<Node> 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()) if (paintable())
paintable()->set_needs_display(); paintable()->set_needs_display();

View file

@ -431,8 +431,7 @@ public:
void set_focused_element(GC::Ptr<Element>); void set_focused_element(GC::Ptr<Element>);
Element const* active_element() const { return m_active_element.ptr(); } Element const* active_element() const { return m_active_element.ptr(); }
void set_active_element(GC::Ptr<Element>);
void set_active_element(Element*);
Element const* target_element() const { return m_target_element.ptr(); } Element const* target_element() const { return m_target_element.ptr(); }
void set_target_element(GC::Ptr<Element>); void set_target_element(GC::Ptr<Element>);