Commit 711938b6 authored by David Grogan's avatar David Grogan Committed by Chromium LUCI CQ

[css-flex] Apply transferred min/max sizes to svg with no natural sizes

When deriving flex base size of an svg that has an aspect ratio but no
natural height or width, we were ignoring min/max sizes specified in the
cross-axis direction, even though they should transfer through the
aspect ratio and restrict the stretch fit into the available size.

Bug: 1162704
Change-Id: If502de43a876e41e6f3784aea089edcd2467ba60
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2614470Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Commit-Queue: David Grogan <dgrogan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#841586}
parent 77932dee
...@@ -439,10 +439,11 @@ LayoutUnit ComputeIntrinsicInlineSizeForAspectRatioElement( ...@@ -439,10 +439,11 @@ LayoutUnit ComputeIntrinsicInlineSizeForAspectRatioElement(
clamped_intrinsic_block_border_box); clamped_intrinsic_block_border_box);
} }
MinMaxSizes inline_min_max = ComputeTransferredMinMaxInlineSizes(
aspect_ratio, used_min_max_block_sizes, border_padding,
EBoxSizing::kContentBox);
if (intrinsic_inline) { if (intrinsic_inline) {
MinMaxSizes inline_min_max = ComputeTransferredMinMaxInlineSizes(
aspect_ratio, used_min_max_block_sizes, border_padding,
EBoxSizing::kContentBox);
LayoutUnit intrinsic_inline_border_box = LayoutUnit intrinsic_inline_border_box =
*intrinsic_inline + border_padding.InlineSum(); *intrinsic_inline + border_padding.InlineSum();
return inline_min_max.ClampSizeToMinAndMax(intrinsic_inline_border_box); return inline_min_max.ClampSizeToMinAndMax(intrinsic_inline_border_box);
...@@ -456,7 +457,9 @@ LayoutUnit ComputeIntrinsicInlineSizeForAspectRatioElement( ...@@ -456,7 +457,9 @@ LayoutUnit ComputeIntrinsicInlineSizeForAspectRatioElement(
// https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes // https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes
DCHECK_NE(space.AvailableSize().inline_size, kIndefiniteSize); DCHECK_NE(space.AvailableSize().inline_size, kIndefiniteSize);
NGBoxStrut margins = ComputeMarginsForSelf(space, style); NGBoxStrut margins = ComputeMarginsForSelf(space, style);
return (space.AvailableSize().inline_size - margins.InlineSum()) return inline_min_max
.ClampSizeToMinAndMax(space.AvailableSize().inline_size -
margins.InlineSum())
.ClampNegativeToZero(); .ClampNegativeToZero();
} }
...@@ -488,9 +491,6 @@ LayoutUnit ComputeIntrinsicBlockSizeForAspectRatioElement( ...@@ -488,9 +491,6 @@ LayoutUnit ComputeIntrinsicBlockSizeForAspectRatioElement(
} }
if (inline_size_border_box) { if (inline_size_border_box) {
// Clamping block size to the transferred inline min/max sizes might be
// uninentionally unspecified. See
// https://github.com/w3c/csswg-drafts/issues/5583
LayoutUnit clamped_intrinsic_inline_border_box = LayoutUnit clamped_intrinsic_inline_border_box =
used_min_max_inline_sizes.ClampSizeToMinAndMax(*inline_size_border_box); used_min_max_inline_sizes.ClampSizeToMinAndMax(*inline_size_border_box);
return BlockSizeFromAspectRatio(border_padding, aspect_ratio, return BlockSizeFromAspectRatio(border_padding, aspect_ratio,
...@@ -498,18 +498,18 @@ LayoutUnit ComputeIntrinsicBlockSizeForAspectRatioElement( ...@@ -498,18 +498,18 @@ LayoutUnit ComputeIntrinsicBlockSizeForAspectRatioElement(
clamped_intrinsic_inline_border_box); clamped_intrinsic_inline_border_box);
} }
MinMaxSizes transferred_block_min_max = {LayoutUnit(), LayoutUnit::Max()};
if (used_min_max_inline_sizes.min_size > LayoutUnit()) {
transferred_block_min_max.min_size = BlockSizeFromAspectRatio(
border_padding, aspect_ratio, EBoxSizing::kContentBox,
used_min_max_inline_sizes.min_size);
}
if (used_min_max_inline_sizes.max_size != LayoutUnit::Max()) {
transferred_block_min_max.max_size = BlockSizeFromAspectRatio(
border_padding, aspect_ratio, EBoxSizing::kContentBox,
used_min_max_inline_sizes.max_size);
}
if (intrinsic_block) { if (intrinsic_block) {
MinMaxSizes transferred_block_min_max = {LayoutUnit(), LayoutUnit::Max()};
if (used_min_max_inline_sizes.min_size > LayoutUnit()) {
transferred_block_min_max.min_size = BlockSizeFromAspectRatio(
border_padding, aspect_ratio, EBoxSizing::kContentBox,
used_min_max_inline_sizes.min_size);
}
if (used_min_max_inline_sizes.max_size != LayoutUnit::Max()) {
transferred_block_min_max.max_size = BlockSizeFromAspectRatio(
border_padding, aspect_ratio, EBoxSizing::kContentBox,
used_min_max_inline_sizes.max_size);
}
// Minimum size wins over maximum size. // Minimum size wins over maximum size.
transferred_block_min_max.max_size = std::max( transferred_block_min_max.max_size = std::max(
transferred_block_min_max.max_size, transferred_block_min_max.min_size); transferred_block_min_max.max_size, transferred_block_min_max.min_size);
...@@ -530,9 +530,10 @@ LayoutUnit ComputeIntrinsicBlockSizeForAspectRatioElement( ...@@ -530,9 +530,10 @@ LayoutUnit ComputeIntrinsicBlockSizeForAspectRatioElement(
LayoutUnit stretch_into_available_inline_size( LayoutUnit stretch_into_available_inline_size(
(space.AvailableSize().inline_size - margins.InlineSum()) (space.AvailableSize().inline_size - margins.InlineSum())
.ClampNegativeToZero()); .ClampNegativeToZero());
return BlockSizeFromAspectRatio(border_padding, aspect_ratio, return transferred_block_min_max.ClampSizeToMinAndMax(
EBoxSizing::kContentBox, BlockSizeFromAspectRatio(border_padding, aspect_ratio,
stretch_into_available_inline_size); EBoxSizing::kContentBox,
stretch_into_available_inline_size));
} }
} // namespace } // namespace
......
...@@ -70,6 +70,7 @@ crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-003.html [ ...@@ -70,6 +70,7 @@ crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-003.html [
crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html [ Failure ] crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-004.html [ Failure ] crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-004.html [ Failure ]
crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-004v.html [ Failure ] crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-004v.html [ Failure ]
crbug.com/1162704 external/wpt/css/css-flexbox/flex-aspect-ratio-img-row-015.html [ Failure ]
### external/wpt/css/css-fonts/ ### external/wpt/css/css-fonts/
crbug.com/591099 external/wpt/css/css-fonts/font-features-across-space-1.html [ Failure ] crbug.com/591099 external/wpt/css/css-fonts/font-features-across-space-1.html [ Failure ]
......
<!DOCTYPE html>
<title>SVG as flex item</title>
<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-main-item" title="Part E">
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#min-max-widths">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<meta name="assert" content="Flex base size of svg item with aspect ratio + no intrinsic width or height honors transferred max-width." />
<p>Test passes if there is a filled green square.</p>
<div style="display: flex; flex-direction: column; align-items: flex-start; width: 200px;">
<svg viewBox="0 0 1 1" style="max-width: 100px; background: green;"></svg>
</div>
<!DOCTYPE html>
<title>SVG as flex item</title>
<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-main-item" title="Part E">
<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#min-max-widths">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<meta name="assert" content="Flex base size of svg item with aspect ratio + no intrinsic width or height honors transferred max-height." />
<p>Test passes if there is a filled green square.</p>
<div style="display: flex; align-items: flex-start; height: 200px;">
<svg viewBox="0 0 1 1" style="max-height: 100px; background: green;"></svg>
</div>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment