diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp index f5e9e456c0..d4bf8ea4ae 100644 --- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp @@ -83,6 +83,7 @@ void FlexFormattingContext::run(Box const& run_box, LayoutMode, AvailableSpace c auto item_preferred_outer_cross_size = css_clamp(flex_container_inner_cross_size, item_min_cross_size, item_max_cross_size); 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; set_cross_size(item.box, item_inner_cross_size); + set_has_definite_cross_size(item); } } } @@ -153,6 +154,7 @@ void FlexFormattingContext::run(Box const& run_box, LayoutMode, AvailableSpace c if (flex_container_computed_cross_size.is_auto()) { for (auto& item : m_flex_items) { set_cross_size(item.box, item.cross_size.value()); + set_has_definite_cross_size(item); } } } @@ -377,6 +379,22 @@ bool FlexFormattingContext::is_cross_auto(Box const& box) const return cross_length.is_auto(); } +void FlexFormattingContext::set_has_definite_main_size(FlexItem& item) +{ + if (is_row_layout()) + item.used_values.set_has_definite_width(true); + else + item.used_values.set_has_definite_height(true); +} + +void FlexFormattingContext::set_has_definite_cross_size(FlexItem& item) +{ + if (is_row_layout()) + item.used_values.set_has_definite_height(true); + else + item.used_values.set_has_definite_width(true); +} + void FlexFormattingContext::set_main_size(Box const& box, CSSPixels size) { if (is_row_layout()) @@ -978,6 +996,12 @@ void FlexFormattingContext::resolve_flexible_lengths_for_line(FlexLine& line) for (auto& item : line.items) { item.main_size = item.target_main_size; set_main_size(item.box, item.target_main_size); + + // https://drafts.csswg.org/css-flexbox-1/#definite-sizes + // 1. If the flex container has a definite main size, then the post-flexing main sizes of its flex items are treated as definite. + // 2. If a flex item’s flex basis is definite, then its post-flexing main size is also definite. + if (has_definite_main_size(m_flex_container_state) || item.used_flex_basis_is_definite) + set_has_definite_main_size(item); } } diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h index e909af27ee..2f6c1130e9 100644 --- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h +++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h @@ -159,6 +159,9 @@ private: void set_main_axis_first_margin(FlexItem&, CSSPixels margin); void set_main_axis_second_margin(FlexItem&, CSSPixels margin); + void set_has_definite_main_size(FlexItem&); + void set_has_definite_cross_size(FlexItem&); + void copy_dimensions_from_flex_items_to_boxes(); void generate_anonymous_flex_items();