diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-1.txt b/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-1.txt
index c1ed8ecd0c..3880462df2 100644
--- a/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-1.txt
+++ b/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-1.txt
@@ -5,65 +5,63 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
TextNode <#text>
BlockContainer
at (9,9) content-size 300x250 children: inline
line 0 width: 239.15625, height: 16, bottom: 16, baseline: 12.796875
- frag 0 from TextNode start: 1, length: 24, rect: [60,9 212x16]
+ frag 0 from TextNode start: 1, length: 24, rect: [61,9 212x16]
"foo bar baz foo bar baz "
- frag 1 from TextNode start: 1, length: 3, rect: [272,9 27.15625x16]
+ frag 1 from TextNode start: 1, length: 3, rect: [273,9 27.15625x16]
"foo"
line 1 width: 27.640625, height: 16, bottom: 32, baseline: 12.796875
- frag 0 from TextNode start: 5, length: 3, rect: [262,25 27.640625x16]
+ frag 0 from TextNode start: 5, length: 3, rect: [263,25 27.640625x16]
"bar"
line 2 width: 27.203125, height: 16, bottom: 48, baseline: 12.796875
- frag 0 from TextNode start: 9, length: 3, rect: [262,41 27.203125x16]
+ frag 0 from TextNode start: 9, length: 3, rect: [263,41 27.203125x16]
"baz"
line 3 width: 27.15625, height: 16, bottom: 64, baseline: 12.796875
- frag 0 from TextNode start: 13, length: 3, rect: [262,57 27.15625x16]
+ frag 0 from TextNode start: 13, length: 3, rect: [263,57 27.15625x16]
"foo"
line 4 width: 0, height: 0, bottom: 0, baseline: 0
- line 5 width: 98, height: 16, bottom: 84, baseline: 12.796875
- frag 0 from TextNode start: 17, length: 11, rect: [9,77 98x16]
- "bar baz foo"
- line 6 width: 98, height: 16, bottom: 100, baseline: 12.796875
- frag 0 from TextNode start: 29, length: 11, rect: [9,93 98x16]
- "bar baz foo"
- line 7 width: 98, height: 16, bottom: 116, baseline: 12.796875
- frag 0 from TextNode start: 41, length: 8, rect: [9,109 70.84375x16]
- "bar baz "
- frag 1 from TextNode start: 1, length: 3, rect: [80,109 27.15625x16]
- "foo"
- line 8 width: 62.84375, height: 16, bottom: 132, baseline: 12.796875
- frag 0 from TextNode start: 5, length: 7, rect: [9,125 62.84375x16]
+ line 5 width: 62.84375, height: 16, bottom: 84, baseline: 12.796875
+ frag 0 from TextNode start: 17, length: 7, rect: [9,77 62.84375x16]
"bar baz"
- line 9 width: 62.796875, height: 16, bottom: 148, baseline: 12.796875
- frag 0 from TextNode start: 13, length: 7, rect: [9,141 62.796875x16]
+ line 6 width: 62.796875, height: 16, bottom: 100, baseline: 12.796875
+ frag 0 from TextNode start: 25, length: 7, rect: [9,93 62.796875x16]
"foo bar"
- line 10 width: 274.359375, height: 16, bottom: 164, baseline: 12.796875
- frag 0 from TextNode start: 21, length: 31, rect: [9,157 274.359375x16]
- "baz foo bar baz foo bar baz foo"
- line 11 width: 239.640625, height: 16, bottom: 180, baseline: 12.796875
- frag 0 from TextNode start: 53, length: 20, rect: [60,173 176.84375x16]
- "bar baz foo bar baz "
- frag 1 from TextNode start: 1, length: 7, rect: [237,173 62.796875x16]
- "foo bar"
- line 12 width: 204, height: 16, bottom: 196, baseline: 12.796875
- frag 0 from TextNode start: 9, length: 16, rect: [60,189 141.203125x16]
+ line 7 width: 62.359375, height: 16, bottom: 116, baseline: 12.796875
+ frag 0 from TextNode start: 33, length: 7, rect: [9,109 62.359375x16]
+ "baz foo"
+ line 8 width: 62.84375, height: 16, bottom: 132, baseline: 12.796875
+ frag 0 from TextNode start: 41, length: 7, rect: [9,125 62.84375x16]
+ "bar baz"
+ line 9 width: 239.15625, height: 16, bottom: 148, baseline: 12.796875
+ frag 0 from TextNode start: 1, length: 27, rect: [9,141 239.15625x16]
+ "foo bar baz foo bar baz foo"
+ line 10 width: 239.640625, height: 16, bottom: 164, baseline: 12.796875
+ frag 0 from TextNode start: 29, length: 27, rect: [9,157 239.640625x16]
+ "bar baz foo bar baz foo bar"
+ line 11 width: 239.203125, height: 16, bottom: 180, baseline: 12.796875
+ frag 0 from TextNode start: 57, length: 16, rect: [61,173 141.203125x16]
"baz foo bar baz "
- frag 1 from TextNode start: 1, length: 7, rect: [201,189 62.796875x16]
- "foo bar"
+ frag 1 from TextNode start: 1, length: 11, rect: [202,173 98x16]
+ "foo bar baz"
+ line 12 width: 204, height: 16, bottom: 196, baseline: 12.796875
+ frag 0 from TextNode start: 13, length: 12, rect: [61,189 106x16]
+ "foo bar baz "
+ frag 1 from TextNode start: 1, length: 11, rect: [167,189 98x16]
+ "foo bar baz"
line 13 width: 204, height: 16, bottom: 212, baseline: 12.796875
- frag 0 from TextNode start: 9, length: 23, rect: [60,205 204x16]
- "baz foo bar baz foo bar"
- line 14 width: 239.203125, height: 16, bottom: 228, baseline: 12.796875
- frag 0 from TextNode start: 33, length: 27, rect: [60,221 239.203125x16]
- "baz foo bar baz foo bar baz"
- line 15 width: 274.796875, height: 16, bottom: 244, baseline: 12.796875
- frag 0 from TextNode start: 61, length: 31, rect: [9,237 274.796875x16]
+ frag 0 from TextNode start: 13, length: 23, rect: [61,205 204x16]
+ "foo bar baz foo bar baz"
+ line 14 width: 239.15625, height: 16, bottom: 228, baseline: 12.796875
+ frag 0 from TextNode start: 37, length: 27, rect: [61,221 239.15625x16]
+ "foo bar baz foo bar baz foo"
+ line 15 width: 274.84375, height: 16, bottom: 244, baseline: 12.796875
+ frag 0 from TextNode start: 65, length: 31, rect: [9,237 274.84375x16]
+ "bar baz foo bar baz foo bar baz"
+ line 16 width: 274.796875, height: 16, bottom: 260, baseline: 12.796875
+ frag 0 from TextNode start: 97, length: 31, rect: [9,253 274.796875x16]
"foo bar baz foo bar baz foo bar"
- line 16 width: 274.359375, height: 16, bottom: 260, baseline: 12.796875
- frag 0 from TextNode start: 93, length: 31, rect: [9,253 274.359375x16]
- "baz foo bar baz foo bar baz foo"
- line 17 width: 168.84375, height: 16, bottom: 276, baseline: 12.796875
- frag 0 from TextNode start: 125, length: 19, rect: [9,269 168.84375x16]
- "bar baz foo bar baz"
+ line 17 width: 133.203125, height: 16, bottom: 276, baseline: 12.796875
+ frag 0 from TextNode start: 129, length: 15, rect: [9,269 133.203125x16]
+ "baz foo bar baz"
TextNode <#text>
BlockContainer at (10,10) content-size 50x50 floating [BFC] children: not-inline
TextNode <#text>
@@ -71,7 +69,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
TextNode <#text>
BlockContainer at (108,78) content-size 200x50 floating [BFC] children: not-inline
TextNode <#text>
- BlockContainer at (76,126) content-size 30x30 floating [BFC] children: not-inline
+ BlockContainer at (278,142) content-size 30x30 floating [BFC] children: not-inline
TextNode <#text>
BlockContainer at (10,174) content-size 50x50 floating [BFC] children: not-inline
TextNode <#text>
diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-3.txt b/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-3.txt
index 86c2821ed3..db2dc0cbe3 100644
--- a/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-3.txt
+++ b/Tests/LibWeb/Layout/expected/block-and-inline/float-stress-3.txt
@@ -5,7 +5,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
TextNode <#text>
BlockContainer at (9,9) content-size 300x250 children: inline
line 0 width: 204, height: 16, bottom: 16, baseline: 12.796875
- frag 0 from TextNode start: 1, length: 23, rect: [60,9 204x16]
+ frag 0 from TextNode start: 1, length: 23, rect: [61,9 204x16]
"foo bar baz foo bar baz"
TextNode <#text>
BlockContainer at (10,10) content-size 50x50 floating [BFC] children: not-inline
diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/floats-and-negative-margins.txt b/Tests/LibWeb/Layout/expected/block-and-inline/floats-and-negative-margins.txt
new file mode 100644
index 0000000000..667aeda504
--- /dev/null
+++ b/Tests/LibWeb/Layout/expected/block-and-inline/floats-and-negative-margins.txt
@@ -0,0 +1,16 @@
+Viewport <#document> at (0,0) content-size 800x600 children: not-inline
+ BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline
+ BlockContainer at (100,8) content-size 200x200 children: not-inline
+ BlockContainer at (50,8) content-size 250x200 children: inline
+ BlockContainer at (50,8) content-size 125x17.46875 floating [BFC] children: inline
+ line 0 width: 9.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 1, length: 1, rect: [50,8 9.34375x17.46875]
+ "a"
+ TextNode <#text>
+ TextNode <#text>
+ BlockContainer at (175,8) content-size 125x17.46875 floating [BFC] children: inline
+ line 0 width: 9.46875, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 1, length: 1, rect: [175,8 9.46875x17.46875]
+ "b"
+ TextNode <#text>
+ TextNode <#text>
diff --git a/Tests/LibWeb/Layout/input/block-and-inline/floats-and-negative-margins.html b/Tests/LibWeb/Layout/input/block-and-inline/floats-and-negative-margins.html
new file mode 100644
index 0000000000..ab53a9a236
--- /dev/null
+++ b/Tests/LibWeb/Layout/input/block-and-inline/floats-and-negative-margins.html
@@ -0,0 +1,20 @@
+
\ No newline at end of file
diff --git a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp
index a335d8999a..b5ac2bfaff 100644
--- a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp
+++ b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp
@@ -1011,7 +1011,7 @@ BlockFormattingContext::SpaceUsedByFloats BlockFormattingContext::space_used_by_
CSSPixels offset_from_containing_block_chain_margins_between_here_and_root = 0;
for (auto const* containing_block = floating_box.box->containing_block(); containing_block && containing_block != &root(); containing_block = containing_block->containing_block()) {
auto const& containing_block_state = m_state.get(*containing_block);
- offset_from_containing_block_chain_margins_between_here_and_root = max(offset_from_containing_block_chain_margins_between_here_and_root, containing_block_state.margin_box_left());
+ offset_from_containing_block_chain_margins_between_here_and_root += containing_block_state.margin_box_left();
}
space_used_by_floats.left = offset_from_containing_block_chain_margins_between_here_and_root
+ floating_box.offset_from_edge
@@ -1030,7 +1030,7 @@ BlockFormattingContext::SpaceUsedByFloats BlockFormattingContext::space_used_by_
CSSPixels offset_from_containing_block_chain_margins_between_here_and_root = 0;
for (auto const* containing_block = floating_box.box->containing_block(); containing_block && containing_block != &root(); containing_block = containing_block->containing_block()) {
auto const& containing_block_state = m_state.get(*containing_block);
- offset_from_containing_block_chain_margins_between_here_and_root = max(offset_from_containing_block_chain_margins_between_here_and_root, containing_block_state.margin_box_right());
+ offset_from_containing_block_chain_margins_between_here_and_root += containing_block_state.margin_box_right();
}
space_used_by_floats.right = offset_from_containing_block_chain_margins_between_here_and_root
+ floating_box.offset_from_edge