From 9dcc505e46aaa8238a61841e850cbe5840d06e5e Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Thu, 27 Mar 2025 11:34:20 +0000 Subject: [PATCH] LibWeb: Apply vertical clearance to next line after
with `clear:` We were introducing a line break and applying vertical clearance to the inline formatting context, but that vertical clearance only applied to new floating boxes. We should move the current block offset to the vertical clearance to make sure the next line box starts beyond the cleared floats. There was a layout test for `
` with `clear: ..` set, but that test did not actually do anything - removing the `clear` property would result in the same layout. Replace that test with something that actually tests float clearing. Relates to #4058. --- .../LibWeb/Layout/InlineFormattingContext.cpp | 9 ++--- Libraries/LibWeb/Layout/LineBox.cpp | 1 - .../float-clear-by-line-break.txt | 39 +++++-------------- .../float-clear-by-line-break.html | 21 +++++----- 4 files changed, 25 insertions(+), 45 deletions(-) diff --git a/Libraries/LibWeb/Layout/InlineFormattingContext.cpp b/Libraries/LibWeb/Layout/InlineFormattingContext.cpp index 9b772f2ffe9..c988b6811a0 100644 --- a/Libraries/LibWeb/Layout/InlineFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/InlineFormattingContext.cpp @@ -13,8 +13,6 @@ #include #include #include -#include -#include namespace Web::Layout { @@ -285,8 +283,10 @@ void InlineFormattingContext::generate_line_boxes() line_builder.break_line(LineBuilder::ForcedBreak::Yes); if (item.node) { auto introduce_clearance = parent().clear_floating_boxes(*item.node, *this); - if (introduce_clearance == BlockFormattingContext::DidIntroduceClearance::Yes) + if (introduce_clearance == BlockFormattingContext::DidIntroduceClearance::Yes) { + line_builder.set_current_block_offset(vertical_float_clearance()); parent().reset_margin_state(); + } } break; } @@ -392,9 +392,8 @@ void InlineFormattingContext::generate_line_boxes() } } - for (auto& line_box : line_boxes) { + for (auto& line_box : line_boxes) line_box.trim_trailing_whitespace(); - } line_builder.remove_last_line_if_empty(); diff --git a/Libraries/LibWeb/Layout/LineBox.cpp b/Libraries/LibWeb/Layout/LineBox.cpp index 84467e40c63..b7062b5d71e 100644 --- a/Libraries/LibWeb/Layout/LineBox.cpp +++ b/Libraries/LibWeb/Layout/LineBox.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/float-clear-by-line-break.txt b/Tests/LibWeb/Layout/expected/block-and-inline/float-clear-by-line-break.txt index 2a0949a8709..d463537b824 100644 --- a/Tests/LibWeb/Layout/expected/block-and-inline/float-clear-by-line-break.txt +++ b/Tests/LibWeb/Layout/expected/block-and-inline/float-clear-by-line-break.txt @@ -1,34 +1,15 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline - BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline - BlockContainer at (8,8) content-size 784x34 children: inline - BlockContainer at (8,8) content-size 100x17 floating [BFC] children: inline - frag 0 from TextNode start: 0, length: 1, rect: [8,8 14.265625x17] baseline: 13.296875 - "A" - TextNode <#text> - InlineNode - frag 0 from TextNode start: 0, length: 1, rect: [108,8 6.34375x17] baseline: 13.296875 - "1" - TextNode <#text> + BlockContainer at (0,0) content-size 800x133 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x117 children: inline + frag 0 from TextNode start: 1, length: 3, rect: [8,108 27.15625x17] baseline: 13.296875 + "foo" + BlockContainer at (8,8) content-size 100x100 floating [BFC] children: not-inline TextNode <#text> - BreakNode
+ BreakNode TextNode <#text> - BlockContainer at (8,25) content-size 100x17 floating [BFC] children: inline - frag 0 from TextNode start: 0, length: 1, rect: [8,25 9.34375x17] baseline: 13.296875 - "B" - TextNode <#text> - InlineNode - frag 0 from TextNode start: 0, length: 1, rect: [108,25 8.8125x17] baseline: 13.296875 - "2" - TextNode <#text> ViewportPaintable (Viewport<#document>) [0,0 800x600] - PaintableWithLines (BlockContainer) [0,0 800x600] - PaintableWithLines (BlockContainer) [8,8 784x34] - PaintableWithLines (BlockContainer.a) [8,8 100x17] - TextPaintable (TextNode<#text>) - PaintableWithLines (InlineNode) - TextPaintable (TextNode<#text>) - PaintableWithLines (BlockContainer.a) [8,25 100x17] - TextPaintable (TextNode<#text>) - PaintableWithLines (InlineNode) - TextPaintable (TextNode<#text>) + PaintableWithLines (BlockContainer) [0,0 800x133] + PaintableWithLines (BlockContainer) [8,8 784x117] + PaintableWithLines (BlockContainer
.a) [8,8 100x100] + TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/input/block-and-inline/float-clear-by-line-break.html b/Tests/LibWeb/Layout/input/block-and-inline/float-clear-by-line-break.html index c9eb70f2a16..c949f7c549e 100644 --- a/Tests/LibWeb/Layout/input/block-and-inline/float-clear-by-line-break.html +++ b/Tests/LibWeb/Layout/input/block-and-inline/float-clear-by-line-break.html @@ -1,14 +1,15 @@ + - -A1 -
-B2 \ No newline at end of file +
+
+foo