소스 검색

LibWeb: Fix application of intrinsic aspect ratio to flex column items

The intrinsic aspect ratio of a box is a width:height ratio, so if we
have the width and need the height, we should divide, not multiply. :^)
Andreas Kling 2 년 전
부모
커밋
9cded6e1b5

+ 4 - 0
Tests/LibWeb/Layout/expected/flex-item-with-intrinsic-aspect-ratio.txt

@@ -0,0 +1,4 @@
+Viewport <#document> at (0,0) content-size 800x600 children: not-inline
+  BlockContainer <html> at (0,0) content-size 800x200 children: not-inline
+    Box <body> at (0,0) content-size 400x200 flex-container(column) children: not-inline
+      ImageBox <img> at (0,0) content-size 400x200 flex-item children: not-inline

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 10 - 0
Tests/LibWeb/Layout/input/flex-item-with-intrinsic-aspect-ratio.html


+ 6 - 2
Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp

@@ -614,7 +614,9 @@ void FlexFormattingContext::determine_flex_base_size_and_hypothetical_main_size(
             && item.used_flex_basis.type == CSS::FlexBasis::Content
             && has_definite_cross_size(item.box)) {
             // flex_base_size is calculated from definite cross size and intrinsic aspect ratio
-            return resolved_definite_cross_size(item) * item.box->intrinsic_aspect_ratio().value();
+            if (is_row_layout())
+                return inner_cross_size(item.box) * item.box->intrinsic_aspect_ratio().value();
+            return inner_cross_size(item.box) / item.box->intrinsic_aspect_ratio().value();
         }
 
         // C. If the used flex basis is content or depends on its available space,
@@ -724,7 +726,9 @@ Optional<CSSPixels> FlexFormattingContext::transferred_size_suggestion(FlexItem
     if (item.box->has_intrinsic_aspect_ratio() && has_definite_cross_size(item.box)) {
         auto aspect_ratio = item.box->intrinsic_aspect_ratio().value();
         // FIXME: Clamp cross size to min/max cross size before this conversion.
-        return resolved_definite_cross_size(item) * aspect_ratio;
+        if (is_row_layout())
+            return resolved_definite_cross_size(item) * aspect_ratio;
+        return resolved_definite_cross_size(item) / aspect_ratio;
     }
 
     // It is otherwise undefined.

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.