From b6732240c7e981ee1708813ee4e741062d1b5ebe Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Mon, 28 Jul 2025 01:30:20 +0200 Subject: [PATCH] LibWeb: Avoid float intrusions for BFCs, FFCs and GFCs We were only avoiding float intrusions for BFCs, but FFCs and GFCs should also accommodate for any floats present. Work towards #4136. --- .../LibWeb/Layout/BlockFormattingContext.cpp | 2 +- .../flex-container-avoids-float-intrusions.txt | 17 +++++++++++++++++ .../flex-container-avoids-float-intrusions.html | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Layout/expected/flex/flex-container-avoids-float-intrusions.txt create mode 100644 Tests/LibWeb/Layout/input/flex/flex-container-avoids-float-intrusions.html diff --git a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp index 72ab12eedb..021af77012 100644 --- a/Libraries/LibWeb/Layout/BlockFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/BlockFormattingContext.cpp @@ -968,7 +968,7 @@ void BlockFormattingContext::place_block_level_element_in_normal_flow_horizontal CSSPixels available_width_within_containing_block = available_space.width.to_px_or_zero(); if ((!m_left_floats.current_boxes.is_empty() || !m_right_floats.current_boxes.is_empty()) - && creates_block_formatting_context(child_box)) { + && box_should_avoid_floats_because_it_establishes_fc(child_box)) { auto box_in_root_rect = content_box_rect_in_ancestor_coordinate_space(box_state, root()); auto space_and_containing_margin = space_used_and_containing_margin_for_floats(box_in_root_rect.y()); available_width_within_containing_block -= space_and_containing_margin.left_used_space + space_and_containing_margin.right_used_space; diff --git a/Tests/LibWeb/Layout/expected/flex/flex-container-avoids-float-intrusions.txt b/Tests/LibWeb/Layout/expected/flex/flex-container-avoids-float-intrusions.txt new file mode 100644 index 0000000000..387dfc9ce4 --- /dev/null +++ b/Tests/LibWeb/Layout/expected/flex/flex-container-avoids-float-intrusions.txt @@ -0,0 +1,17 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x108 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x50 children: not-inline + BlockContainer at (8,8) content-size 100x100 floating [BFC] children: not-inline + Box at (108,8) content-size 684x50 flex-container(row) [FFC] children: not-inline + BlockContainer <(anonymous)> at (8,58) content-size 784x0 children: inline + TextNode <#text> + +ViewportPaintable (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x108] + PaintableWithLines (BlockContainer) [8,8 784x50] overflow: [8,8 784x100] + PaintableWithLines (BlockContainer
#a) [8,8 100x100] + PaintableBox (Box
#b) [108,8 684x50] + PaintableWithLines (BlockContainer(anonymous)) [8,58 784x0] + +SC for Viewport<#document> [0,0 800x600] [children: 1] (z-index: auto) + SC for BlockContainer [0,0 800x108] [children: 0] (z-index: auto) diff --git a/Tests/LibWeb/Layout/input/flex/flex-container-avoids-float-intrusions.html b/Tests/LibWeb/Layout/input/flex/flex-container-avoids-float-intrusions.html new file mode 100644 index 0000000000..ee00fdf9ab --- /dev/null +++ b/Tests/LibWeb/Layout/input/flex/flex-container-avoids-float-intrusions.html @@ -0,0 +1,14 @@ + +