|
@@ -453,9 +453,14 @@ bool EventHandler::handle_mousemove(Gfx::IntPoint const& position, unsigned butt
|
|
|
// FIXME: Handle other values for pointer-events.
|
|
|
VERIFY(pointer_events != CSS::PointerEvents::None);
|
|
|
|
|
|
+ // Search for the first parent of the hit target that's an element.
|
|
|
+ // "The click event type MUST be dispatched on the topmost event target indicated by the pointer." (https://www.w3.org/TR/uievents/#event-type-click)
|
|
|
+ // "The topmost event target MUST be the element highest in the rendering order which is capable of being an event target." (https://www.w3.org/TR/uievents/#topmost-event-target)
|
|
|
+ Layout::Node const* layout_node;
|
|
|
+ bool found_parent_element = parent_element_for_event_dispatch(*paintable, node, layout_node);
|
|
|
hovered_node_changed = node.ptr() != document.hovered_node();
|
|
|
document.set_hovered_node(node);
|
|
|
- if (node) {
|
|
|
+ if (found_parent_element) {
|
|
|
hovered_link_element = node->enclosing_link_element();
|
|
|
if (hovered_link_element)
|
|
|
is_hovering_link = true;
|
|
@@ -474,22 +479,12 @@ bool EventHandler::handle_mousemove(Gfx::IntPoint const& position, unsigned butt
|
|
|
hovered_node_cursor = cursor_css_to_gfx(cursor);
|
|
|
}
|
|
|
|
|
|
- // Search for the first parent of the hit target that's an element.
|
|
|
- // "The click event type MUST be dispatched on the topmost event target indicated by the pointer." (https://www.w3.org/TR/uievents/#event-type-click)
|
|
|
- // "The topmost event target MUST be the element highest in the rendering order which is capable of being an event target." (https://www.w3.org/TR/uievents/#topmost-event-target)
|
|
|
- Layout::Node const* layout_node;
|
|
|
- if (!parent_element_for_event_dispatch(*paintable, node, layout_node)) {
|
|
|
- // FIXME: This is pretty ugly but we need to bail out here.
|
|
|
- goto after_node_use;
|
|
|
- }
|
|
|
-
|
|
|
auto offset = compute_mouse_event_offset(position, *layout_node);
|
|
|
node->dispatch_event(*UIEvents::MouseEvent::create_from_platform_event(node->realm(), UIEvents::EventNames::mousemove, offset.x(), offset.y(), position.x(), position.y(), buttons));
|
|
|
// NOTE: Dispatching an event may have disturbed the world.
|
|
|
if (!paint_root() || paint_root() != node->document().paint_box())
|
|
|
return true;
|
|
|
}
|
|
|
- after_node_use:
|
|
|
if (m_in_mouse_selection) {
|
|
|
auto hit = paint_root()->hit_test(position.to_type<float>(), Painting::HitTestType::TextCursor);
|
|
|
if (start_index.has_value() && hit.has_value() && hit->dom_node()) {
|