From 4affe052b8e6a955e3c5ca06ea58accf985ae51e Mon Sep 17 00:00:00 2001 From: Adam Hodgen Date: Mon, 7 Jun 2021 16:32:24 +0100 Subject: [PATCH] LibWeb: Add JSON serialization method to DOM::Node This method builds a JSON object representing the full state of the DOM tree. The JSON that is built will be used for building the DOM Inspector widget for the OutOfProcessWebView. --- Userland/Libraries/LibWeb/DOM/Document.cpp | 10 +++++++ Userland/Libraries/LibWeb/DOM/Document.h | 2 ++ Userland/Libraries/LibWeb/DOM/Node.cpp | 32 ++++++++++++++++++++++ Userland/Libraries/LibWeb/DOM/Node.h | 4 +++ 4 files changed, 48 insertions(+) diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index a97d29207f..69c07deaae 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -934,4 +934,14 @@ void Document::set_cookie(String cookie_string, Cookie::Source source) page->client().page_did_set_cookie(m_url, cookie.value(), source); } +String Document::dump_dom_tree_as_json() const +{ + StringBuilder builder; + JsonObjectSerializer json(builder); + serialize_tree_as_json(json); + + json.finish(); + return builder.to_string(); +} + } diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index 74c184e032..0d9a999d1c 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -267,6 +267,8 @@ public: virtual EventTarget* get_parent(const Event&) override; + String dump_dom_tree_as_json() const; + private: explicit Document(const URL&); diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index ea0dea14dd..afd431d628 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -606,4 +606,36 @@ RefPtr Node::owner_document() const return m_document; } +void Node::serialize_tree_as_json(JsonObjectSerializer& object) const +{ + object.add("name", node_name().view()); + object.add("internal_id", (size_t)this); + if (is_document()) + object.add("type", "document"); + else if (is_element()) { + object.add("type", "element"); + + auto element = downcast(this); + if (element->has_attributes()) { + auto attributes = object.add_object("attributes"); + element->for_each_attribute([&attributes](auto& name, auto& value) { + attributes.add(name, value); + }); + } + } else if (is_text()) { + object.add("type", "text"); + + auto text_node = downcast(this); + object.add("text", text_node->data()); + } + + if (has_child_nodes()) { + auto children = object.add_array("children"); + for_each_child([&children](DOM::Node& child) { + JsonObjectSerializer child_object = children.add_object(); + child.serialize_tree_as_json(child_object); + }); + } +} + } diff --git a/Userland/Libraries/LibWeb/DOM/Node.h b/Userland/Libraries/LibWeb/DOM/Node.h index 4751a494f8..06c1e59b1c 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.h +++ b/Userland/Libraries/LibWeb/DOM/Node.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include #include @@ -162,6 +163,9 @@ public: bool is_host_including_inclusive_ancestor_of(const Node&) const; + // Used for dumping the DOM Tree + void serialize_tree_as_json(JsonObjectSerializer&) const; + protected: Node(Document&, NodeType);