diff --git a/Libraries/LibHTML/HtmlView.cpp b/Libraries/LibHTML/HtmlView.cpp
index c845d05135..ed3511e1fa 100644
--- a/Libraries/LibHTML/HtmlView.cpp
+++ b/Libraries/LibHTML/HtmlView.cpp
@@ -103,3 +103,28 @@ void HtmlView::mousemove_event(GMouseEvent& event)
update();
event.accept();
}
+
+void HtmlView::mousedown_event(GMouseEvent& event)
+{
+ if (!m_layout_root)
+ return GScrollableWidget::mousemove_event(event);
+
+ bool hovered_node_changed = false;
+ auto result = m_layout_root->hit_test(event.position());
+ if (result.layout_node) {
+ auto* node = result.layout_node->node();
+ m_document->set_hovered_node(const_cast(node));
+ hovered_node_changed = node == m_document->hovered_node();
+ if (node) {
+ dbg() << "HtmlView: mousedown: " << node->tag_name() << "{" << node << "}";
+ if (auto* link = node->enclosing_link_element()) {
+ dbg() << "HtmlView: clicking on a link to " << link->href();
+ if (on_link_click)
+ on_link_click(link->href());
+ }
+ }
+ }
+ if (hovered_node_changed)
+ update();
+ event.accept();
+}
diff --git a/Libraries/LibHTML/HtmlView.h b/Libraries/LibHTML/HtmlView.h
index d7b9b6d668..8f62c3d8a6 100644
--- a/Libraries/LibHTML/HtmlView.h
+++ b/Libraries/LibHTML/HtmlView.h
@@ -12,12 +12,15 @@ public:
const Document* document() const { return m_document; }
void set_document(Document*);
+ Function on_link_click;
+
protected:
HtmlView(GWidget* parent = nullptr);
virtual void resize_event(GResizeEvent&) override;
virtual void paint_event(GPaintEvent&) override;
virtual void mousemove_event(GMouseEvent&) override;
+ virtual void mousedown_event(GMouseEvent&) override;
private:
void layout_and_sync_size();