From 246dc983f6118c0a75c1299fd8d1cbb424dd345c Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Mon, 26 Jun 2023 01:57:21 +0200 Subject: [PATCH] Fix clearance on replaced elements --- components/layout_2020/flow/mod.rs | 9 +++-- tests/wpt/meta/MANIFEST.json | 29 ++++++++++++++++ .../clear-on-replaced-element.html | 34 +++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 tests/wpt/tests/css/CSS2/floats-clear/clear-on-replaced-element.html diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs index 9c4d9b562ee..03c50e5a807 100644 --- a/components/layout_2020/flow/mod.rs +++ b/components/layout_2020/flow/mod.rs @@ -733,10 +733,13 @@ fn layout_in_flow_replaced_block_level<'a>( let mut clearance = Length::zero(); if let Some(ref mut sequential_layout_state) = sequential_layout_state { + sequential_layout_state.adjoin_assign(&CollapsedMargin::new(margin.block_start)); sequential_layout_state.collapse_margins(); clearance = sequential_layout_state.calculate_clearance(ClearSide::from_style(style)); - sequential_layout_state - .advance_block_position(pbm.border.block_sum() + pbm.padding.block_sum() + size.block); + sequential_layout_state.advance_block_position( + pbm.border.block_sum() + pbm.padding.block_sum() + size.block + clearance, + ); + sequential_layout_state.adjoin_assign(&CollapsedMargin::new(margin.block_end)); }; let content_rect = Rect { @@ -756,7 +759,7 @@ fn layout_in_flow_replaced_block_level<'a>( pbm.padding, pbm.border, margin, - Length::zero(), + clearance, block_margins_collapsed_with_children, ) } diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index 7e58dc6fc77..c8a75b98977 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -61742,6 +61742,35 @@ {} ] ], + "clear-on-replaced-element.html": [ + "e5566b38326da17455d54c3d06d498f72bc4c693", + [ + null, + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 2 + ], + [ + 0, + 1500 + ] + ] + ] + ] + } + ] + ], "clear-with-top-margin-after-cleared-empty-block.html": [ "5d0fba7981f3f688b22442c1e8bef2ff8b146f5e", [ diff --git a/tests/wpt/tests/css/CSS2/floats-clear/clear-on-replaced-element.html b/tests/wpt/tests/css/CSS2/floats-clear/clear-on-replaced-element.html new file mode 100644 index 00000000000..e5566b38326 --- /dev/null +++ b/tests/wpt/tests/css/CSS2/floats-clear/clear-on-replaced-element.html @@ -0,0 +1,34 @@ + +Clear on block-level replaced element + + + + + + + +

Test passes if there is a filled green square and no red.

+
+
+ + +
+