summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/DOM
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2022-03-03 17:50:12 +0000
committerAndreas Kling <kling@serenityos.org>2022-03-10 17:30:09 +0100
commit6de2b62906f0357281206923357b15c90f7abdaf (patch)
treec6ed44dbb9b1f228488c7e81dd4098423290ec4a /Userland/Libraries/LibWeb/DOM
parent1c18bb13a27e686dd91627ce71c07ea3efa82ef7 (diff)
downloadserenity-6de2b62906f0357281206923357b15c90f7abdaf.zip
LibWeb: Display pseudo-elements in the DOM inspector
This patch only makes them appear in the tree - they are not yet inspectable themselves.
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM')
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.cpp30
-rw-r--r--Userland/Libraries/LibWeb/DOM/Element.h8
-rw-r--r--Userland/Libraries/LibWeb/DOM/Node.cpp7
3 files changed, 45 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp
index a103027997..7d40221d17 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Element.cpp
@@ -501,4 +501,34 @@ void Element::children_changed()
set_needs_style_update(true);
}
+void Element::set_pseudo_element_node(Badge<Layout::TreeBuilder>, CSS::Selector::PseudoElement pseudo_element, RefPtr<Layout::Node> pseudo_element_node)
+{
+ m_pseudo_element_nodes[to_underlying(pseudo_element)] = move(pseudo_element_node);
+}
+
+RefPtr<Layout::Node> Element::get_pseudo_element_node(CSS::Selector::PseudoElement pseudo_element) const
+{
+ return m_pseudo_element_nodes[to_underlying(pseudo_element)];
+}
+
+void Element::clear_pseudo_element_nodes(Badge<Layout::TreeBuilder>)
+{
+ m_pseudo_element_nodes.fill(nullptr);
+}
+
+void Element::serialize_pseudo_elements_as_json(JsonArraySerializer<StringBuilder>& children_array) const
+{
+ for (size_t i = 0; i < m_pseudo_element_nodes.size(); ++i) {
+ auto& pseudo_element_node = m_pseudo_element_nodes[i];
+ if (!pseudo_element_node)
+ continue;
+ auto object = MUST(children_array.add_object());
+ MUST(object.add("name", String::formatted("::{}", CSS::pseudo_element_name(static_cast<CSS::Selector::PseudoElement>(i)))));
+ MUST(object.add("type", "pseudo-element"));
+ MUST(object.add("parent-id", id()));
+ MUST(object.add("pseudo-element", i));
+ MUST(object.finish());
+ }
+}
+
}
diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h
index 94cc4d7cf8..7c0914aeff 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.h
+++ b/Userland/Libraries/LibWeb/DOM/Element.h
@@ -21,6 +21,7 @@
#include <LibWeb/HTML/EventLoop/Task.h>
#include <LibWeb/HTML/TagNames.h>
#include <LibWeb/Layout/Node.h>
+#include <LibWeb/Layout/TreeBuilder.h>
namespace Web::DOM {
@@ -131,6 +132,11 @@ public:
static RefPtr<Layout::Node> create_layout_node_for_display_type(DOM::Document&, CSS::Display const&, NonnullRefPtr<CSS::StyleProperties>, Element*);
+ void set_pseudo_element_node(Badge<Layout::TreeBuilder>, CSS::Selector::PseudoElement, RefPtr<Layout::Node>);
+ RefPtr<Layout::Node> get_pseudo_element_node(CSS::Selector::PseudoElement) const;
+ void clear_pseudo_element_nodes(Badge<Layout::TreeBuilder>);
+ void serialize_pseudo_elements_as_json(JsonArraySerializer<StringBuilder>& children_array) const;
+
protected:
virtual void children_changed() override;
@@ -150,6 +156,8 @@ private:
Vector<FlyString> m_classes;
RefPtr<ShadowRoot> m_shadow_root;
+
+ Array<RefPtr<Layout::Node>, CSS::Selector::PseudoElementCount> m_pseudo_element_nodes;
};
template<>
diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp
index acfcaca045..1b52e3199e 100644
--- a/Userland/Libraries/LibWeb/DOM/Node.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Node.cpp
@@ -776,6 +776,13 @@ void Node::serialize_tree_as_json(JsonObjectSerializer<StringBuilder>& object) c
child.serialize_tree_as_json(child_object);
MUST(child_object.finish());
});
+
+ // Pseudo-elements don't have DOM nodes,so we have to add them separately.
+ if (is_element()) {
+ auto const* element = static_cast<DOM::Element const*>(this);
+ element->serialize_pseudo_elements_as_json(children);
+ }
+
MUST(children.finish());
}
}