Browse Source

LibWeb: Correctly determine whether a block has only inline children

There's more to life than inline-vs-block, so we have to take all the
non-block non-inline display types into account when computing whether
a block should say children_are_inline() == true.
Andreas Kling 5 years ago
parent
commit
e5ec05bd3a
1 changed files with 5 additions and 9 deletions
  1. 5 9
      Libraries/LibWeb/Layout/LayoutTreeBuilder.cpp

+ 5 - 9
Libraries/LibWeb/Layout/LayoutTreeBuilder.cpp

@@ -48,7 +48,7 @@ static RefPtr<LayoutNode> create_layout_tree(Node& node, const StyleProperties*
 
 
     NonnullRefPtrVector<LayoutNode> layout_children;
     NonnullRefPtrVector<LayoutNode> layout_children;
     bool have_inline_children = false;
     bool have_inline_children = false;
-    bool have_block_children = false;
+    bool have_noninline_children = false;
 
 
     to<ParentNode>(node).for_each_child([&](Node& child) {
     to<ParentNode>(node).for_each_child([&](Node& child) {
         auto layout_child = create_layout_tree(child, &layout_node->style());
         auto layout_child = create_layout_tree(child, &layout_node->style());
@@ -56,13 +56,13 @@ static RefPtr<LayoutNode> create_layout_tree(Node& node, const StyleProperties*
             return;
             return;
         if (layout_child->is_inline())
         if (layout_child->is_inline())
             have_inline_children = true;
             have_inline_children = true;
-        if (layout_child->is_block())
-            have_block_children = true;
+        else
+            have_noninline_children = true;
         layout_children.append(layout_child.release_nonnull());
         layout_children.append(layout_child.release_nonnull());
     });
     });
 
 
     for (auto& layout_child : layout_children) {
     for (auto& layout_child : layout_children) {
-        if (have_block_children && have_inline_children && layout_child.is_inline()) {
+        if (have_noninline_children && have_inline_children && layout_child.is_inline()) {
             if (is<LayoutText>(layout_child) && to<LayoutText>(layout_child).text_for_style(*parent_style) == " ")
             if (is<LayoutText>(layout_child) && to<LayoutText>(layout_child).text_for_style(*parent_style) == " ")
                 continue;
                 continue;
             layout_node->inline_wrapper().append_child(layout_child);
             layout_node->inline_wrapper().append_child(layout_child);
@@ -71,13 +71,9 @@ static RefPtr<LayoutNode> create_layout_tree(Node& node, const StyleProperties*
         }
         }
     }
     }
 
 
-    if (have_inline_children && !have_block_children)
+    if (have_inline_children && !have_noninline_children)
         layout_node->set_children_are_inline(true);
         layout_node->set_children_are_inline(true);
 
 
-    // FIXME: This is really hackish. Some layout nodes don't care about inline children.
-    if (is<LayoutTable>(layout_node))
-        layout_node->set_children_are_inline(false);
-
     return layout_node;
     return layout_node;
 }
 }