Commit 4d3dc947 authored by Christian Biesinger's avatar Christian Biesinger Committed by Commit Bot

[AspectRatio] Support min-inline-size: auto with abspos

Unfortunately this required adding *another* parameter to
ComputeOutOfFlowInlineDimensions because we now need two
different MinMaxSizes.

R=ikilpatrick@chromium.org, mstensho@chromium.org

Bug: 1098475
Change-Id: If2c05ce09292bc856e04c7a18950fbdd35579572
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2430828
Auto-Submit: Christian Biesinger <cbiesinger@chromium.org>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarMorten Stenshorne <mstensho@chromium.org>
Commit-Queue: Christian Biesinger <cbiesinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811628}
parent 53373bfc
...@@ -425,19 +425,28 @@ void ComputeOutOfFlowInlineDimensions( ...@@ -425,19 +425,28 @@ void ComputeOutOfFlowInlineDimensions(
const ComputedStyle& style, const ComputedStyle& style,
const NGBoxStrut& border_padding, const NGBoxStrut& border_padding,
const NGLogicalStaticPosition& static_position, const NGLogicalStaticPosition& static_position,
const base::Optional<MinMaxSizes>& min_max_sizes, const base::Optional<MinMaxSizes>& minmax_content_sizes,
const base::Optional<MinMaxSizes>& minmax_intrinsic_sizes_for_ar,
const base::Optional<LogicalSize>& replaced_size, const base::Optional<LogicalSize>& replaced_size,
const WritingMode container_writing_mode, const WritingMode container_writing_mode,
const TextDirection container_direction, const TextDirection container_direction,
NGLogicalOutOfFlowDimensions* dimensions) { NGLogicalOutOfFlowDimensions* dimensions) {
DCHECK(dimensions); DCHECK(dimensions);
LayoutUnit min_inline_size = ResolveMinInlineLength( Length min_inline_length = style.LogicalMinWidth();
space, style, border_padding, min_max_sizes, style.LogicalMinWidth(), base::Optional<MinMaxSizes> min_size_minmax = minmax_content_sizes;
LengthResolvePhase::kLayout); // We don't need to check for IsInlineSizeComputableFromBlockSize; this is
// done by the caller.
if (minmax_intrinsic_sizes_for_ar) {
min_inline_length = Length::MinIntrinsic();
min_size_minmax = minmax_intrinsic_sizes_for_ar;
}
LayoutUnit min_inline_size =
ResolveMinInlineLength(space, style, border_padding, min_size_minmax,
min_inline_length, LengthResolvePhase::kLayout);
LayoutUnit max_inline_size = ResolveMaxInlineLength( LayoutUnit max_inline_size = ResolveMaxInlineLength(
space, style, border_padding, min_max_sizes, style.LogicalMaxWidth(), space, style, border_padding, minmax_content_sizes,
LengthResolvePhase::kLayout); style.LogicalMaxWidth(), LengthResolvePhase::kLayout);
// This implements the transferred min/max sizes per // This implements the transferred min/max sizes per
// https://drafts.csswg.org/css-sizing-4/#aspect-ratio // https://drafts.csswg.org/css-sizing-4/#aspect-ratio
...@@ -451,8 +460,9 @@ void ComputeOutOfFlowInlineDimensions( ...@@ -451,8 +460,9 @@ void ComputeOutOfFlowInlineDimensions(
bool is_table = style.IsDisplayTableBox(); bool is_table = style.IsDisplayTableBox();
base::Optional<LayoutUnit> inline_size; base::Optional<LayoutUnit> inline_size;
if (!style.LogicalWidth().IsAuto()) { if (!style.LogicalWidth().IsAuto()) {
LayoutUnit resolved_inline_size = ResolveMainInlineLength( LayoutUnit resolved_inline_size =
space, style, border_padding, min_max_sizes, style.LogicalWidth()); ResolveMainInlineLength(space, style, border_padding,
minmax_content_sizes, style.LogicalWidth());
// Tables use the inline-size as a minimum. // Tables use the inline-size as a minimum.
if (is_table) if (is_table)
...@@ -462,8 +472,8 @@ void ComputeOutOfFlowInlineDimensions( ...@@ -462,8 +472,8 @@ void ComputeOutOfFlowInlineDimensions(
} else if (replaced_size.has_value()) { } else if (replaced_size.has_value()) {
inline_size = replaced_size->inline_size; inline_size = replaced_size->inline_size;
} else if (IsInlineSizeComputableFromBlockSize(style)) { } else if (IsInlineSizeComputableFromBlockSize(style)) {
DCHECK(min_max_sizes.has_value()); DCHECK(minmax_content_sizes.has_value());
inline_size = min_max_sizes->min_size; inline_size = minmax_content_sizes->min_size;
} }
bool is_start_dominant; bool is_start_dominant;
...@@ -478,7 +488,7 @@ void ComputeOutOfFlowInlineDimensions( ...@@ -478,7 +488,7 @@ void ComputeOutOfFlowInlineDimensions(
} }
ComputeAbsoluteSize( ComputeAbsoluteSize(
border_padding.InlineSum(), min_max_sizes, border_padding.InlineSum(), minmax_content_sizes,
space.PercentageResolutionInlineSizeForParentWritingMode(), space.PercentageResolutionInlineSizeForParentWritingMode(),
space.AvailableSize().inline_size, style.MarginStart(), style.MarginEnd(), space.AvailableSize().inline_size, style.MarginStart(), style.MarginEnd(),
style.LogicalInlineStart(), style.LogicalInlineEnd(), min_inline_size, style.LogicalInlineStart(), style.LogicalInlineEnd(), min_inline_size,
......
...@@ -61,6 +61,8 @@ bool IsInlineSizeComputableFromBlockSize(const ComputedStyle& style); ...@@ -61,6 +61,8 @@ bool IsInlineSizeComputableFromBlockSize(const ComputedStyle& style);
// Computes part of the absolute position which depends on the child's // Computes part of the absolute position which depends on the child's
// inline-size. // inline-size.
// |minmax_intrinsic_size_for_ar| is only used for min-inline-size: auto in
// combination with aspect-ratio.
// |replaced_size| should be set if and only if element is replaced element. // |replaced_size| should be set if and only if element is replaced element.
// Returns the partially filled position. // Returns the partially filled position.
CORE_EXPORT void ComputeOutOfFlowInlineDimensions( CORE_EXPORT void ComputeOutOfFlowInlineDimensions(
...@@ -68,7 +70,8 @@ CORE_EXPORT void ComputeOutOfFlowInlineDimensions( ...@@ -68,7 +70,8 @@ CORE_EXPORT void ComputeOutOfFlowInlineDimensions(
const ComputedStyle&, const ComputedStyle&,
const NGBoxStrut& border_padding, const NGBoxStrut& border_padding,
const NGLogicalStaticPosition&, const NGLogicalStaticPosition&,
const base::Optional<MinMaxSizes>& child_minmax, const base::Optional<MinMaxSizes>& minmax_content_sizes,
const base::Optional<MinMaxSizes>& minmax_intrinsic_sizes_for_ar,
const base::Optional<LogicalSize>& replaced_size, const base::Optional<LogicalSize>& replaced_size,
const WritingMode container_writing_mode, const WritingMode container_writing_mode,
const TextDirection container_direction, const TextDirection container_direction,
......
...@@ -746,13 +746,16 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout( ...@@ -746,13 +746,16 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout(
bool should_be_considered_as_replaced = node.ShouldBeConsideredAsReplaced(); bool should_be_considered_as_replaced = node.ShouldBeConsideredAsReplaced();
bool absolute_needs_child_block_size = bool absolute_needs_child_block_size =
AbsoluteNeedsChildBlockSize(candidate_style); AbsoluteNeedsChildBlockSize(candidate_style);
base::Optional<MinMaxSizes> minmax_intrinsic_sizes_for_ar;
// We also include items with aspect ratio here, because if the inline size // We also include items with aspect ratio here, because if the inline size
// is auto and we have a definite block size, we want to use that for the // is auto and we have a definite block size, we want to use that for the
// inline size calculation. // inline size calculation.
bool compute_inline_from_ar =
IsInlineSizeComputableFromBlockSize(candidate_style);
if (AbsoluteNeedsChildInlineSize(candidate_style) || if (AbsoluteNeedsChildInlineSize(candidate_style) ||
NeedMinMaxSize(candidate_style) || should_be_considered_as_replaced || NeedMinMaxSize(candidate_style) || should_be_considered_as_replaced ||
IsInlineSizeComputableFromBlockSize(candidate_style)) { compute_inline_from_ar) {
MinMaxSizesInput input(kIndefiniteSize, MinMaxSizesType::kContent); MinMaxSizesInput input(kIndefiniteSize, MinMaxSizesType::kContent);
if (is_replaced) { if (is_replaced) {
input.percentage_resolution_block_size = input.percentage_resolution_block_size =
...@@ -767,6 +770,15 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout( ...@@ -767,6 +770,15 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout(
has_computed_block_dimensions = true; has_computed_block_dimensions = true;
input.percentage_resolution_block_size = node_dimensions.size.block_size; input.percentage_resolution_block_size = node_dimensions.size.block_size;
} }
if (compute_inline_from_ar &&
candidate_style.OverflowInlineDirection() == EOverflow::kVisible) {
MinMaxSizesInput intrinsic_input(input);
intrinsic_input.type = MinMaxSizesType::kIntrinsic;
minmax_intrinsic_sizes_for_ar =
node.ComputeMinMaxSizes(candidate_writing_mode, intrinsic_input,
&candidate_constraint_space)
.sizes;
}
min_max_sizes = node.ComputeMinMaxSizes(candidate_writing_mode, input, min_max_sizes = node.ComputeMinMaxSizes(candidate_writing_mode, input,
&candidate_constraint_space) &candidate_constraint_space)
...@@ -798,10 +810,11 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout( ...@@ -798,10 +810,11 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout(
kIndefiniteSize}; kIndefiniteSize};
} }
ComputeOutOfFlowInlineDimensions( ComputeOutOfFlowInlineDimensions(candidate_constraint_space, candidate_style,
candidate_constraint_space, candidate_style, border_padding, border_padding, candidate_static_position,
candidate_static_position, min_max_sizes, replaced_size, min_max_sizes, minmax_intrinsic_sizes_for_ar,
default_writing_mode, container_direction, &node_dimensions); replaced_size, default_writing_mode,
container_direction, &node_dimensions);
// |should_be_considered_as_replaced| sets the inline-size. // |should_be_considered_as_replaced| sets the inline-size.
// It does not set the block-size. This is a compatibility quirk. // It does not set the block-size. This is a compatibility quirk.
......
...@@ -273,7 +273,6 @@ crbug.com/1004547 external/wpt/intersection-observer/cross-origin-iframe.sub.htm ...@@ -273,7 +273,6 @@ crbug.com/1004547 external/wpt/intersection-observer/cross-origin-iframe.sub.htm
crbug.com/1007229 external/wpt/intersection-observer/same-origin-grand-child-iframe.sub.html [ Pass Failure ] crbug.com/1007229 external/wpt/intersection-observer/same-origin-grand-child-iframe.sub.html [ Pass Failure ]
# Not supported yet # Not supported yet
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/abspos-013.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-013.tentative.html [ Failure ] crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-013.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-014.tentative.html [ Failure ] crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-014.tentative.html [ Failure ]
crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/replaced-element-016.tentative.html [ Failure ] crbug.com/1045668 external/wpt/css/css-sizing/aspect-ratio/replaced-element-016.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