Browse Source

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.
Adam Hodgen 4 years ago
parent
commit
4affe052b8

+ 10 - 0
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();
+}
+
 }

+ 2 - 0
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&);
 

+ 32 - 0
Userland/Libraries/LibWeb/DOM/Node.cpp

@@ -606,4 +606,36 @@ RefPtr<Document> Node::owner_document() const
     return m_document;
 }
 
+void Node::serialize_tree_as_json(JsonObjectSerializer<StringBuilder>& 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<DOM::Element>(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<DOM::Text>(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<StringBuilder> child_object = children.add_object();
+            child.serialize_tree_as_json(child_object);
+        });
+    }
+}
+
 }

+ 4 - 0
Userland/Libraries/LibWeb/DOM/Node.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/Badge.h>
+#include <AK/JsonObjectSerializer.h>
 #include <AK/RefPtr.h>
 #include <AK/String.h>
 #include <AK/TypeCasts.h>
@@ -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<StringBuilder>&) const;
+
 protected:
     Node(Document&, NodeType);