From 8257788a20daf223a047a0a7ba91e9dd30dc1399 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Thu, 10 Apr 2025 13:36:15 +0200 Subject: [PATCH] LibWeb: Ignore negative margins for margin box rect Negative margins are processed through the `offset` in layout state, and should not contribute to the margin box' rect's size or position. Fixes #4249. --- Libraries/LibWeb/Layout/FormattingContext.cpp | 8 ++++---- .../float-with-negative-margins.txt | 13 +++++++++++++ .../float-with-negative-margins.html | 13 +++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 Tests/LibWeb/Layout/expected/block-and-inline/float-with-negative-margins.txt create mode 100644 Tests/LibWeb/Layout/input/block-and-inline/float-with-negative-margins.html diff --git a/Libraries/LibWeb/Layout/FormattingContext.cpp b/Libraries/LibWeb/Layout/FormattingContext.cpp index 9424150d6a6..b7d3882890e 100644 --- a/Libraries/LibWeb/Layout/FormattingContext.cpp +++ b/Libraries/LibWeb/Layout/FormattingContext.cpp @@ -1828,12 +1828,12 @@ CSSPixels FormattingContext::box_baseline(Box const& box) const { return { { - -used_values.margin_box_left(), - -used_values.margin_box_top(), + -max(used_values.margin_box_left(), 0), + -max(used_values.margin_box_top(), 0), }, { - used_values.margin_box_left() + used_values.content_width() + used_values.margin_box_right(), - used_values.margin_box_top() + used_values.content_height() + used_values.margin_box_bottom(), + max(used_values.margin_box_left(), 0) + used_values.content_width() + max(used_values.margin_box_right(), 0), + max(used_values.margin_box_top(), 0) + used_values.content_height() + max(used_values.margin_box_bottom(), 0), }, }; } diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/float-with-negative-margins.txt b/Tests/LibWeb/Layout/expected/block-and-inline/float-with-negative-margins.txt new file mode 100644 index 00000000000..a7d359c32eb --- /dev/null +++ b/Tests/LibWeb/Layout/expected/block-and-inline/float-with-negative-margins.txt @@ -0,0 +1,13 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x48 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x0 children: inline + BlockContainer at (8,-2) content-size 50x50 floating [BFC] children: not-inline + TextNode <#text> + BlockContainer at (58,-2) content-size 50x50 floating [BFC] children: not-inline + TextNode <#text> + +ViewportPaintable (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x48] + PaintableWithLines (BlockContainer) [8,8 784x0] + PaintableWithLines (BlockContainer
.r) [8,-2 50x50] + PaintableWithLines (BlockContainer
.g) [58,-2 50x50] diff --git a/Tests/LibWeb/Layout/input/block-and-inline/float-with-negative-margins.html b/Tests/LibWeb/Layout/input/block-and-inline/float-with-negative-margins.html new file mode 100644 index 00000000000..53b5002a35a --- /dev/null +++ b/Tests/LibWeb/Layout/input/block-and-inline/float-with-negative-margins.html @@ -0,0 +1,13 @@ + + +
+