Browse Source

LibWeb: Try to place out-of-flow blocks only in anonymous blocks

This change makes out-of-flow blocks to be considered for joining
only to anonymous blocks that have inline children. It finally
solved the problem that out-of-flow break anonymous blocks into
chunks causing wrong layout without regressing Acid2.
Aliaksandr Kalenik 2 years ago
parent
commit
0ca1af00e7
1 changed files with 6 additions and 3 deletions
  1. 6 3
      Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp

+ 6 - 3
Userland/Libraries/LibWeb/Layout/TreeBuilder.cpp

@@ -84,9 +84,7 @@ static Layout::Node& insertion_parent_for_block_node(Layout::NodeWithStyle& layo
         return layout_parent;
     }
 
-    // TODO: Floats should probably also be able to have inline siblings
-    if (layout_node.is_absolutely_positioned() && layout_parent.last_child()->children_are_inline()) {
-        // Block is out-of-flow, it can have inline siblings if necessary.
+    if ((layout_node.is_absolutely_positioned() || layout_node.is_floating()) && layout_parent.last_child()->children_are_inline() && layout_parent.last_child()->is_anonymous()) {
         return *layout_parent.last_child();
     }
 
@@ -95,6 +93,11 @@ static Layout::Node& insertion_parent_for_block_node(Layout::NodeWithStyle& layo
         return layout_parent;
     }
 
+    if (layout_node.is_absolutely_positioned() || layout_node.is_floating()) {
+        // Block is out-of-flow, it can have inline siblings if necessary.
+        return layout_parent;
+    }
+
     // Parent block has inline-level children (our siblings).
     // First move these siblings into an anonymous wrapper block.
     Vector<JS::Handle<Layout::Node>> children;