Commit 11c4d311 authored by Christian Biesinger's avatar Christian Biesinger Committed by Commit Bot

[AspectRatio] Implement transferred min/max block size in legacy

R=ikilpatrick@chromium.org

Bug: 1083010
Change-Id: I031dcc1847a0e5e7309b78c9f1db63dac8e267c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2398909Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarMorten Stenshorne <mstensho@chromium.org>
Commit-Queue: Christian Biesinger <cbiesinger@chromium.org>
Auto-Submit: Christian Biesinger <cbiesinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#806123}
parent b763d39c
......@@ -1068,6 +1068,18 @@ LayoutUnit LayoutBox::ConstrainLogicalWidthByMinMax(
LayoutUnit available_width,
const LayoutBlock* cb) const {
const ComputedStyle& style_to_use = StyleRef();
// This implements the transferred min/max sizes per
// https://drafts.csswg.org/css-sizing-4/#aspect-ratio
Length h = style_to_use.LogicalHeight();
if (style_to_use.AspectRatio() &&
(h.IsAuto() || (h.IsPercentOrCalc() &&
ComputePercentageLogicalHeight(h) == kIndefiniteSize))) {
MinMaxSizes transferred_min_max =
ComputeMinMaxLogicalWidthFromAspectRatio();
logical_width = transferred_min_max.ClampSizeToMinAndMax(logical_width);
}
if (!style_to_use.LogicalMaxWidth().IsNone())
logical_width = std::min(
logical_width,
......@@ -1259,6 +1271,44 @@ bool LayoutBox::CanResize() const {
StyleRef().HasResize();
}
MinMaxSizes LayoutBox::ComputeMinMaxLogicalWidthFromAspectRatio() const {
DCHECK(StyleRef().LogicalAspectRatio());
// The spec requires us to clamp these by the specified size (it calls it the
// preferred size). However, we actually don't need to worry about that,
// because we only use this if the width is indefinite.
// We do not need to compute the min/max inline sizes; as long as we always
// apply the transferred min/max size before the explicit min/max size, the
// result will be identical.
LogicalSize ratio = *StyleRef().LogicalAspectRatio();
MinMaxSizes block_min_max{
ConstrainLogicalHeightByMinMax(LayoutUnit(), kIndefiniteSize),
ConstrainLogicalHeightByMinMax(LayoutUnit::Max(), kIndefiniteSize)};
if (block_min_max.max_size == kIndefiniteSize)
block_min_max.max_size = LayoutUnit::Max();
NGBoxStrut border_padding(BorderStart() + ComputedCSSPaddingStart(),
BorderEnd() + ComputedCSSPaddingEnd(),
BorderBefore() + ComputedCSSPaddingBefore(),
BorderAfter() + ComputedCSSPaddingAfter());
MinMaxSizes transferred_min_max = {LayoutUnit(), LayoutUnit::Max()};
if (block_min_max.min_size > LayoutUnit()) {
transferred_min_max.min_size = InlineSizeFromAspectRatio(
border_padding, ratio, StyleRef().BoxSizing(), block_min_max.min_size);
}
if (block_min_max.max_size != LayoutUnit::Max()) {
transferred_min_max.max_size = InlineSizeFromAspectRatio(
border_padding, ratio, StyleRef().BoxSizing(), block_min_max.max_size);
}
// Minimum size wins over maximum size.
transferred_min_max.max_size =
std::max(transferred_min_max.max_size, transferred_min_max.min_size);
return transferred_min_max;
}
bool LayoutBox::HasScrollbarGutters(ScrollbarOrientation orientation) const {
if (StyleRef().ScrollbarGutterIsAuto())
return false;
......@@ -3564,9 +3614,10 @@ bool LayoutBox::ComputeLogicalWidthFromAspectRatio(
LayoutUnit container_width_in_inline_direction =
ContainerWidthInInlineDirection();
NGBoxStrut border_padding(
BorderStart() + PaddingStart(), BorderEnd() + PaddingEnd(),
BorderBefore() + PaddingBefore(), BorderAfter() + PaddingAfter());
NGBoxStrut border_padding(BorderStart() + ComputedCSSPaddingStart(),
BorderEnd() + ComputedCSSPaddingEnd(),
BorderBefore() + ComputedCSSPaddingBefore(),
BorderAfter() + ComputedCSSPaddingAfter());
LayoutUnit logical_width = InlineSizeFromAspectRatio(
border_padding, *StyleRef().LogicalAspectRatio(), StyleRef().BoxSizing(),
logical_height_for_ar);
......@@ -4149,9 +4200,10 @@ void LayoutBox::ComputeLogicalHeight(
if (StyleRef().AspectRatio() &&
(h.IsAuto() || (h.IsPercentOrCalc() && ComputePercentageLogicalHeight(
h) == kIndefiniteSize))) {
NGBoxStrut border_padding(
BorderStart() + PaddingStart(), BorderEnd() + PaddingEnd(),
BorderBefore() + PaddingBefore(), BorderAfter() + PaddingAfter());
NGBoxStrut border_padding(BorderStart() + ComputedCSSPaddingStart(),
BorderEnd() + ComputedCSSPaddingEnd(),
BorderBefore() + ComputedCSSPaddingBefore(),
BorderAfter() + ComputedCSSPaddingAfter());
height_result = BlockSizeFromAspectRatio(
border_padding, *StyleRef().LogicalAspectRatio(),
StyleRef().BoxSizing(), LogicalWidth());
......
......@@ -494,6 +494,8 @@ class CORE_EXPORT LayoutBox : public LayoutBoxModelObject {
LayoutUnit ContainerWidthInInlineDirection() const;
bool ComputeLogicalWidthFromAspectRatio(LayoutUnit* logical_width) const;
MinMaxSizes ComputeMinMaxLogicalWidthFromAspectRatio() const;
// Like most of the other box geometries, visual and layout overflow are also
// in the "physical coordinates in flipped block-flow direction" of the box.
LayoutRect NoOverflowRect() const;
......
......@@ -132,13 +132,7 @@ crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-00
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-014.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-015.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-017.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-020.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-021.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-023.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-024.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-025.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-026.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-027.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-028.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-008.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-009.tentative.html [ Failure ]
......
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