summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-10-03 14:51:59 +0200
committerAndreas Kling <kling@serenityos.org>2022-10-03 17:22:08 +0200
commit9749eda09fde78c3cd54cecb90191cb2556eae8f (patch)
tree04e76b58dd123aab8527d91e7f822d23354866b6 /Userland/Libraries
parentf260afedb15b9c326229733d1dc62956a4b066e7 (diff)
downloadserenity-9749eda09fde78c3cd54cecb90191cb2556eae8f.zip
LibWeb: Dispatch mouseenter and mouseleave events when required
I've left a FIXME here about populating the events with mouse coordinates, button states, etc. We also need to verify that the dispatch order either doesn't matter or at least match other engines.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibWeb/DOM/Document.cpp21
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)