diff options
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM/Document.cpp')
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Document.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index a023d90572..20149b0d93 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -936,10 +936,29 @@ void Document::set_hovered_node(Node* node) JS::GCPtr<Node> old_hovered_node = move(m_hovered_node); m_hovered_node = node; - if (auto* common_ancestor = find_common_ancestor(old_hovered_node, m_hovered_node)) + auto* common_ancestor = find_common_ancestor(old_hovered_node, m_hovered_node); + if (common_ancestor) common_ancestor->invalidate_style(); else invalidate_style(); + + // https://w3c.github.io/uievents/#mouseleave + if (old_hovered_node && (!m_hovered_node || !m_hovered_node->is_descendant_of(*old_hovered_node))) { + // FIXME: Check if we need to dispatch these events in a specific order. + for (auto target = old_hovered_node; target && target.ptr() != common_ancestor; target = target->parent()) { + // FIXME: Populate the event with mouse coordinates, etc. + target->dispatch_event(*UIEvents::MouseEvent::create(realm(), UIEvents::EventNames::mouseleave)); + } + } + + // https://w3c.github.io/uievents/#mouseenter + if (m_hovered_node && (!old_hovered_node || !m_hovered_node->is_ancestor_of(*old_hovered_node))) { + // FIXME: Check if we need to dispatch these events in a specific order. + for (auto target = m_hovered_node; target.ptr() != common_ancestor; target = target->parent()) { + // FIXME: Populate the event with mouse coordinates, etc. + target->dispatch_event(*UIEvents::MouseEvent::create(realm(), UIEvents::EventNames::mouseenter)); + } + } } JS::NonnullGCPtr<HTMLCollection> Document::get_elements_by_name(String const& name) |