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; }