diff --git a/Libraries/LibHTML/HtmlView.cpp b/Libraries/LibHTML/HtmlView.cpp index 99bf292807..23c0a2f971 100644 --- a/Libraries/LibHTML/HtmlView.cpp +++ b/Libraries/LibHTML/HtmlView.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -78,3 +79,17 @@ void HtmlView::paint_event(GPaintEvent& event) RenderingContext context { painter }; m_layout_root->render(context); } + +void HtmlView::mousemove_event(GMouseEvent& event) +{ + if (!m_layout_root) + return GScrollableWidget::mousemove_event(event); + + auto result = m_layout_root->hit_test(event.position()); + if (result.layout_node) { + if (auto* node = result.layout_node->node()) { + dbg() << "HtmlView: mousemove: " << node->tag_name() << "{" << node << "}"; + } + } + event.accept(); +} diff --git a/Libraries/LibHTML/HtmlView.h b/Libraries/LibHTML/HtmlView.h index 8d04f738fe..d7b9b6d668 100644 --- a/Libraries/LibHTML/HtmlView.h +++ b/Libraries/LibHTML/HtmlView.h @@ -17,6 +17,7 @@ protected: virtual void resize_event(GResizeEvent&) override; virtual void paint_event(GPaintEvent&) override; + virtual void mousemove_event(GMouseEvent&) override; private: void layout_and_sync_size(); diff --git a/Libraries/LibHTML/Layout/LayoutNode.cpp b/Libraries/LibHTML/Layout/LayoutNode.cpp index e4500008f1..ba8d19722a 100644 --- a/Libraries/LibHTML/Layout/LayoutNode.cpp +++ b/Libraries/LibHTML/Layout/LayoutNode.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -34,3 +35,16 @@ void LayoutNode::render(RenderingContext& context) child.render(context); }); } + +HitTestResult LayoutNode::hit_test(const Point& position) const +{ + if (!m_rect.contains(position)) + return {}; + HitTestResult result { this }; + for_each_child([&](auto& child) { + auto child_result = child.hit_test(position); + if (child_result.layout_node) + result = child_result; + }); + return result; +} diff --git a/Libraries/LibHTML/Layout/LayoutNode.h b/Libraries/LibHTML/Layout/LayoutNode.h index 7803b5fcc8..8663408df8 100644 --- a/Libraries/LibHTML/Layout/LayoutNode.h +++ b/Libraries/LibHTML/Layout/LayoutNode.h @@ -9,7 +9,13 @@ #include class Node; +class Element; class LayoutBlock; +class LayoutNode; + +struct HitTestResult { + RefPtr layout_node; +}; class LayoutNode : public TreeNode { public: @@ -22,6 +28,8 @@ public: ComputedStyle& style() { return m_style; } const ComputedStyle& style() const { return m_style; } + virtual HitTestResult hit_test(const Point&) const; + bool is_anonymous() const { return !m_node; } const Node* node() const { return m_node; }