diff --git a/components/layout/flexbox/layout.rs b/components/layout/flexbox/layout.rs index c83ce4b3067..80057af2b34 100644 --- a/components/layout/flexbox/layout.rs +++ b/components/layout/flexbox/layout.rs @@ -655,6 +655,7 @@ impl FlexContainer { positioning_context: &mut PositioningContext, containing_block: &ContainingBlock, depends_on_block_constraints: bool, + lazy_block_size: &LazySize, ) -> CacheableLayoutResult { let depends_on_block_constraints = depends_on_block_constraints || self.config.flex_direction == FlexDirection::Column; @@ -676,14 +677,13 @@ impl FlexContainer { // https://drafts.csswg.org/css-flexbox/#algo-main-container let container_main_size = match self.config.flex_axis { FlexAxis::Row => containing_block.size.inline, - FlexAxis::Column => match containing_block.size.block { - SizeConstraint::Definite(size) => size, - SizeConstraint::MinMax(min, max) => self - .main_content_sizes(layout_context, &containing_block.into(), || &flex_context) + FlexAxis::Column => lazy_block_size.resolve(|| { + let mut containing_block = IndefiniteContainingBlock::from(containing_block); + containing_block.size.block = None; + self.main_content_sizes(layout_context, &containing_block, || &flex_context) .sizes .max_content - .clamp_between_extremums(min, max), - }, + }), }; // Actual length may be less, but we guess that usually not by a lot @@ -766,30 +766,23 @@ impl FlexContainer { .map(|layout| layout.line_size.cross) .sum::() + cross_gap * (line_count as i32 - 1); + let content_block_size = match self.config.flex_axis { + FlexAxis::Row => content_cross_size, + FlexAxis::Column => container_main_size, + }; // https://drafts.csswg.org/css-flexbox/#algo-cross-container - let container_cross_size = match flex_context.container_inner_size_constraint.cross { - SizeConstraint::Definite(cross_size) => cross_size, - SizeConstraint::MinMax(min, max) => { - content_cross_size.clamp_between_extremums(min, max) - }, + let container_cross_size = match self.config.flex_axis { + FlexAxis::Row => lazy_block_size.resolve(|| content_cross_size), + FlexAxis::Column => containing_block.size.inline, }; let container_size = FlexRelativeVec2 { main: container_main_size, cross: container_cross_size, }; - let content_block_size = flex_context - .config - .flex_axis - .vec2_to_flow_relative(container_size) - .block; - let mut remaining_free_cross_space = - match flex_context.container_inner_size_constraint.cross { - SizeConstraint::Definite(cross_size) => cross_size - content_cross_size, - _ => Au::zero(), - }; + let mut remaining_free_cross_space = container_cross_size - content_cross_size; // Implement fallback alignment. // diff --git a/components/layout/formatting_contexts.rs b/components/layout/formatting_contexts.rs index 3942af63312..a489df2b663 100644 --- a/components/layout/formatting_contexts.rs +++ b/components/layout/formatting_contexts.rs @@ -243,7 +243,7 @@ impl IndependentNonReplacedContents { containing_block_for_children: &ContainingBlock, containing_block: &ContainingBlock, depends_on_block_constraints: bool, - _lazy_block_size: &LazySize, + lazy_block_size: &LazySize, ) -> CacheableLayoutResult { match self { IndependentNonReplacedContents::Flow(bfc) => bfc.layout( @@ -257,6 +257,7 @@ impl IndependentNonReplacedContents { positioning_context, containing_block_for_children, depends_on_block_constraints, + lazy_block_size, ), IndependentNonReplacedContents::Grid(fc) => fc.layout( layout_context, diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index c847669c619..f428e76b966 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -586672,6 +586672,20 @@ {} ] ], + "flex-container-max-content-002.tentative.html": [ + "77a074b153a3b3fcb47c5665bab614c1720a73d2", + [ + null, + {} + ] + ], + "flex-container-min-content-002.tentative.html": [ + "92d37e3b9d8db7b57b813b49c26a3e9cd03b5179", + [ + null, + {} + ] + ], "flex-direction-column-overlap-001.html": [ "4d483a44fc630e46ddbe75ca79d8246eed67a94d", [ diff --git a/tests/wpt/meta/css/css-flexbox/flex-container-max-content-002.tentative.html.ini b/tests/wpt/meta/css/css-flexbox/flex-container-max-content-002.tentative.html.ini new file mode 100644 index 00000000000..8b9bd7fdf97 --- /dev/null +++ b/tests/wpt/meta/css/css-flexbox/flex-container-max-content-002.tentative.html.ini @@ -0,0 +1,12 @@ +[flex-container-max-content-002.tentative.html] + [.flex 2] + expected: FAIL + + [.flex 3] + expected: FAIL + + [.flex 5] + expected: FAIL + + [.flex 6] + expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flex-container-min-content-002.tentative.html.ini b/tests/wpt/meta/css/css-flexbox/flex-container-min-content-002.tentative.html.ini new file mode 100644 index 00000000000..408a853b460 --- /dev/null +++ b/tests/wpt/meta/css/css-flexbox/flex-container-min-content-002.tentative.html.ini @@ -0,0 +1,21 @@ +[flex-container-min-content-002.tentative.html] + [.flex 2] + expected: FAIL + + [.flex 3] + expected: FAIL + + [.flex 5] + expected: FAIL + + [.flex 6] + expected: FAIL + + [.flex 13] + expected: FAIL + + [.flex 14] + expected: FAIL + + [.flex 15] + expected: FAIL diff --git a/tests/wpt/tests/css/css-flexbox/flex-container-max-content-002.tentative.html b/tests/wpt/tests/css/css-flexbox/flex-container-max-content-002.tentative.html new file mode 100644 index 00000000000..77a074b153a --- /dev/null +++ b/tests/wpt/tests/css/css-flexbox/flex-container-max-content-002.tentative.html @@ -0,0 +1,169 @@ + + +Flex Container Max-Content Sizes + + + + + + + + + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ +
+ + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ +
+ + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ +
+ + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ + + + + diff --git a/tests/wpt/tests/css/css-flexbox/flex-container-min-content-002.tentative.html b/tests/wpt/tests/css/css-flexbox/flex-container-min-content-002.tentative.html new file mode 100644 index 00000000000..92d37e3b9d8 --- /dev/null +++ b/tests/wpt/tests/css/css-flexbox/flex-container-min-content-002.tentative.html @@ -0,0 +1,169 @@ + + +Flex Container Min-Content Sizes + + + + + + + + + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ +
+ + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ +
+ + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ +
+ + +
+
X
+
+
+
X
+
+
+
X
+
+ +
+
X X
+
X X
+
+
+
X X
+
X X
+
+
+
X X
+
X X
+
+ + + + +