LibWeb: Show pseudo-elements in DOM whose parent has no other children

If a DOM node is an element with pseudo-elements, but it has no child
DOM nodes and is not a shadow host, then the code that serializes its
pseudo-elements would get skipped, making them not show up in the
inspector.
This commit is contained in:
Sam Atkins 2024-08-06 14:28:36 +01:00 committed by Andreas Kling
parent 9738070676
commit 173daec9db
Notes: github-actions[bot] 2024-08-07 14:15:42 +00:00
3 changed files with 17 additions and 4 deletions

View file

@ -1141,6 +1141,17 @@ JS::GCPtr<Layout::NodeWithStyle> Element::get_pseudo_element_node(CSS::Selector:
return nullptr;
}
bool Element::has_pseudo_elements() const
{
if (m_pseudo_element_data) {
for (auto& pseudo_element : *m_pseudo_element_data) {
if (pseudo_element.layout_node)
return true;
}
}
return false;
}
void Element::clear_pseudo_element_nodes(Badge<Layout::TreeBuilder>)
{
if (m_pseudo_element_data) {

View file

@ -245,6 +245,7 @@ public:
void set_pseudo_element_node(Badge<Layout::TreeBuilder>, CSS::Selector::PseudoElement::Type, JS::GCPtr<Layout::NodeWithStyle>);
JS::GCPtr<Layout::NodeWithStyle> get_pseudo_element_node(CSS::Selector::PseudoElement::Type) const;
bool has_pseudo_elements() const;
void clear_pseudo_element_nodes(Badge<Layout::TreeBuilder>);
void serialize_pseudo_elements_as_json(JsonArraySerializer<StringBuilder>& children_array) const;

View file

@ -1362,7 +1362,10 @@ void Node::serialize_tree_as_json(JsonObjectSerializer<StringBuilder>& object) c
MUST((object.add("visible"sv, !!layout_node())));
if (has_child_nodes() || (is_element() && static_cast<DOM::Element const*>(this)->is_shadow_host())) {
auto const* element = is_element() ? static_cast<DOM::Element const*>(this) : nullptr;
if (has_child_nodes()
|| (element && (element->is_shadow_host() || element->has_pseudo_elements()))) {
auto children = MUST(object.add_array("children"sv));
auto add_child = [&children](DOM::Node const& child) {
if (child.is_uninteresting_whitespace_node())
@ -1374,9 +1377,7 @@ void Node::serialize_tree_as_json(JsonObjectSerializer<StringBuilder>& object) c
};
for_each_child(add_child);
if (is_element()) {
auto const* element = static_cast<DOM::Element const*>(this);
if (element) {
// Pseudo-elements don't have DOM nodes,so we have to add them separately.
element->serialize_pseudo_elements_as_json(children);