From 8b4d09932aa0a8476bd29a4da31cca051a1b2948 Mon Sep 17 00:00:00 2001 From: Enver Balalic Date: Wed, 30 Mar 2022 19:50:57 +0200 Subject: LibWeb: Fix sizing of flex child that has flex-basis 0 Before if an element didn't have a main min size we would clamp it to a literal zero. If that element also had a flex-basis 0 it's width would end up being 0. This patch adds a determine_min_main_size_of_child function that will calculate the minimum main size for the box based on the content of the box. We use the result of that function now instead of clamping the element main min size to 0. This also adds one more box to the flex.html test page, which is the same flex: 0 0 0 box but with flex-direction: column. --- Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp | 7 ++++++- Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'Userland/Libraries') diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp index 6583c25efb..0070686d2c 100644 --- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp @@ -565,11 +565,16 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size( }(); // The hypothetical main size is the item’s flex base size clamped according to its used min and max main sizes (and flooring the content box size at zero). - auto clamp_min = has_main_min_size(child_box) ? specified_main_min_size(child_box) : 0; + auto clamp_min = has_main_min_size(child_box) ? specified_main_min_size(child_box) : determine_min_main_size_of_child(child_box); auto clamp_max = has_main_max_size(child_box) ? specified_main_max_size(child_box) : NumericLimits::max(); flex_item.hypothetical_main_size = clamp(flex_item.flex_base_size, clamp_min, clamp_max); } +float FlexFormattingContext::determine_min_main_size_of_child(Box const& box) +{ + return is_row_layout() ? calculate_min_and_max_content_width(box).min_content_size : calculate_min_and_max_content_height(box).min_content_size; +} + // https://www.w3.org/TR/css-flexbox-1/#algo-main-container void FlexFormattingContext::determine_main_size_of_flex_container(bool const main_is_constrained, float const main_min_size, float const main_max_size) { diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h index 2feedbb122..d6d50bb2a1 100644 --- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h +++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.h @@ -79,6 +79,7 @@ private: bool has_main_max_size(Box const&) const; bool has_cross_max_size(Box const&) const; float sum_of_margin_padding_border_in_main_axis(Box const&) const; + float determine_min_main_size_of_child(Box const& box); void set_main_size(Box const&, float size); void set_cross_size(Box const&, float size); -- cgit v1.2.3