summaryrefslogtreecommitdiff
path: root/Libraries
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-05-24 21:59:24 +0200
committerAndreas Kling <kling@serenityos.org>2020-05-24 23:54:22 +0200
commit128eaf929555a903abd407467b01ab228f876ae8 (patch)
tree2927c73b6ec846b76dda3719ba0aba367069ba6c /Libraries
parent6c409310a8615dfe8614386065d7e8975ac76499 (diff)
downloadserenity-128eaf929555a903abd407467b01ab228f876ae8.zip
LibWeb: Add some helpers to the DOM Node class
This patch adds the following things needed by the HTML spec: - Node::child_text_content() - Node::is_connected() - Node::root()
Diffstat (limited to 'Libraries')
-rw-r--r--Libraries/LibWeb/DOM/Node.cpp26
-rw-r--r--Libraries/LibWeb/DOM/Node.h5
2 files changed, 31 insertions, 0 deletions
diff --git a/Libraries/LibWeb/DOM/Node.cpp b/Libraries/LibWeb/DOM/Node.cpp
index a7f1871322..778a1cf00c 100644
--- a/Libraries/LibWeb/DOM/Node.cpp
+++ b/Libraries/LibWeb/DOM/Node.cpp
@@ -155,4 +155,30 @@ void Node::dispatch_event(NonnullRefPtr<Event> event)
parent()->dispatch_event(move(event));
}
+String Node::child_text_content() const
+{
+ if (!is<ParentNode>(*this))
+ return String::empty();
+
+ StringBuilder builder;
+ to<ParentNode>(*this).for_each_child([&](auto& child) {
+ if (is<Text>(child))
+ builder.append(to<Text>(child).text_content());
+ });
+ return builder.build();
+}
+
+const Node* Node::root() const
+{
+ const Node* root = this;
+ while (root->parent())
+ root = root->parent();
+ return root;
+}
+
+bool Node::is_connected() const
+{
+ return root() && root()->is_document();
+}
+
}
diff --git a/Libraries/LibWeb/DOM/Node.h b/Libraries/LibWeb/DOM/Node.h
index 479ec8960f..771a87f78d 100644
--- a/Libraries/LibWeb/DOM/Node.h
+++ b/Libraries/LibWeb/DOM/Node.h
@@ -94,8 +94,13 @@ public:
const HTMLAnchorElement* enclosing_link_element() const;
const HTMLElement* enclosing_html_element() const;
+ String child_text_content() const;
+
virtual bool is_html_element() const { return false; }
+ const Node* root() const;
+ bool is_connected() const;
+
template<typename T>
const T* first_child_of_type() const;