diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/float-vertical-intersection-with-margin.txt b/Tests/LibWeb/Layout/expected/block-and-inline/float-vertical-intersection-with-margin.txt
new file mode 100644
index 0000000000..58a6d9d0c7
--- /dev/null
+++ b/Tests/LibWeb/Layout/expected/block-and-inline/float-vertical-intersection-with-margin.txt
@@ -0,0 +1,26 @@
+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.9375 children: inline
+ line 0 width: 6.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 0, length: 1, rect: [108,8 6.34375x17.46875]
+ "1"
+ line 1 width: 8.8125, height: 17.46875, bottom: 34.9375, baseline: 13.53125
+ frag 0 from TextNode start: 0, length: 1, rect: [108,25.46875 8.8125x17.46875]
+ "2"
+ BlockContainer at (8,8) content-size 100x17.46875 floating [BFC] children: inline
+ line 0 width: 14.265625, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 0, length: 1, rect: [8,8 14.265625x17.46875]
+ "A"
+ TextNode <#text>
+ InlineNode
+ TextNode <#text>
+ TextNode <#text>
+ BreakNode
+ TextNode <#text>
+ BlockContainer at (8,25.46875) content-size 100x17.46875 floating [BFC] children: inline
+ line 0 width: 9.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 0, length: 1, rect: [8,25.46875 9.34375x17.46875]
+ "B"
+ TextNode <#text>
+ InlineNode
+ TextNode <#text>
diff --git a/Tests/LibWeb/Layout/input/block-and-inline/float-vertical-intersection-with-margin.html b/Tests/LibWeb/Layout/input/block-and-inline/float-vertical-intersection-with-margin.html
new file mode 100644
index 0000000000..5477d83127
--- /dev/null
+++ b/Tests/LibWeb/Layout/input/block-and-inline/float-vertical-intersection-with-margin.html
@@ -0,0 +1,15 @@
+
+
+A1
+
+B2
\ No newline at end of file
diff --git a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp
index 9d8d3f559f..3a30bfd92d 100644
--- a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp
+++ b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.cpp
@@ -752,7 +752,7 @@ CSSPixels BlockFormattingContext::BlockMarginState::current_collapsed_margin() c
return collapsed_margin;
}
-BlockFormattingContext::DidIntroduceClearance BlockFormattingContext::clear_floating_boxes(Box const& child_box)
+BlockFormattingContext::DidIntroduceClearance BlockFormattingContext::clear_floating_boxes(Node const& child_box)
{
auto const& computed_values = child_box.computed_values();
auto result = DidIntroduceClearance::No;
diff --git a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h
index 7f7ea6c549..c34639eade 100644
--- a/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h
+++ b/Userland/Libraries/LibWeb/Layout/BlockFormattingContext.h
@@ -54,6 +54,15 @@ public:
void resolve_vertical_box_model_metrics(Box const&);
+ enum class DidIntroduceClearance {
+ Yes,
+ No,
+ };
+
+ [[nodiscard]] DidIntroduceClearance clear_floating_boxes(Node const& child_box);
+
+ void reset_margin_state() { m_margin_state.reset(); }
+
private:
CSSPixels compute_auto_height_for_block_level_element(Box const&, AvailableSpace const&);
@@ -75,13 +84,6 @@ private:
void measure_scrollable_overflow(Box const&, CSSPixels& bottom_edge, CSSPixels& right_edge) const;
- enum class DidIntroduceClearance {
- Yes,
- No,
- };
-
- [[nodiscard]] DidIntroduceClearance clear_floating_boxes(Box const& child_box);
-
enum class FloatSide {
Left,
Right,
diff --git a/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp
index eee784a4f7..7641524a93 100644
--- a/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp
+++ b/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp
@@ -246,9 +246,15 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode)
continue;
switch (item.type) {
- case InlineLevelIterator::Item::Type::ForcedBreak:
+ case InlineLevelIterator::Item::Type::ForcedBreak: {
line_builder.break_line(LineBuilder::ForcedBreak::Yes);
+ if (item.node) {
+ auto introduce_clearance = parent().clear_floating_boxes(*item.node);
+ if (introduce_clearance == BlockFormattingContext::DidIntroduceClearance::Yes)
+ parent().reset_margin_state();
+ }
break;
+ }
case InlineLevelIterator::Item::Type::Element: {
auto& box = verify_cast(*item.node);
compute_inset(box);
diff --git a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp
index 3e85cb5d9d..2b6d95429e 100644
--- a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp
+++ b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp
@@ -187,9 +187,11 @@ Optional InlineLevelIterator::next(CSSPixels availabl
}
if (is(*m_current_node)) {
+ auto& node = *m_current_node;
skip_to_next();
return Item {
.type = Item::Type::ForcedBreak,
+ .node = &node,
};
}