[css-flex] Fix auto min size and flex basis for some a-r items
Transferred size suggestion and max-content size could go below
border_padding for box-sizing:border-box aspect-ratio elements.
This patch just floors those values by border_padding.
Fixed: 1240795
Change-Id: I5a04a80905c13f96c97413b1c1681707585a9a56
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3187278
Reviewed-by: Ian Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: Christian Biesinger <cbiesinger@chromium.org>
Commit-Queue: David Grogan <dgrogan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#927472}
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
index d864ad2..43f4ff8 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -239,7 +239,9 @@
EBoxSizing box_sizing,
LayoutUnit block_size) {
if (box_sizing == EBoxSizing::kBorderBox) {
- return LayoutUnit::FromDoubleRound(block_size * logical_aspect_ratio);
+ return std::max(
+ border_padding.InlineSum(),
+ LayoutUnit::FromDoubleRound(block_size * logical_aspect_ratio));
}
return LayoutUnit::FromDoubleRound((block_size - border_padding.BlockSum()) *
@@ -252,7 +254,9 @@
EBoxSizing box_sizing,
LayoutUnit block_size) {
if (box_sizing == EBoxSizing::kBorderBox) {
- return block_size.MulDiv(aspect_ratio.inline_size, aspect_ratio.block_size);
+ return std::max(
+ border_padding.InlineSum(),
+ block_size.MulDiv(aspect_ratio.inline_size, aspect_ratio.block_size));
}
block_size -= border_padding.BlockSum();
return block_size.MulDiv(aspect_ratio.inline_size, aspect_ratio.block_size) +
@@ -265,7 +269,9 @@
EBoxSizing box_sizing,
LayoutUnit inline_size) {
if (box_sizing == EBoxSizing::kBorderBox) {
- return LayoutUnit::FromDoubleRound(inline_size * logical_aspect_ratio);
+ return std::max(
+ border_padding.BlockSum(),
+ LayoutUnit::FromDoubleRound(inline_size * logical_aspect_ratio));
}
return LayoutUnit::FromDoubleRound(
@@ -280,8 +286,9 @@
LayoutUnit inline_size) {
DCHECK_GE(inline_size, border_padding.InlineSum());
if (box_sizing == EBoxSizing::kBorderBox) {
- return inline_size.MulDiv(aspect_ratio.block_size,
- aspect_ratio.inline_size);
+ return std::max(
+ border_padding.BlockSum(),
+ inline_size.MulDiv(aspect_ratio.block_size, aspect_ratio.inline_size));
}
inline_size -= border_padding.InlineSum();
return inline_size.MulDiv(aspect_ratio.block_size, aspect_ratio.inline_size) +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-031.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-031.html
new file mode 100644
index 0000000..5bd4a9d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-031.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>aspect-ratio flex item</title>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio-automatic">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" />
+<meta name="assert" content="There's enough space for padding after transferring flex-imposed definite height through the aspect ratio for a border-box flex item.">
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="display: flex; height: 50px;">
+ <div style="padding-left: 100px; box-sizing: border-box; aspect-ratio: 1/1; background: green;"></div>
+</div>
+<div style="width: 100px; height: 50px; background: green"></div>