mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 13:18:13 +00:00
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:
parent
88de955073
commit
b477aff843
9 changed files with 60 additions and 0 deletions
10
Libraries/LibHTML/DOM/HTMLAnchorElement.cpp
Normal file
10
Libraries/LibHTML/DOM/HTMLAnchorElement.cpp
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#include <LibHTML/DOM/HTMLAnchorElement.h>
|
||||||
|
|
||||||
|
HTMLAnchorElement::HTMLAnchorElement(Document& document, const String& tag_name)
|
||||||
|
: HTMLElement(document, tag_name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HTMLAnchorElement::~HTMLAnchorElement()
|
||||||
|
{
|
||||||
|
}
|
11
Libraries/LibHTML/DOM/HTMLAnchorElement.h
Normal file
11
Libraries/LibHTML/DOM/HTMLAnchorElement.h
Normal 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"); }
|
||||||
|
};
|
10
Libraries/LibHTML/DOM/HTMLElement.cpp
Normal file
10
Libraries/LibHTML/DOM/HTMLElement.cpp
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#include <LibHTML/DOM/HTMLElement.h>
|
||||||
|
|
||||||
|
HTMLElement::HTMLElement(Document& document, const String& tag_name)
|
||||||
|
: Element(document, tag_name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HTMLElement::~HTMLElement()
|
||||||
|
{
|
||||||
|
}
|
9
Libraries/LibHTML/DOM/HTMLElement.h
Normal file
9
Libraries/LibHTML/DOM/HTMLElement.h
Normal 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;
|
||||||
|
};
|
|
@ -1,5 +1,6 @@
|
||||||
#include <LibHTML/DOM/Node.h>
|
#include <LibHTML/DOM/Node.h>
|
||||||
#include <LibHTML/DOM/Element.h>
|
#include <LibHTML/DOM/Element.h>
|
||||||
|
#include <LibHTML/DOM/HTMLAnchorElement.h>
|
||||||
#include <LibHTML/CSS/StyleResolver.h>
|
#include <LibHTML/CSS/StyleResolver.h>
|
||||||
#include <LibHTML/Layout/LayoutNode.h>
|
#include <LibHTML/Layout/LayoutNode.h>
|
||||||
#include <LibHTML/Layout/LayoutBlock.h>
|
#include <LibHTML/Layout/LayoutBlock.h>
|
||||||
|
@ -73,3 +74,10 @@ RefPtr<LayoutNode> Node::create_layout_tree(const StyleResolver& resolver, const
|
||||||
}
|
}
|
||||||
return layout_node;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ enum class NodeType : unsigned {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Document;
|
class Document;
|
||||||
|
class HTMLAnchorElement;
|
||||||
class ParentNode;
|
class ParentNode;
|
||||||
class LayoutNode;
|
class LayoutNode;
|
||||||
class StyleResolver;
|
class StyleResolver;
|
||||||
|
@ -37,6 +38,8 @@ public:
|
||||||
Document& document() { return m_document; }
|
Document& document() { return m_document; }
|
||||||
const Document& document() const { return m_document; }
|
const Document& document() const { return m_document; }
|
||||||
|
|
||||||
|
const HTMLAnchorElement* enclosing_link_element() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Node(Document&, NodeType);
|
Node(Document&, NodeType);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <LibGUI/GPainter.h>
|
#include <LibGUI/GPainter.h>
|
||||||
#include <LibGUI/GScrollBar.h>
|
#include <LibGUI/GScrollBar.h>
|
||||||
#include <LibHTML/DOM/Element.h>
|
#include <LibHTML/DOM/Element.h>
|
||||||
|
#include <LibHTML/DOM/HTMLAnchorElement.h>
|
||||||
#include <LibHTML/Dump.h>
|
#include <LibHTML/Dump.h>
|
||||||
#include <LibHTML/HtmlView.h>
|
#include <LibHTML/HtmlView.h>
|
||||||
#include <LibHTML/Layout/LayoutNode.h>
|
#include <LibHTML/Layout/LayoutNode.h>
|
||||||
|
@ -93,6 +94,9 @@ void HtmlView::mousemove_event(GMouseEvent& event)
|
||||||
hovered_node_changed = node == m_document->hovered_node();
|
hovered_node_changed = node == m_document->hovered_node();
|
||||||
if (node) {
|
if (node) {
|
||||||
dbg() << "HtmlView: mousemove: " << node->tag_name() << "{" << 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)
|
if (hovered_node_changed)
|
||||||
|
|
|
@ -2,6 +2,8 @@ LIBHTML_OBJS = \
|
||||||
DOM/Node.o \
|
DOM/Node.o \
|
||||||
DOM/ParentNode.o \
|
DOM/ParentNode.o \
|
||||||
DOM/Element.o \
|
DOM/Element.o \
|
||||||
|
DOM/HTMLElement.o \
|
||||||
|
DOM/HTMLAnchorElement.o \
|
||||||
DOM/Document.o \
|
DOM/Document.o \
|
||||||
DOM/Text.o \
|
DOM/Text.o \
|
||||||
CSS/Selector.o \
|
CSS/Selector.o \
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <AK/NonnullRefPtrVector.h>
|
#include <AK/NonnullRefPtrVector.h>
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
#include <LibHTML/DOM/Element.h>
|
#include <LibHTML/DOM/Element.h>
|
||||||
|
#include <LibHTML/DOM/HTMLAnchorElement.h>
|
||||||
#include <LibHTML/DOM/Text.h>
|
#include <LibHTML/DOM/Text.h>
|
||||||
#include <LibHTML/Parser/HTMLParser.h>
|
#include <LibHTML/Parser/HTMLParser.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
@ -8,6 +9,8 @@
|
||||||
|
|
||||||
static NonnullRefPtr<Element> create_element(Document& document, const String& tag_name)
|
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));
|
return adopt(*new Element(document, tag_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue