LibHTML: Detect hovering over links

HtmlView now calls Node::enclosing_link_element() to find the nearest
ancestor <a> element.

This patch also adds HTMLElement and HTMLAnchorElement.
This commit is contained in:
Andreas Kling 2019-09-29 11:59:38 +02:00
parent 88de955073
commit b477aff843
Notes: sideshowbarker 2024-07-19 11:53:50 +09:00
9 changed files with 60 additions and 0 deletions

View file

@ -0,0 +1,10 @@
#include <LibHTML/DOM/HTMLAnchorElement.h>
HTMLAnchorElement::HTMLAnchorElement(Document& document, const String& tag_name)
: HTMLElement(document, tag_name)
{
}
HTMLAnchorElement::~HTMLAnchorElement()
{
}

View file

@ -0,0 +1,11 @@
#pragma once
#include <LibHTML/DOM/HTMLElement.h>
class HTMLAnchorElement : public HTMLElement {
public:
HTMLAnchorElement(Document&, const String& tag_name);
virtual ~HTMLAnchorElement() override;
String href() const { return attribute("href"); }
};

View file

@ -0,0 +1,10 @@
#include <LibHTML/DOM/HTMLElement.h>
HTMLElement::HTMLElement(Document& document, const String& tag_name)
: Element(document, tag_name)
{
}
HTMLElement::~HTMLElement()
{
}

View file

@ -0,0 +1,9 @@
#pragma once
#include <LibHTML/DOM/Element.h>
class HTMLElement : public Element {
public:
HTMLElement(Document&, const String& tag_name);
virtual ~HTMLElement() override;
};

View file

@ -1,5 +1,6 @@
#include <LibHTML/DOM/Node.h>
#include <LibHTML/DOM/Element.h>
#include <LibHTML/DOM/HTMLAnchorElement.h>
#include <LibHTML/CSS/StyleResolver.h>
#include <LibHTML/Layout/LayoutNode.h>
#include <LibHTML/Layout/LayoutBlock.h>
@ -73,3 +74,10 @@ RefPtr<LayoutNode> Node::create_layout_tree(const StyleResolver& resolver, const
}
return layout_node;
}
const HTMLAnchorElement* Node::enclosing_link_element() const
{
if (is_element() && tag_name().to_lowercase() == "a")
return static_cast<const HTMLAnchorElement*>(this);
return parent() ? parent()->enclosing_link_element() : nullptr;
}

View file

@ -14,6 +14,7 @@ enum class NodeType : unsigned {
};
class Document;
class HTMLAnchorElement;
class ParentNode;
class LayoutNode;
class StyleResolver;
@ -37,6 +38,8 @@ public:
Document& document() { return m_document; }
const Document& document() const { return m_document; }
const HTMLAnchorElement* enclosing_link_element() const;
protected:
Node(Document&, NodeType);

View file

@ -1,6 +1,7 @@
#include <LibGUI/GPainter.h>
#include <LibGUI/GScrollBar.h>
#include <LibHTML/DOM/Element.h>
#include <LibHTML/DOM/HTMLAnchorElement.h>
#include <LibHTML/Dump.h>
#include <LibHTML/HtmlView.h>
#include <LibHTML/Layout/LayoutNode.h>
@ -93,6 +94,9 @@ void HtmlView::mousemove_event(GMouseEvent& event)
hovered_node_changed = node == m_document->hovered_node();
if (node) {
dbg() << "HtmlView: mousemove: " << node->tag_name() << "{" << node << "}";
if (auto* link = node->enclosing_link_element()) {
dbg() << "HtmlView: hovering over a link to " << link->href();
}
}
}
if (hovered_node_changed)

View file

@ -2,6 +2,8 @@ LIBHTML_OBJS = \
DOM/Node.o \
DOM/ParentNode.o \
DOM/Element.o \
DOM/HTMLElement.o \
DOM/HTMLAnchorElement.o \
DOM/Document.o \
DOM/Text.o \
CSS/Selector.o \

View file

@ -1,6 +1,7 @@
#include <AK/NonnullRefPtrVector.h>
#include <AK/StringBuilder.h>
#include <LibHTML/DOM/Element.h>
#include <LibHTML/DOM/HTMLAnchorElement.h>
#include <LibHTML/DOM/Text.h>
#include <LibHTML/Parser/HTMLParser.h>
#include <ctype.h>
@ -8,6 +9,8 @@
static NonnullRefPtr<Element> create_element(Document& document, const String& tag_name)
{
if (tag_name.to_lowercase() == "a")
return adopt(*new HTMLAnchorElement(document, tag_name));
return adopt(*new Element(document, tag_name));
}