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, }; }