diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2022-03-03 17:50:12 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-03-10 17:30:09 +0100 |
commit | 6de2b62906f0357281206923357b15c90f7abdaf (patch) | |
tree | c6ed44dbb9b1f228488c7e81dd4098423290ec4a /Userland/Libraries/LibWeb/DOM | |
parent | 1c18bb13a27e686dd91627ce71c07ea3efa82ef7 (diff) | |
download | serenity-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.cpp | 30 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Element.h | 8 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Node.cpp | 7 |
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()); } } |