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.
This commit is contained in:
Adam Hodgen 2021-06-07 16:32:24 +01:00 committed by Andreas Kling
parent f4eab69785
commit 4affe052b8
Notes: sideshowbarker 2024-07-18 11:15:39 +09:00
4 changed files with 48 additions and 0 deletions

View file

@ -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();
}
}

View file

@ -267,6 +267,8 @@ public:
virtual EventTarget* get_parent(const Event&) override;
String dump_dom_tree_as_json() const;
private:
explicit Document(const URL&);

View file

@ -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);
});
}
}
}

View file

@ -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);