mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-12 04:22:28 +00:00
LibWeb: Use optimized invalidation for focus-related pseudo classes
This commit is contained in:
parent
d5e64a172a
commit
4efc553f46
2 changed files with 27 additions and 5 deletions
|
@ -2452,7 +2452,7 @@ void Document::update_active_element()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Document::set_focused_element(Element* element)
|
void Document::set_focused_element(GC::Ptr<Element> element)
|
||||||
{
|
{
|
||||||
if (m_focused_element.ptr() == element)
|
if (m_focused_element.ptr() == element)
|
||||||
return;
|
return;
|
||||||
|
@ -2462,10 +2462,32 @@ void Document::set_focused_element(Element* element)
|
||||||
if (old_focused_element)
|
if (old_focused_element)
|
||||||
old_focused_element->did_lose_focus();
|
old_focused_element->did_lose_focus();
|
||||||
|
|
||||||
m_focused_element = element;
|
auto* common_ancestor = find_common_ancestor(old_focused_element, element);
|
||||||
|
|
||||||
if (auto* invalidation_target = find_common_ancestor(old_focused_element, m_focused_element) ?: this)
|
GC::Ptr<Node> old_focused_node_root = nullptr;
|
||||||
invalidation_target->invalidate_style(StyleInvalidationReason::FocusedElementChange);
|
GC::Ptr<Node> new_focused_node_root = nullptr;
|
||||||
|
if (old_focused_element)
|
||||||
|
old_focused_node_root = old_focused_element->root();
|
||||||
|
if (element)
|
||||||
|
new_focused_node_root = element->root();
|
||||||
|
if (old_focused_node_root != new_focused_node_root) {
|
||||||
|
if (old_focused_node_root) {
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Focus, m_focused_element, *old_focused_node_root, element);
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::FocusWithin, m_focused_element, *old_focused_node_root, element);
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::FocusVisible, m_focused_element, *old_focused_node_root, element);
|
||||||
|
}
|
||||||
|
if (new_focused_node_root) {
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Focus, m_focused_element, *new_focused_node_root, element);
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::FocusWithin, m_focused_element, *new_focused_node_root, element);
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::FocusVisible, m_focused_element, *new_focused_node_root, element);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::Focus, m_focused_element, *common_ancestor, element);
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::FocusWithin, m_focused_element, *common_ancestor, element);
|
||||||
|
invalidate_style_for_elements_affected_by_pseudo_class_change(CSS::PseudoClass::FocusVisible, m_focused_element, *common_ancestor, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_focused_element = element;
|
||||||
|
|
||||||
if (m_focused_element)
|
if (m_focused_element)
|
||||||
m_focused_element->did_receive_focus();
|
m_focused_element->did_receive_focus();
|
||||||
|
|
|
@ -428,7 +428,7 @@ public:
|
||||||
Element* focused_element() { return m_focused_element.ptr(); }
|
Element* focused_element() { return m_focused_element.ptr(); }
|
||||||
Element const* focused_element() const { return m_focused_element.ptr(); }
|
Element const* focused_element() const { return m_focused_element.ptr(); }
|
||||||
|
|
||||||
void set_focused_element(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(); }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue