@@ -77,6 +77,7 @@ void FlexFormattingContext::run(Box const& run_box, LayoutMode layout_mode)
77
77
auto item_inner_cross_size = item_preferred_outer_cross_size - item.margins .cross_before - item.margins .cross_after - item.padding .cross_before - item.padding .cross_after - item.borders .cross_before - item.borders .cross_after ;
78
78
set_cross_size (item.box , item_inner_cross_size);
79
79
set_has_definite_cross_size (item.box , true );
80
+ item.has_assigned_definite_cross_size = true ;
80
81
}
81
82
}
82
83
}
@@ -172,6 +173,7 @@ void FlexFormattingContext::run(Box const& run_box, LayoutMode layout_mode)
172
173
for (auto & item : m_flex_items) {
173
174
set_cross_size (item.box , item.cross_size );
174
175
set_has_definite_cross_size (item.box , true );
176
+ item.has_assigned_definite_cross_size = true ;
175
177
}
176
178
}
177
179
}
@@ -344,26 +346,18 @@ float FlexFormattingContext::specified_cross_size(Box const& box) const
344
346
return is_row_layout () ? box_state.content_height () : box_state.content_width ();
345
347
}
346
348
347
- float FlexFormattingContext::resolved_definite_cross_size (Box const & box ) const
349
+ float FlexFormattingContext::resolved_definite_cross_size (FlexItem const & item ) const
348
350
{
349
- auto const & cross_value = is_row_layout () ? box.computed_values ().height () : box.computed_values ().width ();
350
- if (cross_value.is_auto ())
351
- return specified_cross_size (flex_container ());
352
- if (cross_value.is_length ())
353
- return specified_cross_size (box);
354
- auto containing_block_size = !is_row_layout () ? containing_block_width_for (box) : containing_block_height_for (box);
355
- return cross_value.resolved (box, CSS::Length::make_px (containing_block_size)).to_px (box);
351
+ if (item.has_assigned_definite_cross_size )
352
+ return specified_cross_size (item.box );
353
+ return !is_row_layout () ? m_state.resolved_definite_width (item.box ) : m_state.resolved_definite_height (item.box );
356
354
}
357
355
358
- float FlexFormattingContext::resolved_definite_main_size (Box const & box ) const
356
+ float FlexFormattingContext::resolved_definite_main_size (FlexItem const & item ) const
359
357
{
360
- auto const & main_value = is_row_layout () ? box.computed_values ().width () : box.computed_values ().height ();
361
- if (main_value.is_auto ())
362
- return specified_main_size (flex_container ());
363
- if (main_value.is_length ())
364
- return specified_main_size (box);
365
- auto containing_block_size = is_row_layout () ? containing_block_width_for (box) : containing_block_height_for (box);
366
- return main_value.resolved (box, CSS::Length::make_px (containing_block_size)).to_px (box);
358
+ if (item.has_assigned_definite_main_size )
359
+ return specified_main_size (item.box );
360
+ return is_row_layout () ? m_state.resolved_definite_width (item.box ) : m_state.resolved_definite_height (item.box );
367
361
}
368
362
369
363
bool FlexFormattingContext::has_main_min_size (Box const & box) const
@@ -524,7 +518,7 @@ void FlexFormattingContext::determine_available_main_and_cross_space(bool& main_
524
518
auto containing_block_effective_main_size = [&](Box const & box) -> Optional<float > {
525
519
auto & containing_block = *box.containing_block ();
526
520
if (has_definite_main_size (containing_block))
527
- return resolved_definite_main_size (containing_block );
521
+ return is_row_layout () ? m_state. resolved_definite_width (box) : m_state. resolved_definite_height (box );
528
522
return {};
529
523
};
530
524
@@ -688,7 +682,7 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
688
682
&& flex_item.used_flex_basis .type == CSS::FlexBasis::Content
689
683
&& has_definite_cross_size (flex_item.box )) {
690
684
// flex_base_size is calculated from definite cross size and intrinsic aspect ratio
691
- return resolved_definite_cross_size (flex_item. box ) * flex_item.box .intrinsic_aspect_ratio ().value ();
685
+ return resolved_definite_cross_size (flex_item) * flex_item.box .intrinsic_aspect_ratio ().value ();
692
686
}
693
687
694
688
// C. If the used flex basis is content or depends on its available space,
@@ -721,7 +715,7 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
721
715
// FIXME: This is probably too naive.
722
716
// FIXME: Care about FlexBasis::Auto
723
717
if (has_definite_main_size (child_box))
724
- return resolved_definite_main_size (child_box );
718
+ return resolved_definite_main_size (flex_item );
725
719
726
720
// NOTE: To avoid repeated layout work, we keep a cache of flex item main sizes on the
727
721
// root LayoutState object. It's available through a full layout cycle.
@@ -774,7 +768,7 @@ Optional<float> FlexFormattingContext::transferred_size_suggestion(FlexItem cons
774
768
if (item.box .has_intrinsic_aspect_ratio () && has_definite_cross_size (item.box )) {
775
769
auto aspect_ratio = item.box .intrinsic_aspect_ratio ().value ();
776
770
// FIXME: Clamp cross size to min/max cross size before this conversion.
777
- return resolved_definite_cross_size (item. box ) * aspect_ratio;
771
+ return resolved_definite_cross_size (item) * aspect_ratio;
778
772
}
779
773
780
774
// It is otherwise undefined.
@@ -1033,6 +1027,7 @@ void FlexFormattingContext::resolve_flexible_lengths()
1033
1027
// 2. If a flex-item’s flex basis is definite, then its post-flexing main size is also definite.
1034
1028
if (has_definite_main_size (flex_container ()) || flex_item->used_flex_basis_is_definite ) {
1035
1029
set_has_definite_main_size (flex_item->box , true );
1030
+ flex_item->has_assigned_definite_main_size = true ;
1036
1031
}
1037
1032
}
1038
1033
@@ -1055,7 +1050,7 @@ void FlexFormattingContext::determine_hypothetical_cross_size_of_item(FlexItem&
1055
1050
1056
1051
// If we have a definite cross size, this is easy! No need to perform layout, we can just use it as-is.
1057
1052
if (has_definite_cross_size (item.box )) {
1058
- item.hypothetical_cross_size = css_clamp (resolved_definite_cross_size (item. box ), clamp_min, clamp_max);
1053
+ item.hypothetical_cross_size = css_clamp (resolved_definite_cross_size (item), clamp_min, clamp_max);
1059
1054
return ;
1060
1055
}
1061
1056
0 commit comments