Explorar el Código

LibWeb: Allow <svg> layout boxes to have children

We can't say that "no replaced boxes can have children", since that
breaks SVG. Instead, let each LayoutNode decide whether it's allowed
to have children.

Fixes #4223.
Andreas Kling hace 4 años
padre
commit
e424e4749f

+ 2 - 0
Libraries/LibWeb/Layout/Node.h

@@ -103,6 +103,8 @@ public:
     virtual bool is_list_item() const { return false; }
     virtual bool is_list_item() const { return false; }
     bool has_style() const { return m_has_style; }
     bool has_style() const { return m_has_style; }
 
 
+    virtual bool can_have_children() const { return true; }
+
     bool is_inline() const { return m_inline; }
     bool is_inline() const { return m_inline; }
     void set_inline(bool b) { m_inline = b; }
     void set_inline(bool b) { m_inline = b; }
 
 

+ 2 - 0
Libraries/LibWeb/Layout/ReplacedBox.h

@@ -62,6 +62,8 @@ public:
 
 
     virtual void prepare_for_replaced_layout() { }
     virtual void prepare_for_replaced_layout() { }
 
 
+    virtual bool can_have_children() const override { return false; }
+
 protected:
 protected:
     virtual void split_into_lines(Layout::BlockBox& container, LayoutMode) override;
     virtual void split_into_lines(Layout::BlockBox& container, LayoutMode) override;
 
 

+ 2 - 0
Libraries/LibWeb/Layout/SVGSVGBox.h

@@ -43,6 +43,8 @@ public:
     virtual void before_children_paint(PaintContext& context, PaintPhase phase) override;
     virtual void before_children_paint(PaintContext& context, PaintPhase phase) override;
     virtual void after_children_paint(PaintContext& context, PaintPhase phase) override;
     virtual void after_children_paint(PaintContext& context, PaintPhase phase) override;
 
 
+    virtual bool can_have_children() const override { return true; }
+
 private:
 private:
     const char* class_name() const override { return "SVGSVGBox"; }
     const char* class_name() const override { return "SVGSVGBox"; }
 };
 };

+ 1 - 5
Libraries/LibWeb/Layout/TreeBuilder.cpp

@@ -129,11 +129,7 @@ void TreeBuilder::create_layout_tree(DOM::Node& dom_node)
         }
         }
     }
     }
 
 
-    // Ignore fallback content inside replaced elements.
-    if (layout_node->is_replaced())
-        return;
-
-    if (dom_node.has_children()) {
+    if (dom_node.has_children() && layout_node->can_have_children()) {
         push_parent(*layout_node);
         push_parent(*layout_node);
         downcast<DOM::ParentNode>(dom_node).for_each_child([&](auto& dom_child) {
         downcast<DOM::ParentNode>(dom_node).for_each_child([&](auto& dom_child) {
             create_layout_tree(dom_child);
             create_layout_tree(dom_child);