From 1dbd74f3899ff0469472e687ecc763e116247e6e Mon Sep 17 00:00:00 2001 From: Pu Xingyu Date: Sat, 27 May 2023 09:03:40 +0800 Subject: [PATCH 1/3] layout_2020: Add an optional box size parameter to ReplacedContent::used_size_as_if_inline_element This allow us to specify the used size when calculating size of replaced content. --- components/layout_2020/flexbox/layout.rs | 1 + components/layout_2020/flow/inline.rs | 1 + components/layout_2020/flow/mod.rs | 2 +- components/layout_2020/positioned.rs | 1 + components/layout_2020/replaced.rs | 3 ++- 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs index a7a2875a703..caf88955a60 100644 --- a/components/layout_2020/flexbox/layout.rs +++ b/components/layout_2020/flexbox/layout.rs @@ -1006,6 +1006,7 @@ impl<'a> FlexItem<'a> { let size = replaced.contents.used_size_as_if_inline_element( flex_context.containing_block, &replaced.style, + None, &pbm, ); let cross_size = flex_context.vec2_to_flex_relative(size.clone()).cross; diff --git a/components/layout_2020/flow/inline.rs b/components/layout_2020/flow/inline.rs index 740c34cf7c0..df96d0bbd4e 100644 --- a/components/layout_2020/flow/inline.rs +++ b/components/layout_2020/flow/inline.rs @@ -573,6 +573,7 @@ fn layout_atomic( let size = replaced.contents.used_size_as_if_inline_element( ifc.containing_block, &replaced.style, + None, &pbm, ); let fragments = replaced diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs index 11af4147ce0..73630acf7bd 100644 --- a/components/layout_2020/flow/mod.rs +++ b/components/layout_2020/flow/mod.rs @@ -581,7 +581,7 @@ fn layout_in_flow_replaced_block_level<'a>( replaced: &ReplacedContent, ) -> BoxFragment { let pbm = style.padding_border_margin(containing_block); - let size = replaced.used_size_as_if_inline_element(containing_block, style, &pbm); + let size = replaced.used_size_as_if_inline_element(containing_block, style, None, &pbm); let (margin_inline_start, margin_inline_end) = solve_inline_margins_for_in_flow_block_level(containing_block, &pbm, size.inline); diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs index 37f2a0fb321..727fa618292 100644 --- a/components/layout_2020/positioned.rs +++ b/components/layout_2020/positioned.rs @@ -439,6 +439,7 @@ impl HoistedAbsolutelyPositionedBox { let used_size = replaced.contents.used_size_as_if_inline_element( &containing_block.into(), &replaced.style, + None, &pbm, ); Vec2 { diff --git a/components/layout_2020/replaced.rs b/components/layout_2020/replaced.rs index 642e83f7905..af4a3c8a62b 100644 --- a/components/layout_2020/replaced.rs +++ b/components/layout_2020/replaced.rs @@ -309,13 +309,14 @@ impl ReplacedContent { &self, containing_block: &ContainingBlock, style: &ComputedValues, + box_size: Option>, pbm: &PaddingBorderMargin, ) -> Vec2 { let mode = style.writing_mode; let intrinsic_size = self.flow_relative_intrinsic_size(style); let intrinsic_ratio = self.inline_size_over_block_size_intrinsic_ratio(style); - let box_size = style.content_box_size(containing_block, &pbm); + let box_size = box_size.unwrap_or(style.content_box_size(containing_block, &pbm)); let max_box_size = style.content_max_box_size(containing_block, &pbm); let min_box_size = style .content_min_box_size(containing_block, &pbm) From 77e13260d0bce1141d4549826bac8e869968e435 Mon Sep 17 00:00:00 2001 From: Pu Xingyu Date: Sat, 27 May 2023 09:41:10 +0800 Subject: [PATCH 2/3] layout_2020: Specify the used cross size when replaced item is stretched If the flex item has align-self: stretch, redo layout for its contents, reating this used size as its definite cross size so that percentage-sized children can be resolved. --- components/layout_2020/flexbox/layout.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs index caf88955a60..1c8001d9b95 100644 --- a/components/layout_2020/flexbox/layout.rs +++ b/components/layout_2020/flexbox/layout.rs @@ -1003,10 +1003,17 @@ impl<'a> FlexItem<'a> { let pbm = replaced .style .padding_border_margin(flex_context.containing_block); + let box_size = used_cross_size_override.map(|size| Vec2 { + inline: replaced + .style + .content_box_size(flex_context.containing_block, &pbm) + .inline, + block: LengthOrAuto::LengthPercentage(size), + }); let size = replaced.contents.used_size_as_if_inline_element( flex_context.containing_block, &replaced.style, - None, + box_size, &pbm, ); let cross_size = flex_context.vec2_to_flex_relative(size.clone()).cross; From ab3827c3ab1db58d99d852df34d1de5f790a69ce Mon Sep 17 00:00:00 2001 From: Pu Xingyu Date: Wed, 31 May 2023 13:00:11 +0800 Subject: [PATCH 3/3] Update test expectations --- .../css/css-flexbox/flex-aspect-ratio-img-column-001.html.ini | 2 ++ .../css/css-flexbox/flex-aspect-ratio-img-row-006.html.ini | 2 -- .../css/css-flexbox/flex-minimum-height-flex-items-004.xht.ini | 2 ++ .../css/css-flexbox/flex-minimum-height-flex-items-007.xht.ini | 2 ++ .../css/css-flexbox/flex-minimum-height-flex-items-008.xht.ini | 2 ++ .../css/css-flexbox/flex-minimum-height-flex-items-020.html.ini | 2 ++ .../css/css-flexbox/flex-minimum-width-flex-items-012.html.ini | 2 -- .../flexbox-definite-cross-size-constrained-percentage.html.ini | 2 -- .../css/css-flexbox/flexbox-whitespace-handling-001a.xhtml.ini | 2 -- .../css/css-flexbox/flexbox-whitespace-handling-001b.xhtml.ini | 2 -- 10 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-column-001.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-row-006.html.ini create mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-004.xht.ini create mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-007.xht.ini create mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-008.xht.ini create mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-020.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-012.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-definite-cross-size-constrained-percentage.html.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001a.xhtml.ini delete mode 100644 tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001b.xhtml.ini diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-column-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-column-001.html.ini new file mode 100644 index 00000000000..9a99c2d9f53 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-column-001.html.ini @@ -0,0 +1,2 @@ +[flex-aspect-ratio-img-column-001.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-row-006.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-row-006.html.ini deleted file mode 100644 index 3fb853b53f8..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-aspect-ratio-img-row-006.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-aspect-ratio-img-row-006.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-004.xht.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-004.xht.ini new file mode 100644 index 00000000000..ac4180f61a7 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-004.xht.ini @@ -0,0 +1,2 @@ +[flex-minimum-height-flex-items-004.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-007.xht.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-007.xht.ini new file mode 100644 index 00000000000..ca977d8203d --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-007.xht.ini @@ -0,0 +1,2 @@ +[flex-minimum-height-flex-items-007.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-008.xht.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-008.xht.ini new file mode 100644 index 00000000000..06b866be1a0 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-008.xht.ini @@ -0,0 +1,2 @@ +[flex-minimum-height-flex-items-008.xht] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-020.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-020.html.ini new file mode 100644 index 00000000000..59646670c59 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-020.html.ini @@ -0,0 +1,2 @@ +[flex-minimum-height-flex-items-020.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-012.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-012.html.ini deleted file mode 100644 index 7d30e64e0cc..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-012.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-minimum-width-flex-items-012.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-definite-cross-size-constrained-percentage.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-definite-cross-size-constrained-percentage.html.ini deleted file mode 100644 index 16e2fab0c39..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-definite-cross-size-constrained-percentage.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-definite-cross-size-constrained-percentage.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001a.xhtml.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001a.xhtml.ini deleted file mode 100644 index 2afbeeb72ed..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001a.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-whitespace-handling-001a.xhtml] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001b.xhtml.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001b.xhtml.ini deleted file mode 100644 index e8e9d4e0582..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-whitespace-handling-001b.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-whitespace-handling-001b.xhtml] - expected: FAIL