Kaynağa Gözat

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.
Andreas Kling 2 yıl önce
ebeveyn
işleme
e65990f7a3

+ 18 - 5
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());
         main_available_space = specified_main_size(flex_container());
     } else {
     } else {
         if (has_main_max_size(flex_container())) {
         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())) {
         if (has_main_min_size(flex_container())) {
             main_min_size = specified_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());
         cross_available_space = specified_cross_size(flex_container());
     } else {
     } else {
         if (has_cross_max_size(flex_container())) {
         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())) {
         if (has_cross_min_size(flex_container())) {
             cross_min_size = specified_cross_min_size(flex_container());
             cross_min_size = specified_cross_min_size(flex_container());