diff --git a/Libraries/LibHTML/DOM/Node.cpp b/Libraries/LibHTML/DOM/Node.cpp
index 0126f4c13d..d477cfd1a5 100644
--- a/Libraries/LibHTML/DOM/Node.cpp
+++ b/Libraries/LibHTML/DOM/Node.cpp
@@ -1,11 +1,12 @@
-#include
+#include
+#include
#include
#include
-#include
-#include
+#include
#include
#include
#include
+#include
#include
Node::Node(Document& document, NodeType type)
@@ -39,7 +40,6 @@ RefPtr Node::create_layout_node(const StyleResolver& resolver, const
ASSERT_NOT_REACHED();
}
-
RefPtr Node::create_layout_tree(const StyleResolver& resolver, const StyleProperties* parent_properties) const
{
auto layout_node = create_layout_node(resolver, parent_properties);
@@ -88,3 +88,19 @@ const HTMLElement* Node::enclosing_html_element() const
return static_cast(this);
return parent() ? parent()->enclosing_html_element() : nullptr;
}
+
+String Node::text_content() const
+{
+ Vector strings;
+ StringBuilder builder;
+ for (auto* child = first_child(); child; child = child->next_sibling()) {
+ auto text = child->text_content();
+ if (!text.is_empty()) {
+ builder.append(child->text_content());
+ builder.append(' ');
+ }
+ }
+ if (builder.length() > 1)
+ builder.trim(1);
+ return builder.to_string();
+}
diff --git a/Libraries/LibHTML/DOM/Node.h b/Libraries/LibHTML/DOM/Node.h
index 24bbf9f0ad..25659e5a29 100644
--- a/Libraries/LibHTML/DOM/Node.h
+++ b/Libraries/LibHTML/DOM/Node.h
@@ -36,6 +36,8 @@ public:
virtual String tag_name() const = 0;
+ virtual String text_content() const;
+
Document& document() { return m_document; }
const Document& document() const { return m_document; }
diff --git a/Libraries/LibHTML/DOM/Text.h b/Libraries/LibHTML/DOM/Text.h
index 79b3d6730d..adc5fcb265 100644
--- a/Libraries/LibHTML/DOM/Text.h
+++ b/Libraries/LibHTML/DOM/Text.h
@@ -12,6 +12,8 @@ public:
virtual String tag_name() const override { return "#text"; }
+ virtual String text_content() const override { return m_data; }
+
private:
String m_data;
};