From e65990f7a30cb9a85e34b1761ea2a9f2e8d75b9b Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 27 Aug 2022 11:44:10 +0200 Subject: [PATCH] LibWeb: Treat cyclic percentage max-size as "auto" on the flex container This allows things like `max-width: 100%` to work on flex containers whose containing blocks themselves have automatic width. --- .../LibWeb/Layout/FlexFormattingContext.cpp | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp index 8fb51518c01..74ce95d209a 100644 --- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp @@ -541,9 +541,15 @@ void FlexFormattingContext::determine_available_main_and_cross_space(bool& main_ main_available_space = specified_main_size(flex_container()); } else { if (has_main_max_size(flex_container())) { - main_max_size = specified_main_max_size(flex_container()); - main_available_space = main_max_size; - main_is_constrained = true; + bool main_max_size_behaves_like_auto = false; + if (computed_main_max_size(flex_container()).is_percentage()) + main_max_size_behaves_like_auto = !has_definite_main_size(*flex_container().containing_block()); + + if (!main_max_size_behaves_like_auto) { + main_max_size = specified_main_max_size(flex_container()); + main_available_space = main_max_size; + main_is_constrained = true; + } } if (has_main_min_size(flex_container())) { main_min_size = specified_main_min_size(flex_container()); @@ -567,8 +573,15 @@ void FlexFormattingContext::determine_available_main_and_cross_space(bool& main_ cross_available_space = specified_cross_size(flex_container()); } else { if (has_cross_max_size(flex_container())) { - cross_max_size = specified_cross_max_size(flex_container()); - cross_is_constrained = true; + + bool cross_max_size_behaves_like_auto = false; + if (computed_cross_max_size(flex_container()).is_percentage()) + cross_max_size_behaves_like_auto = !has_definite_cross_size(*flex_container().containing_block()); + + if (!cross_max_size_behaves_like_auto) { + cross_max_size = specified_cross_max_size(flex_container()); + cross_is_constrained = true; + } } if (has_cross_min_size(flex_container())) { cross_min_size = specified_cross_min_size(flex_container());