Parcourir la source

LibWeb: Simplify construction of :before and :after pseudo elements

Let create_pseudo_element_if_needed() take care of inserting the pseudo
elements into the layout tree as well.
Andreas Kling il y a 2 ans
Parent
commit
1ab7a8e0db

+ 22 - 26
Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp

@@ -141,7 +141,7 @@ void TreeBuilder::insert_node_into_inline_or_block_ancestor(Layout::Node& node,
     }
 }
 
-RefPtr<Layout::Node> TreeBuilder::create_pseudo_element_if_needed(DOM::Element& element, CSS::Selector::PseudoElement pseudo_element)
+void TreeBuilder::create_pseudo_element_if_needed(DOM::Element& element, CSS::Selector::PseudoElement pseudo_element, AppendOrPrepend mode)
 {
     auto& document = element.document();
     auto& style_computer = document.style_computer();
@@ -154,25 +154,27 @@ RefPtr<Layout::Node> TreeBuilder::create_pseudo_element_if_needed(DOM::Element&
     if (pseudo_element_display.is_none()
         || pseudo_element_content.type == CSS::ContentData::Type::Normal
         || pseudo_element_content.type == CSS::ContentData::Type::None)
-        return nullptr;
-
-    if (auto pseudo_element_node = DOM::Element::create_layout_node_for_display_type(document, pseudo_element_display, move(pseudo_element_style), nullptr)) {
-        pseudo_element_node->set_generated(true);
-        // FIXME: Handle images, and multiple values
-        if (pseudo_element_content.type == CSS::ContentData::Type::String) {
-            auto* text = document.heap().allocate<DOM::Text>(document.realm(), document, pseudo_element_content.data);
-            auto text_node = adopt_ref(*new TextNode(document, *text));
-            push_parent(verify_cast<NodeWithStyle>(*pseudo_element_node));
-            insert_node_into_inline_or_block_ancestor(text_node, AppendOrPrepend::Append);
-            pop_parent();
-        } else {
-            TODO();
-        }
-        return pseudo_element_node.ptr();
+        return;
+
+    auto pseudo_element_node = DOM::Element::create_layout_node_for_display_type(document, pseudo_element_display, pseudo_element_style, nullptr);
+    if (!pseudo_element_node)
+        return;
+
+    pseudo_element_node->set_generated(true);
+    // FIXME: Handle images, and multiple values
+    if (pseudo_element_content.type == CSS::ContentData::Type::String) {
+        auto* text = document.heap().allocate<DOM::Text>(document.realm(), document, pseudo_element_content.data);
+        auto text_node = adopt_ref(*new TextNode(document, *text));
+        push_parent(verify_cast<NodeWithStyle>(*pseudo_element_node));
+        insert_node_into_inline_or_block_ancestor(text_node, AppendOrPrepend::Append);
+        pop_parent();
+    } else {
+        TODO();
     }
 
-    return nullptr;
-};
+    element.set_pseudo_element_node({}, CSS::Selector::PseudoElement::Before, pseudo_element_node);
+    insert_node_into_inline_or_block_ancestor(*pseudo_element_node, mode);
+}
 
 void TreeBuilder::create_layout_tree(DOM::Node& dom_node, TreeBuilder::Context& context)
 {
@@ -237,14 +239,8 @@ void TreeBuilder::create_layout_tree(DOM::Node& dom_node, TreeBuilder::Context&
     if (is<DOM::Element>(dom_node)) {
         auto& element = static_cast<DOM::Element&>(dom_node);
         push_parent(verify_cast<NodeWithStyle>(*layout_node));
-        if (auto before_node = create_pseudo_element_if_needed(element, CSS::Selector::PseudoElement::Before)) {
-            element.set_pseudo_element_node({}, CSS::Selector::PseudoElement::Before, before_node.ptr());
-            insert_node_into_inline_or_block_ancestor(*before_node, AppendOrPrepend::Prepend);
-        }
-        if (auto after_node = create_pseudo_element_if_needed(element, CSS::Selector::PseudoElement::After)) {
-            element.set_pseudo_element_node({}, CSS::Selector::PseudoElement::After, after_node.ptr());
-            insert_node_into_inline_or_block_ancestor(*after_node, AppendOrPrepend::Append);
-        }
+        create_pseudo_element_if_needed(element, CSS::Selector::PseudoElement::Before, AppendOrPrepend::Prepend);
+        create_pseudo_element_if_needed(element, CSS::Selector::PseudoElement::After, AppendOrPrepend::Append);
         pop_parent();
     }
 

+ 1 - 1
Userland/Libraries/LibWeb/Layout/TreeBuilder.h

@@ -45,7 +45,7 @@ private:
         Prepend,
     };
     void insert_node_into_inline_or_block_ancestor(Layout::Node&, AppendOrPrepend);
-    RefPtr<Layout::Node> create_pseudo_element_if_needed(DOM::Element&, CSS::Selector::PseudoElement);
+    void create_pseudo_element_if_needed(DOM::Element&, CSS::Selector::PseudoElement, AppendOrPrepend);
 
     RefPtr<Layout::Node> m_layout_root;
     Vector<Layout::NodeWithStyle&> m_ancestor_stack;