diff options
author | Oriol Brufau <obrufau@igalia.com> | 2025-03-14 22:37:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-14 21:37:19 +0000 |
commit | 7517976722be3b7b24574d22a29080993c69299c (patch) | |
tree | a3835e77f875d347d274f2ad3800f1b298f3fb25 | |
parent | f93d65b49653b626270a3c82b0ed257f4a303013 (diff) | |
download | servo-7517976722be3b7b24574d22a29080993c69299c.tar.gz servo-7517976722be3b7b24574d22a29080993c69299c.zip |
layout: Unify `FlexItem::new()` and `FlexItemBox::main_content_size_info()` (#35900)
These methods were doing virtually the same thing. So this patch moves
the common logic into a new `FlexItemBox::to_flex_item()`, which is then
called by `FlexItem::new()` and `FlexItemBox::main_content_size_info()`.
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
-rw-r--r-- | components/layout_2020/flexbox/geom.rs | 9 | ||||
-rw-r--r-- | components/layout_2020/flexbox/layout.rs | 429 |
2 files changed, 186 insertions, 252 deletions
diff --git a/components/layout_2020/flexbox/geom.rs b/components/layout_2020/flexbox/geom.rs index 870abf3c751..6a302e27486 100644 --- a/components/layout_2020/flexbox/geom.rs +++ b/components/layout_2020/flexbox/geom.rs @@ -14,15 +14,6 @@ pub(super) struct FlexRelativeVec2<T> { pub cross: T, } -impl<T> FlexRelativeVec2<T> { - pub fn map<U>(&self, f: impl Fn(&T) -> U) -> FlexRelativeVec2<U> { - FlexRelativeVec2 { - main: f(&self.main), - cross: f(&self.cross), - } - } -} - #[derive(Clone, Copy, Debug)] pub(super) struct FlexRelativeSides<T> { pub cross_start: T, diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs index ff8d3e50683..c81524314ac 100644 --- a/components/layout_2020/flexbox/layout.rs +++ b/components/layout_2020/flexbox/layout.rs @@ -98,6 +98,11 @@ struct FlexItem<'a> { /// <https://drafts.csswg.org/css-sizing-4/#preferred-aspect-ratio> preferred_aspect_ratio: Option<AspectRatio>, + + /// Whether an [auto](Size::Initial) [preferred](Sizes::preferred) + /// [cross size](Self::content_cross_sizes) stretches the item + /// to fill the flex container. + auto_cross_size_stretches_to_container_size: bool, } /// Child of a FlexContainer. Can either be absolutely positioned, or not. If not, @@ -368,25 +373,25 @@ impl FlexContainerConfig { self.flex_direction_is_reversed, ) } -} -impl FlexContext<'_> { - fn vec2_to_flex_relative<T>(&self, x: LogicalVec2<T>) -> FlexRelativeVec2<T> { - self.config.flex_axis.vec2_to_flex_relative(x) + fn sides_to_flex_relative<T>(&self, sides: LogicalSides<T>) -> FlexRelativeSides<T> { + self.main_start_cross_start_sides_are + .sides_to_flex_relative(sides) } - fn sides_to_flex_relative<T>(&self, x: LogicalSides<T>) -> FlexRelativeSides<T> { - self.config - .main_start_cross_start_sides_are - .sides_to_flex_relative(x) + fn sides_to_flow_relative<T>(&self, sides: FlexRelativeSides<T>) -> LogicalSides<T> { + self.main_start_cross_start_sides_are + .sides_to_flow_relative(sides) } +} +impl FlexContext<'_> { + #[inline] fn sides_to_flow_relative<T>(&self, x: FlexRelativeSides<T>) -> LogicalSides<T> { - self.config - .main_start_cross_start_sides_are - .sides_to_flow_relative(x) + self.config.sides_to_flow_relative(x) } + #[inline] fn rect_to_flow_relative( &self, base_rect_size: FlexRelativeVec2<Au>, @@ -410,8 +415,8 @@ struct DesiredFlexFractionAndGrowOrShrinkFactor { #[derive(Default)] struct FlexItemBoxInlineContentSizesInfo { outer_flex_base_size: Au, - content_min_size_no_auto: FlexRelativeVec2<Au>, - content_max_size: FlexRelativeVec2<Option<Au>>, + content_min_main_size: Au, + content_max_main_size: Option<Au>, pbm_auto_is_zero: FlexRelativeVec2<Au>, min_flex_factors: DesiredFlexFractionAndGrowOrShrinkFactor, max_flex_factors: DesiredFlexFractionAndGrowOrShrinkFactor, @@ -507,7 +512,6 @@ impl FlexContainer { let mut sum_of_flex_shrink_factors = 0.0; let mut item_infos = vec![]; - let container_is_horizontal = self.style.writing_mode.is_horizontal(); for kid in self.children.iter() { let kid = &*kid.borrow(); match kid { @@ -518,7 +522,6 @@ impl FlexContainer { let info = item.main_content_size_info( layout_context, containing_block_for_children, - container_is_horizontal, &self.config, &flex_context_getter, ); @@ -578,8 +581,8 @@ impl FlexContainer { for FlexItemBoxInlineContentSizesInfo { outer_flex_base_size, - content_min_size_no_auto, - content_max_size, + content_min_main_size, + content_max_main_size, pbm_auto_is_zero, min_flex_factors, max_flex_factors, @@ -590,8 +593,8 @@ impl FlexContainer { // > 4. Add each item’s flex base size to the product of its flex grow factor (scaled flex shrink // > factor, if shrinking) and the chosen flex fraction, then clamp that result by the max main size // > floored by the min main size. - let outer_min_main_size = content_min_size_no_auto.main + pbm_auto_is_zero.main; - let outer_max_main_size = content_max_size.main.map(|v| v + pbm_auto_is_zero.main); + let outer_min_main_size = *content_min_main_size + pbm_auto_is_zero.main; + let outer_max_main_size = content_max_main_size.map(|v| v + pbm_auto_is_zero.main); // > 5. The flex container’s max-content size is the largest sum (among all the lines) of the // > afore-calculated sizes of all items within a single line. @@ -1113,140 +1116,18 @@ fn allocate_free_cross_space_for_flex_line( impl<'a> FlexItem<'a> { fn new(flex_context: &FlexContext, box_: &'a FlexItemBox) -> Self { - let config = &flex_context.config; let containing_block = IndefiniteContainingBlock::from(flex_context.containing_block); - let parent_writing_mode = containing_block.writing_mode; - let item_writing_mode = box_.style().writing_mode; - - let container_is_horizontal = parent_writing_mode.is_horizontal(); - let item_is_horizontal = item_writing_mode.is_horizontal(); - let cross_axis_is_item_block_axis = cross_axis_is_item_block_axis( - container_is_horizontal, - item_is_horizontal, - config.flex_axis, - ); - - let ContentBoxSizesAndPBM { - content_box_sizes, - pbm, - depends_on_block_constraints, - } = box_ + let content_box_sizes_and_pbm = box_ .independent_formatting_context .layout_style() .content_box_sizes_and_padding_border_margin(&containing_block); - - let content_box_size = content_box_sizes.map(|size| size.preferred); - // TODO(#32853): handle size keywords. - let content_min_box_size = content_box_sizes.map(|size| size.min.to_auto_or()); - let content_max_box_size = content_box_sizes.map(|size| size.max.to_numeric()); - - let preferred_aspect_ratio = box_ - .independent_formatting_context - .preferred_aspect_ratio(&pbm.padding_border_sums); - let margin_auto_is_zero = flex_context.sides_to_flex_relative(pbm.margin.auto_is(Au::zero)); - let padding = flex_context.sides_to_flex_relative(pbm.padding); - let border = flex_context.sides_to_flex_relative(pbm.border); - let margin = flex_context.sides_to_flex_relative(pbm.margin); - let padding_border = padding.sum_by_axis() + border.sum_by_axis(); - let pbm_auto_is_zero = FlexRelativeVec2 { - main: padding_border.main, - cross: padding_border.cross, - } + margin_auto_is_zero.sum_by_axis(); - - let item_with_auto_cross_size_stretches_to_container_size = - config.item_with_auto_cross_size_stretches_to_container_size(box_.style(), &margin); - - let flex_relative_content_box_size = flex_context.vec2_to_flex_relative(content_box_size); - let flex_relative_content_max_size = - flex_context.vec2_to_flex_relative(content_max_box_size); - let flex_relative_content_min_size = - flex_context.vec2_to_flex_relative(content_min_box_size); - let flex_relative_content_min_size = FlexRelativeVec2 { - main: flex_relative_content_min_size.main.auto_is(|| { - box_.automatic_min_size( - flex_context.layout_context, - flex_context.vec2_to_flex_relative(containing_block.size), - cross_axis_is_item_block_axis, - flex_relative_content_box_size, - flex_relative_content_min_size, - flex_relative_content_max_size, - preferred_aspect_ratio, - &pbm_auto_is_zero, - item_with_auto_cross_size_stretches_to_container_size, - |item| { - let min_size_auto_is_zero = content_min_box_size.auto_is(Au::zero); - - item.layout_for_block_content_size( - flex_context, - &pbm, - content_box_size, - min_size_auto_is_zero, - content_max_box_size, - preferred_aspect_ratio, - item_with_auto_cross_size_stretches_to_container_size, - IntrinsicSizingMode::Size, - ) - }, - ) - }), - cross: flex_relative_content_min_size.cross.auto_is(Au::zero), - }; - let align_self = AlignItems(config.resolve_align_self_for_child(box_.style())); - let (flex_base_size, flex_base_size_is_definite) = box_.flex_base_size( + box_.to_flex_item( flex_context.layout_context, - flex_context - .container_inner_size_constraint - .map(|size| size.to_definite()), - cross_axis_is_item_block_axis, - flex_relative_content_box_size, - flex_relative_content_min_size, - flex_relative_content_max_size, - preferred_aspect_ratio, - padding_border, - &pbm_auto_is_zero, - item_with_auto_cross_size_stretches_to_container_size, - |item| { - let min_size = config - .flex_axis - .vec2_to_flow_relative(flex_relative_content_min_size); - item.layout_for_block_content_size( - flex_context, - &pbm, - content_box_size, - min_size, - content_max_box_size, - preferred_aspect_ratio, - item_with_auto_cross_size_stretches_to_container_size, - IntrinsicSizingMode::Size, - ) - }, - ); - - let hypothetical_main_size = flex_base_size.clamp_between_extremums( - flex_relative_content_min_size.main, - flex_relative_content_max_size.main, - ); - let margin: FlexRelativeSides<AuOrAuto> = flex_context.sides_to_flex_relative(pbm.margin); - - Self { - box_, - content_cross_sizes: match config.flex_axis { - FlexAxis::Row => content_box_sizes.block, - FlexAxis::Column => content_box_sizes.inline, - }, - padding, - border, - margin, - pbm_auto_is_zero, - flex_base_size, - flex_base_size_is_definite, - hypothetical_main_size, - content_min_main_size: flex_relative_content_min_size.main, - content_max_main_size: flex_relative_content_max_size.main, - align_self, - depends_on_block_constraints, - preferred_aspect_ratio, - } + &containing_block, + &content_box_sizes_and_pbm, + &flex_context.config, + &|| flex_context, + ) } fn stretches_to_line(&self) -> bool { @@ -1942,11 +1823,7 @@ impl FlexItem<'_> { (used_main_size, cross_size) } else { let cross_size = used_cross_size_override.unwrap_or_else(|| { - let style = self.box_.style(); - let automatic_size = if flex_context - .config - .item_with_auto_cross_size_stretches_to_container_size(style, &self.margin) - { + let automatic_size = if self.auto_cross_size_stretches_to_container_size { Size::Stretch } else { Size::FitContent @@ -2311,30 +2188,27 @@ impl FlexItem<'_> { } impl FlexItemBox { - fn main_content_size_info<'a>( + fn to_flex_item<'a>( &self, layout_context: &LayoutContext, containing_block: &IndefiniteContainingBlock, - container_is_horizontal: bool, + content_box_sizes_and_pbm: &ContentBoxSizesAndPBM, config: &FlexContainerConfig, flex_context_getter: &impl Fn() -> &'a FlexContext<'a>, - ) -> FlexItemBoxInlineContentSizesInfo { + ) -> FlexItem { let flex_axis = config.flex_axis; - let main_start_cross_start = config.main_start_cross_start_sides_are; - let style = &self.style(); - let item_writing_mode = style.writing_mode; - let item_is_horizontal = item_writing_mode.is_horizontal(); - let cross_axis_is_item_block_axis = - cross_axis_is_item_block_axis(container_is_horizontal, item_is_horizontal, flex_axis); + let style = self.style(); + let cross_axis_is_item_block_axis = cross_axis_is_item_block_axis( + containing_block.writing_mode.is_horizontal(), + style.writing_mode.is_horizontal(), + flex_axis, + ); let ContentBoxSizesAndPBM { content_box_sizes, pbm, - .. - } = self - .independent_formatting_context - .layout_style() - .content_box_sizes_and_padding_border_margin(containing_block); + depends_on_block_constraints, + } = content_box_sizes_and_pbm; let content_box_size = content_box_sizes.map(|size| size.preferred); // TODO(#32853): handle size keywords. @@ -2344,70 +2218,145 @@ impl FlexItemBox { let preferred_aspect_ratio = self .independent_formatting_context .preferred_aspect_ratio(&pbm.padding_border_sums); - let padding = main_start_cross_start.sides_to_flex_relative(pbm.padding); - let border = main_start_cross_start.sides_to_flex_relative(pbm.border); - let margin = main_start_cross_start.sides_to_flex_relative(pbm.margin); + let padding = config.sides_to_flex_relative(pbm.padding); + let border = config.sides_to_flex_relative(pbm.border); + let margin = config.sides_to_flex_relative(pbm.margin); let padding_border = padding.sum_by_axis() + border.sum_by_axis(); - let margin_auto_is_zero = pbm.margin.auto_is(Au::zero); - let margin_auto_is_zero = - main_start_cross_start.sides_to_flex_relative(margin_auto_is_zero); + let margin_auto_is_zero = config.sides_to_flex_relative(pbm.margin.auto_is(Au::zero)); let pbm_auto_is_zero = FlexRelativeVec2 { main: padding_border.main, cross: padding_border.cross, } + margin_auto_is_zero.sum_by_axis(); - let item_with_auto_cross_size_stretches_to_container_size = + let auto_cross_size_stretches_to_container_size = config.item_with_auto_cross_size_stretches_to_container_size(style, &margin); - let automatic_min_size = self.automatic_min_size( + + let flex_relative_content_box_size = flex_axis.vec2_to_flex_relative(content_box_size); + let flex_relative_content_max_size = flex_axis.vec2_to_flex_relative(content_max_box_size); + let flex_relative_content_min_size = flex_axis.vec2_to_flex_relative(content_min_box_size); + let containing_block_size = flex_axis.vec2_to_flex_relative(containing_block.size); + let flex_relative_content_min_size = FlexRelativeVec2 { + main: flex_relative_content_min_size.main.auto_is(|| { + self.automatic_min_size( + layout_context, + containing_block_size, + cross_axis_is_item_block_axis, + flex_relative_content_box_size, + flex_relative_content_min_size, + flex_relative_content_max_size, + preferred_aspect_ratio, + &pbm_auto_is_zero, + auto_cross_size_stretches_to_container_size, + |item| { + let min_size_auto_is_zero = content_min_box_size.auto_is(Au::zero); + + item.layout_for_block_content_size( + flex_context_getter(), + pbm, + content_box_size, + min_size_auto_is_zero, + content_max_box_size, + preferred_aspect_ratio, + auto_cross_size_stretches_to_container_size, + IntrinsicSizingMode::Size, + ) + }, + ) + }), + cross: flex_relative_content_min_size.cross.auto_is(Au::zero), + }; + let align_self = AlignItems(config.resolve_align_self_for_child(style)); + let (flex_base_size, flex_base_size_is_definite) = self.flex_base_size( layout_context, - flex_axis.vec2_to_flex_relative(containing_block.size), + containing_block_size, cross_axis_is_item_block_axis, - flex_axis.vec2_to_flex_relative(content_box_size), - flex_axis.vec2_to_flex_relative(content_min_box_size), - flex_axis.vec2_to_flex_relative(content_max_box_size), + flex_relative_content_box_size, + flex_relative_content_min_size, + flex_relative_content_max_size, preferred_aspect_ratio, + padding_border, &pbm_auto_is_zero, - item_with_auto_cross_size_stretches_to_container_size, + auto_cross_size_stretches_to_container_size, |item| { + let min_size = flex_axis.vec2_to_flow_relative(flex_relative_content_min_size); item.layout_for_block_content_size( flex_context_getter(), - &pbm, + pbm, content_box_size, - content_min_box_size.map(|v| v.auto_is(Au::zero)), + min_size, content_max_box_size, preferred_aspect_ratio, - item_with_auto_cross_size_stretches_to_container_size, + auto_cross_size_stretches_to_container_size, IntrinsicSizingMode::Size, ) }, ); - let content_min_size_no_auto = if cross_axis_is_item_block_axis { - LogicalVec2 { - inline: content_min_box_size.inline.auto_is(|| automatic_min_size), - block: content_min_box_size.block.auto_is(Au::zero), - } - } else { - LogicalVec2 { - inline: content_min_box_size.inline.auto_is(Au::zero), - block: content_min_box_size.block.auto_is(|| automatic_min_size), - } - }; - let block_content_size_callback = |item: &FlexItemBox| { - item.layout_for_block_content_size( - flex_context_getter(), - &pbm, - content_box_size, - content_min_size_no_auto, - content_max_box_size, - preferred_aspect_ratio, - item_with_auto_cross_size_stretches_to_container_size, - IntrinsicSizingMode::Size, - ) - }; + + let hypothetical_main_size = flex_base_size.clamp_between_extremums( + flex_relative_content_min_size.main, + flex_relative_content_max_size.main, + ); + let margin: FlexRelativeSides<AuOrAuto> = config.sides_to_flex_relative(pbm.margin); + + FlexItem { + box_: self, + content_cross_sizes: match flex_axis { + FlexAxis::Row => content_box_sizes.block.clone(), + FlexAxis::Column => content_box_sizes.inline.clone(), + }, + padding, + border, + margin, + pbm_auto_is_zero, + flex_base_size, + flex_base_size_is_definite, + hypothetical_main_size, + content_min_main_size: flex_relative_content_min_size.main, + content_max_main_size: flex_relative_content_max_size.main, + align_self, + depends_on_block_constraints: *depends_on_block_constraints, + preferred_aspect_ratio, + auto_cross_size_stretches_to_container_size, + } + } + + fn main_content_size_info<'a>( + &self, + layout_context: &LayoutContext, + containing_block: &IndefiniteContainingBlock, + config: &FlexContainerConfig, + flex_context_getter: &impl Fn() -> &'a FlexContext<'a>, + ) -> FlexItemBoxInlineContentSizesInfo { + let content_box_sizes_and_pbm = self + .independent_formatting_context + .layout_style() + .content_box_sizes_and_padding_border_margin(containing_block); + + // TODO: when laying out a column container with an indefinite main size, + // we compute the base sizes of the items twice. We should consider caching. + let FlexItem { + flex_base_size, + content_min_main_size, + content_max_main_size, + pbm_auto_is_zero, + preferred_aspect_ratio, + auto_cross_size_stretches_to_container_size, + .. + } = self.to_flex_item( + layout_context, + containing_block, + &content_box_sizes_and_pbm, + config, + flex_context_getter, + ); // Compute the min-content and max-content contributions of the item. // <https://drafts.csswg.org/css-flexbox/#intrinsic-item-contributions> - let (content_contribution_sizes, depends_on_block_constraints) = match flex_axis { + let (content_contribution_sizes, depends_on_block_constraints) = match config.flex_axis { FlexAxis::Row => { + let auto_minimum = LogicalVec2 { + inline: content_min_main_size, + block: Au::zero(), + }; let InlineContentSizesResult { sizes, depends_on_block_constraints, @@ -2416,48 +2365,42 @@ impl FlexItemBox { .outer_inline_content_sizes( layout_context, containing_block, - &content_min_size_no_auto, - item_with_auto_cross_size_stretches_to_container_size, + &auto_minimum, + auto_cross_size_stretches_to_container_size, ); (sizes, depends_on_block_constraints) }, FlexAxis::Column => { + let content_box_sizes = &content_box_sizes_and_pbm.content_box_sizes; + let content_box_size = content_box_sizes.map(|size| size.preferred); + let content_min_size_no_auto = LogicalVec2 { + // TODO(#32853): handle size keywords. + inline: content_box_sizes + .inline + .min + .to_numeric() + .unwrap_or_default(), + block: content_min_main_size, + }; + let content_max_box_size = LogicalVec2 { + // TODO(#32853): handle size keywords. + inline: content_box_sizes.inline.max.to_numeric(), + block: content_max_main_size, + }; let size = self.layout_for_block_content_size( flex_context_getter(), - &pbm, + &content_box_sizes_and_pbm.pbm, content_box_size, content_min_size_no_auto, content_max_box_size, preferred_aspect_ratio, - item_with_auto_cross_size_stretches_to_container_size, + auto_cross_size_stretches_to_container_size, IntrinsicSizingMode::Contribution, ); (size.into(), true) }, }; - let content_box_size = flex_axis.vec2_to_flex_relative(content_box_size); - let content_min_size_no_auto = flex_axis.vec2_to_flex_relative(content_min_size_no_auto); - let content_max_size = flex_axis.vec2_to_flex_relative(content_max_box_size); - - // TODO: when laying out a column container with an indefinite main size, - // we compute the base sizes of the items twice. We should consider caching. - let (flex_base_size, _) = self.flex_base_size( - layout_context, - config - .flex_axis - .vec2_to_flex_relative(containing_block.size), - cross_axis_is_item_block_axis, - content_box_size, - content_min_size_no_auto, - content_max_size, - preferred_aspect_ratio, - padding_border, - &pbm_auto_is_zero, - item_with_auto_cross_size_stretches_to_container_size, - block_content_size_callback, - ); - let outer_flex_base_size = flex_base_size + pbm_auto_is_zero.main; let max_flex_factors = self.desired_flex_factors_for_preferred_width( content_contribution_sizes.max_content, @@ -2482,20 +2425,21 @@ impl FlexItemBox { // > min and max main sizes. let mut min_content_main_size_for_multiline_container = content_contribution_sizes.min_content; - if style.get_position().flex_grow.is_zero() { + let style_position = &self.style().get_position(); + if style_position.flex_grow.is_zero() { min_content_main_size_for_multiline_container.min_assign(flex_base_size); } - if style.get_position().flex_shrink.is_zero() { + if style_position.flex_shrink.is_zero() { min_content_main_size_for_multiline_container.max_assign(flex_base_size); } min_content_main_size_for_multiline_container = min_content_main_size_for_multiline_container - .clamp_between_extremums(content_min_size_no_auto.main, content_max_size.main); + .clamp_between_extremums(content_min_main_size, content_max_main_size); FlexItemBoxInlineContentSizesInfo { outer_flex_base_size, - content_min_size_no_auto, - content_max_size, + content_min_main_size, + content_max_main_size, pbm_auto_is_zero, min_flex_factors, max_flex_factors, @@ -2717,7 +2661,7 @@ impl FlexItemBox { preferred_aspect_ratio: Option<AspectRatio>, padding_border_sums: FlexRelativeVec2<Au>, pbm_auto_is_zero: &FlexRelativeVec2<Au>, - item_with_auto_cross_size_stretches_to_container_size: bool, + auto_cross_size_stretches_to_container_size: bool, block_content_size_callback: impl FnOnce(&FlexItemBox) -> Au, ) -> (Au, bool) { let used_flex_basis = self.flex_basis( @@ -2744,7 +2688,7 @@ impl FlexItemBox { .map(|v| v - pbm_auto_is_zero.cross); let cross_size = SizeConstraint::new( if content_box_size.cross.is_initial() && - item_with_auto_cross_size_stretches_to_container_size + auto_cross_size_stretches_to_container_size { cross_stretch_size } else { @@ -2830,7 +2774,7 @@ impl FlexItemBox { mut min_size: LogicalVec2<Au>, mut max_size: LogicalVec2<Option<Au>>, preferred_aspect_ratio: Option<AspectRatio>, - item_with_auto_cross_size_stretches_to_container_size: bool, + auto_cross_size_stretches_to_container_size: bool, intrinsic_sizing_mode: IntrinsicSizingMode, ) -> Au { let mut positioning_context = PositioningContext::new_for_subtree( @@ -2875,8 +2819,7 @@ impl FlexItemBox { // TODO: This is wrong if the item writing mode is different from the flex // container's writing mode. let inline_size = { - let initial_behavior = if item_with_auto_cross_size_stretches_to_container_size - { + let initial_behavior = if auto_cross_size_stretches_to_container_size { Size::Stretch } else { Size::FitContent |