Changeset 274068 in webkit


Ignore:
Timestamp:
Mar 8, 2021 4:37:46 AM (17 months ago)
Author:
commit-queue@webkit.org
Message:

Support aspect-ratio in intrinsic sizing
https://bugs.webkit.org/show_bug.cgi?id=220861

Patch by Rob Buis <rbuis@igalia.com> on 2021-03-08
Reviewed by Antti Koivisto.

Source/WebCore:

Support aspect-ratio in intrinsic sizing calculations.
The values min-content/max-content/fit-content
get set a value through aspect-ratio [1].
However min-width:auto is special, it should take content
into account [2]. In order to support this, compute
logical (intrinsic) width using MinIntrinsic, since staying
with MinContent/MaxContent would cause an infinite loop.

Behavior matches Firefox and Chrome.

[1] https://www.w3.org/TR/css-sizing-4/#propdef-aspect-ratio
[2] https://www.w3.org/TR/css-sizing-4/#aspect-ratio-minimum

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::computePreferredLogicalWidths):
Compute child min/max pref widths from aspect-ratio if it applies.

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::constrainLogicalWidthInFragmentByMinMax const):
Add an allowIntrinsic parameter to prevent recursion.
(WebCore::RenderBox::computeIntrinsicLogicalWidthUsing const):
Compute intrinsic logical width from aspect ratio if possible.
(WebCore::RenderBox::computeLogicalWidthInFragmentUsing const):
(WebCore::RenderBox::shouldComputeLogicalHeightFromAspectRatio const):
min/max/fit-content in the block axis is treated as auto.
(WebCore::RenderBox::computeLogicalWidthFromAspectRatio const):
Prevent recursion by passing false for allowIntrinsic.

  • rendering/RenderBox.h:

LayoutTests:

Enable tests that pass now.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r274066 r274068  
     12021-03-08  Rob Buis  <rbuis@igalia.com>
     2
     3        Support aspect-ratio in intrinsic sizing
     4        https://bugs.webkit.org/show_bug.cgi?id=220861
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Enable tests that pass now.
     9
     10        * TestExpectations:
     11
    1122021-03-08  Kimmo Kinnunen  <kkinnunen@apple.com>
    213
  • trunk/LayoutTests/TestExpectations

    r274066 r274068  
    45554555webkit.org/b/214462 imported/w3c/web-platform-tests/css/css-scoping/slotted-placeholder.html [ ImageOnlyFailure ]
    45564556
     4557#  contain-intrinsic-size
    45574558webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-014.html [ ImageOnlyFailure ]
    45584559webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-024.html [ ImageOnlyFailure ]
     
    45634564webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/flex-aspect-ratio-025.html [ ImageOnlyFailure ]
    45644565webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/flex-aspect-ratio-026.html [ ImageOnlyFailure ]
    4565 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-015.html [ ImageOnlyFailure ]
    4566 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-016.html [ ImageOnlyFailure ]
    4567 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/grid-aspect-ratio-017.html [ ImageOnlyFailure ]
    4568 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-001.html [ ImageOnlyFailure ]
    4569 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-002.html [ ImageOnlyFailure ]
    4570 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-004.html [ ImageOnlyFailure ]
    45714566webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-005.html [ ImageOnlyFailure ]
    4572 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-006.html [ ImageOnlyFailure ]
    45734567webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-008.html [ ImageOnlyFailure ]
    4574 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-010.html [ ImageOnlyFailure ]
    4575 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-011.html [ ImageOnlyFailure ]
    4576 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-012.html [ ImageOnlyFailure ]
    4577 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-013.html [ ImageOnlyFailure ]
    4578 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-014.html [ ImageOnlyFailure ]
    4579 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/intrinsic-size-015.html [ ImageOnlyFailure ]
    45804568webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/table-element-001.html [ ImageOnlyFailure ]
    45814569webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-001.html [ ImageOnlyFailure ]
  • trunk/Source/WebCore/ChangeLog

    r274067 r274068  
     12021-03-08  Rob Buis  <rbuis@igalia.com>
     2
     3        Support aspect-ratio in intrinsic sizing
     4        https://bugs.webkit.org/show_bug.cgi?id=220861
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Support aspect-ratio in intrinsic sizing calculations.
     9        The values min-content/max-content/fit-content
     10        get set a value through aspect-ratio [1].
     11        However min-width:auto is special, it should take content
     12        into account [2]. In order to support this, compute
     13        logical (intrinsic) width using MinIntrinsic, since staying
     14        with MinContent/MaxContent would cause an infinite loop.
     15
     16        Behavior matches Firefox and Chrome.
     17
     18        [1] https://www.w3.org/TR/css-sizing-4/#propdef-aspect-ratio
     19        [2] https://www.w3.org/TR/css-sizing-4/#aspect-ratio-minimum
     20
     21        * rendering/RenderBlock.cpp:
     22        (WebCore::RenderBlock::computePreferredLogicalWidths):
     23        Compute child min/max pref widths from aspect-ratio if it applies.
     24        * rendering/RenderBox.cpp:
     25        (WebCore::RenderBox::constrainLogicalWidthInFragmentByMinMax const):
     26        Add an allowIntrinsic parameter to prevent recursion.
     27        (WebCore::RenderBox::computeIntrinsicLogicalWidthUsing const):
     28        Compute intrinsic logical width from aspect ratio if possible.
     29        (WebCore::RenderBox::computeLogicalWidthInFragmentUsing const):
     30        (WebCore::RenderBox::shouldComputeLogicalHeightFromAspectRatio const):
     31        min/max/fit-content in the block axis is treated as auto.
     32        (WebCore::RenderBox::computeLogicalWidthFromAspectRatio const):
     33        Prevent recursion by passing false for allowIntrinsic.
     34        * rendering/RenderBox.h:
     35
    1362021-03-08  Ian Gilbert  <iang@apple.com>
    237
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r273647 r274068  
    22832283        && !(isDeprecatedFlexItem() && !styleToUse.logicalWidth().intValue()))
    22842284        m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(styleToUse.logicalWidth());
     2285    else if (shouldComputeLogicalWidthFromAspectRatio())
     2286        m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeLogicalWidthFromAspectRatio();
    22852287    else
    22862288        computeIntrinsicLogicalWidths(m_minPreferredLogicalWidth, m_maxPreferredLogicalWidth);
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r273764 r274068  
    652652}
    653653
    654 LayoutUnit RenderBox::constrainLogicalWidthInFragmentByMinMax(LayoutUnit logicalWidth, LayoutUnit availableWidth, RenderBlock& cb, RenderFragmentContainer* fragment) const
     654LayoutUnit RenderBox::constrainLogicalWidthInFragmentByMinMax(LayoutUnit logicalWidth, LayoutUnit availableWidth, RenderBlock& cb, RenderFragmentContainer* fragment, AllowIntrinsic allowIntrinsic) const
    655655{
    656656    const RenderStyle& styleToUse = style();
     
    661661    }
    662662
    663     if (!styleToUse.logicalMaxWidth().isUndefined())
     663    if (!styleToUse.logicalMaxWidth().isUndefined() && (allowIntrinsic == AllowIntrinsic::Yes || !styleToUse.logicalMaxWidth().isIntrinsic()))
    664664        logicalWidth = std::min(logicalWidth, computeLogicalWidthInFragmentUsing(MaxSize, styleToUse.logicalMaxWidth(), availableWidth, cb, fragment));
     665    if (allowIntrinsic == AllowIntrinsic::No && styleToUse.logicalMinWidth().isIntrinsic())
     666        return logicalWidth;
    665667    auto minLength = styleToUse.logicalMinWidth();
    666     if (styleToUse.hasAspectRatio() && styleToUse.logicalWidth().isAuto() && minLength.isAuto() && styleToUse.overflowInlineDirection() == Overflow::Visible) {
     668    if (styleToUse.hasAspectRatio() && minLength.isAuto() && (styleToUse.logicalWidth().isAuto() || styleToUse.logicalWidth().isMinContent() || styleToUse.logicalWidth().isMaxContent()) && styleToUse.overflowInlineDirection() == Overflow::Visible) {
    667669        // Make sure we actually used the aspect ratio.
    668670        if (shouldComputeLogicalWidthFromAspectRatio())
    669             minLength = Length(LengthType::MinContent);
     671            minLength = Length(LengthType::MinIntrinsic);
    670672    }
    671673    return std::max(logicalWidth, computeLogicalWidthInFragmentUsing(MinSize, minLength, availableWidth, cb, fragment));
     
    26132615    LayoutUnit minLogicalWidth;
    26142616    LayoutUnit maxLogicalWidth;
    2615     computeIntrinsicLogicalWidths(minLogicalWidth, maxLogicalWidth);
    2616 
    2617     if (logicalWidthLength.isMinContent())
     2617    if (!logicalWidthLength.isMinIntrinsic() && shouldComputeLogicalWidthFromAspectRatio())
     2618        minLogicalWidth = maxLogicalWidth = computeLogicalWidthFromAspectRatio();
     2619    else
     2620        computeIntrinsicLogicalWidths(minLogicalWidth, maxLogicalWidth);
     2621
     2622    if (logicalWidthLength.isMinContent() || logicalWidthLength.isMinIntrinsic())
    26182623        return minLogicalWidth + borderAndPadding;
    26192624
     
    26432648    }
    26442649
    2645     if (logicalWidth.isIntrinsic())
     2650    if (logicalWidth.isIntrinsic() || logicalWidth.isMinIntrinsic())
    26462651        return computeIntrinsicLogicalWidthUsing(logicalWidth, availableLogicalWidth, borderAndPaddingLogicalWidth());
    26472652
     
    50995104
    51005105    auto h = style().logicalHeight();
    5101     return h.isAuto() || (!isOutOfFlowPositioned() && h.isPercentOrCalculated() && !percentageLogicalHeightIsResolvable());
     5106    return h.isAuto() || h.isIntrinsic() || (!isOutOfFlowPositioned() && h.isPercentOrCalculated() && !percentageLogicalHeightIsResolvable());
    51025107}
    51035108
     
    51355140
    51365141    LayoutUnit containerWidthInInlineDirection = std::max<LayoutUnit>(0, containingBlockLogicalWidthForContentInFragment(fragment));
    5137     return constrainLogicalWidthInFragmentByMinMax(logicalWidth, containerWidthInInlineDirection, *containingBlock(), fragment);
     5142    return constrainLogicalWidthInFragmentByMinMax(logicalWidth, containerWidthInInlineDirection, *containingBlock(), fragment, AllowIntrinsic::No);
    51385143}
    51395144
  • trunk/Source/WebCore/rendering/RenderBox.h

    r273073 r274068  
    8686    LayoutUnit logicalHeight() const { return style().isHorizontalWritingMode() ? height() : width(); }
    8787
    88     LayoutUnit constrainLogicalWidthInFragmentByMinMax(LayoutUnit, LayoutUnit, RenderBlock&, RenderFragmentContainer* = nullptr) const;
     88    enum class AllowIntrinsic { Yes, No };
     89    LayoutUnit constrainLogicalWidthInFragmentByMinMax(LayoutUnit, LayoutUnit, RenderBlock&, RenderFragmentContainer*, AllowIntrinsic = AllowIntrinsic::Yes) const;
    8990    LayoutUnit constrainLogicalHeightByMinMax(LayoutUnit logicalHeight, Optional<LayoutUnit> intrinsicContentHeight) const;
    9091    LayoutUnit constrainContentBoxLogicalHeightByMinMax(LayoutUnit logicalHeight, Optional<LayoutUnit> intrinsicContentHeight) const;
Note: See TracChangeset for help on using the changeset viewer.