diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs index 1c8001d9b95..b0744e08aa3 100644 --- a/components/layout_2020/flexbox/layout.rs +++ b/components/layout_2020/flexbox/layout.rs @@ -444,7 +444,77 @@ impl<'a> FlexItem<'a> { let max_size = box_style.content_max_box_size(containing_block, &pbm); let min_size = box_style.content_min_box_size(containing_block, &pbm); - let min_size = min_size.auto_is(|| automatic_min_size(box_)); + // https://drafts.csswg.org/css-flexbox/#min-size-auto + let automatic_min_size = || { + // FIXME(stshine): Consider more situations when auto min size is not needed. + if box_style.get_box().overflow_x.is_scrollable() { + return Length::zero(); + } + + if cross_axis_is_item_block_axis { + let specified_size_suggestion = content_box_size.inline; + + let transferred_size_suggestion = match box_ { + IndependentFormattingContext::NonReplaced(_) => None, + IndependentFormattingContext::Replaced(ref bfc) => { + match ( + bfc.contents + .inline_size_over_block_size_intrinsic_ratio(box_style), + content_box_size.block, + ) { + (Some(ratio), LengthOrAuto::LengthPercentage(block_size)) => { + let block_size = block_size.clamp_between_extremums( + min_size.block.auto_is(|| Length::zero()), + max_size.block, + ); + Some(block_size * ratio) + }, + _ => None, + } + }, + }; + + let inline_content_size = box_ + .inline_content_sizes(&flex_context.layout_context) + .min_content; + let content_size_suggestion = match box_ { + IndependentFormattingContext::NonReplaced(_) => inline_content_size, + IndependentFormattingContext::Replaced(ref replaced) => { + if let Some(ratio) = replaced + .contents + .inline_size_over_block_size_intrinsic_ratio(box_style) + { + inline_content_size.clamp_between_extremums( + min_size.block.auto_is(|| Length::zero()) * ratio, + max_size.block.map(|l| l * ratio), + ) + } else { + inline_content_size + } + }, + }; + + let result = match specified_size_suggestion { + LengthOrAuto::LengthPercentage(l) => l.min(content_size_suggestion), + LengthOrAuto::Auto => { + if let Some(l) = transferred_size_suggestion { + l.min(content_size_suggestion) + } else { + content_size_suggestion + } + }, + }; + result.clamp_below_max(max_size.inline) + } else { + // FIXME(stshine): Implement this when main axis is item's block axis. + Length::zero() + } + }; + + let min_size = Vec2 { + inline: min_size.inline.auto_is(automatic_min_size), + block: min_size.block.auto_is(|| Length::zero()), + }; let margin_auto_is_zero = pbm.margin.auto_is(Length::zero); let content_box_size = flex_context.vec2_to_flex_relative(content_box_size); @@ -488,12 +558,6 @@ impl<'a> FlexItem<'a> { } } -/// https://drafts.csswg.org/css-flexbox/#min-size-auto -fn automatic_min_size(_box: &IndependentFormattingContext) -> Length { - // FIMXE: implement the actual algorithm - Length::zero() // Give an incorrect value rather than panicking -} - /// https://drafts.csswg.org/css-flexbox/#algo-main-item fn flex_base_size( flex_context: &FlexContext, diff --git a/components/layout_2020/formatting_contexts.rs b/components/layout_2020/formatting_contexts.rs index d00689c162c..d913ad7241a 100644 --- a/components/layout_2020/formatting_contexts.rs +++ b/components/layout_2020/formatting_contexts.rs @@ -138,7 +138,7 @@ impl IndependentFormattingContext { } } - pub fn inline_content_sizes(&mut self, layout_context: &LayoutContext) -> ContentSizes { + pub fn inline_content_sizes(&self, layout_context: &LayoutContext) -> ContentSizes { match self { Self::NonReplaced(inner) => inner .contents diff --git a/components/layout_2020/replaced.rs b/components/layout_2020/replaced.rs index af4a3c8a62b..48d06802edf 100644 --- a/components/layout_2020/replaced.rs +++ b/components/layout_2020/replaced.rs @@ -201,7 +201,7 @@ impl ReplacedContent { Vec2::from_physical_size(&intrinsic_size, style.writing_mode) } - fn inline_size_over_block_size_intrinsic_ratio( + pub fn inline_size_over_block_size_intrinsic_ratio( &self, style: &ComputedValues, ) -> Option { diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-factor-less-than-one.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-factor-less-than-one.html.ini index d78d514a183..b854b40129e 100644 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-factor-less-than-one.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-factor-less-than-one.html.ini @@ -22,6 +22,3 @@ [.flexbox 12] expected: FAIL - - [.flexbox 19] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-024.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-024.html.ini deleted file mode 100644 index 0562c3f3605..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-height-flex-items-024.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-minimum-height-flex-items-024.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-001.html.ini index 2be70bc3b73..af05abceb32 100644 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-001.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-size-001.html.ini @@ -1,15 +1,6 @@ [flex-minimum-size-001.html] - [.flexbox, .inline-flexbox 1] - expected: FAIL - [.flexbox, .inline-flexbox 6] expected: FAIL - [.flexbox, .inline-flexbox 5] - expected: FAIL - - [.flexbox, .inline-flexbox 4] - expected: FAIL - [.flexbox, .inline-flexbox 2] expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-001.xht.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-001.xht.ini deleted file mode 100644 index 48eff349a06..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-001.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-minimum-width-flex-items-001.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-002.xht.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-002.xht.ini deleted file mode 100644 index fe6b812daac..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-002.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-minimum-width-flex-items-002.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-003.xht.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-003.xht.ini deleted file mode 100644 index 18446806a97..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-minimum-width-flex-items-003.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flex-minimum-width-flex-items-003.xht] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-wrap-003.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-wrap-003.html.ini new file mode 100644 index 00000000000..0a8dc305bc3 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-wrap-003.html.ini @@ -0,0 +1,2 @@ +[flex-wrap-003.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-wrap-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-wrap-004.html.ini new file mode 100644 index 00000000000..d8f5dd6ee01 --- /dev/null +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-wrap-004.html.ini @@ -0,0 +1,2 @@ +[flex-wrap-004.html] + expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-align-self-stretch-vert-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-align-self-stretch-vert-001.html.ini index 099b439b271..13f1728eff0 100644 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-align-self-stretch-vert-001.html.ini +++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-align-self-stretch-vert-001.html.ini @@ -1,2 +1,2 @@ [flexbox-align-self-stretch-vert-001.html] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-001.html.ini deleted file mode 100644 index 3f082265ebe..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-min-width-auto-001.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-003.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-003.html.ini deleted file mode 100644 index 150d543188f..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-003.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-min-width-auto-003.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-004.html.ini deleted file mode 100644 index 23081b20a15..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox-min-width-auto-004.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-min-width-auto-004.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0-0-unitless.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0-0-unitless.html.ini deleted file mode 100644 index 77f37dfe306..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0-0-unitless.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-0-0-unitless.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0-0.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0-0.html.ini deleted file mode 100644 index 3d79a3a08f9..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0-0.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-0-0.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0.html.ini deleted file mode 100644 index a8c09171fde..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-0.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-0.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1-0-unitless.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1-0-unitless.html.ini deleted file mode 100644 index 16f27cb4ea8..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1-0-unitless.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-1-0-unitless.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1-0.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1-0.html.ini deleted file mode 100644 index 30eb55fcfcd..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1-0.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-1-0.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1.html.ini deleted file mode 100644 index 0e2aad620a1..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-1.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-1.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N-0-unitless.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N-0-unitless.html.ini deleted file mode 100644 index 40605a06842..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N-0-unitless.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-N-0-unitless.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N-0.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N-0.html.ini deleted file mode 100644 index b9c75503bed..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N-0.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-N-0.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N.html.ini deleted file mode 100644 index 48a09e1c2dc..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-0-N.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox_flex-0-N.html] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini deleted file mode 100644 index 5747cd2deec..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/radiobutton-min-size.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[radiobutton-min-size.html] - [two radio button widths are identical] - expected: FAIL - diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/relayout-image-load.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/relayout-image-load.html.ini deleted file mode 100644 index c3836ef179a..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/relayout-image-load.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[relayout-image-load.html] - [#test 1] - expected: FAIL diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-item-stretch-cross-size-4.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-item-stretch-cross-size-4.html.ini deleted file mode 100644 index 31d7e2ddc74..00000000000 --- a/tests/wpt/metadata-layout-2020/css/css-flexbox/table-as-item-stretch-cross-size-4.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-as-item-stretch-cross-size-4.html] - expected: FAIL