1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 18:37:35 +00:00

LibWeb: Add initial version of pointer-events CSS property

This commit is contained in:
huwdp 2021-10-05 19:47:13 +01:00 committed by Linus Groh
parent fe5c2b7bb9
commit ec43f7a2b0
7 changed files with 53 additions and 7 deletions

View file

@ -184,10 +184,16 @@ bool EventHandler::handle_mousedown(const Gfx::IntPoint& position, unsigned butt
}
NonnullRefPtr document = *m_frame.active_document();
// TODO: Allow selecting element behind if one on top has pointer-events set to none.
auto result = layout_root()->hit_test(position, Layout::HitTestType::Exact);
auto pointer_events = result.layout_node->computed_values().pointer_events();
if (pointer_events == CSS::PointerEvents::None)
return false;
RefPtr<DOM::Node> node;
{
auto result = layout_root()->hit_test(position, Layout::HitTestType::Exact);
if (!result.layout_node)
return false;
@ -306,6 +312,10 @@ bool EventHandler::handle_mousemove(const Gfx::IntPoint& position, unsigned butt
return false;
}
auto pointer_events = result.layout_node->computed_values().pointer_events();
if (pointer_events == CSS::PointerEvents::None)
return false;
hovered_node_changed = node != document.hovered_node();
document.set_hovered_node(node);
if (node) {
@ -313,11 +323,13 @@ bool EventHandler::handle_mousemove(const Gfx::IntPoint& position, unsigned butt
if (hovered_link_element)
is_hovering_link = true;
auto cursor = result.layout_node->computed_values().cursor();
if (node->is_text() && cursor == CSS::Cursor::Auto)
hovered_node_cursor = Gfx::StandardCursor::IBeam;
else
hovered_node_cursor = cursor_css_to_gfx(cursor);
if (node->is_text()) {
auto cursor = result.layout_node->computed_values().cursor();
if (cursor == CSS::Cursor::Auto)
hovered_node_cursor = Gfx::StandardCursor::IBeam;
else
hovered_node_cursor = cursor_css_to_gfx(cursor);
}
auto offset = compute_mouse_event_offset(position, *result.layout_node);
node->dispatch_event(UIEvents::MouseEvent::create(UIEvents::EventNames::mousemove, offset.x(), offset.y(), position.x(), position.y()));