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();