mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-20 19:45:12 +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
Notes:
sideshowbarker
2024-07-19 11:53:50 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/b477aff843d
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/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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue