Changeset 271554 in webkit


Ignore:
Timestamp:
Jan 15, 2021 11:57:56 PM (3 years ago)
Author:
commit-queue@webkit.org
Message:

https://bugs.webkit.org/show_bug.cgi?id=220224
Support transferred min/max block size for aspect-ratio

Patch by Rob Buis <rbuis@igalia.com> on 2021-01-15
Reviewed by Darin Adler.

Source/WebCore:

Add logic to transfer min-height/max-height for minmax logical width
calculation in case aspect-ratio should be applied [1]. Both absolute
and normally positioned elements are handled.

[1] https://drafts.csswg.org/css-sizing-4/#aspect-ratio-size-transfers

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::constrainLogicalWidthInFragmentByMinMax const):
(WebCore::RenderBox::computePositionedLogicalWidth const):
(WebCore::RenderBox::computeMinMaxLogicalWidthFromAspectRatio const):

  • rendering/RenderBox.h:

LayoutTests:

Enable some tests that pass now.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r271553 r271554  
     12021-01-15  Rob Buis  <rbuis@igalia.com>
     2
     3        https://bugs.webkit.org/show_bug.cgi?id=220224
     4        Support transferred min/max block size for aspect-ratio
     5
     6        Reviewed by Darin Adler.
     7
     8        Enable some tests that pass now.
     9
     10        * TestExpectations:
     11
    1122021-01-15  Lauro Moura  <lmoura@igalia.com>
    213
  • trunk/LayoutTests/TestExpectations

    r271480 r271554  
    44084408webkit.org/b/214462 imported/w3c/web-platform-tests/css/css-scoping/slotted-placeholder.html [ ImageOnlyFailure ]
    44094409
    4410 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-008.html [ ImageOnlyFailure ]
    44114410webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-012.html [ ImageOnlyFailure ]
    44124411webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/abspos-013.html [ ImageOnlyFailure ]
     
    44164415webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-015.html [ ImageOnlyFailure ]
    44174416webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-017.html [ ImageOnlyFailure ]
    4418 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-020.html [ ImageOnlyFailure ]
    4419 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-021.html [ ImageOnlyFailure ]
    4420 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-023.html [ ImageOnlyFailure ]
    44214417webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-024.html [ ImageOnlyFailure ]
    4422 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-026.html [ ImageOnlyFailure ]
    4423 webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-027.html [ ImageOnlyFailure ]
    44244418webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/block-aspect-ratio-028.html [ ImageOnlyFailure ]
    44254419webkit.org/b/214463 imported/w3c/web-platform-tests/css/css-sizing/aspect-ratio/flex-aspect-ratio-001.html [ ImageOnlyFailure ]
  • trunk/Source/WebCore/ChangeLog

    r271551 r271554  
     12021-01-15  Rob Buis  <rbuis@igalia.com>
     2
     3        https://bugs.webkit.org/show_bug.cgi?id=220224
     4        Support transferred min/max block size for aspect-ratio
     5
     6        Reviewed by Darin Adler.
     7
     8        Add logic to transfer min-height/max-height for minmax logical width
     9        calculation in case aspect-ratio should be applied [1]. Both absolute
     10        and normally positioned elements are handled.
     11
     12        [1] https://drafts.csswg.org/css-sizing-4/#aspect-ratio-size-transfers
     13
     14        * rendering/RenderBox.cpp:
     15        (WebCore::RenderBox::constrainLogicalWidthInFragmentByMinMax const):
     16        (WebCore::RenderBox::computePositionedLogicalWidth const):
     17        (WebCore::RenderBox::computeMinMaxLogicalWidthFromAspectRatio const):
     18        * rendering/RenderBox.h:
     19
    1202021-01-15  Simon Fraser  <simon.fraser@apple.com>
    221
  • trunk/Source/WebCore/rendering/RenderBox.cpp

    r271516 r271554  
    644644{
    645645    const RenderStyle& styleToUse = style();
     646
     647    if (shouldComputeLogicalHeightFromAspectRatio()) {
     648        LayoutUnit logicalMinWidth, logicalMaxWidth;
     649        std::tie(logicalMinWidth, logicalMaxWidth) = computeMinMaxLogicalWidthFromAspectRatio();
     650        logicalWidth = std::max(logicalMinWidth, std::min(logicalWidth, logicalMaxWidth));
     651    }
     652
    646653    if (!styleToUse.logicalMaxWidth().isUndefined())
    647654        logicalWidth = std::min(logicalWidth, computeLogicalWidthInFragmentUsing(MaxSize, styleToUse.logicalMaxWidth(), availableWidth, cb, fragment));
     
    36263633                                       computedValues);
    36273634
     3635    LayoutUnit transferredMinSize = LayoutUnit::min();
     3636    LayoutUnit transferredMaxSize = LayoutUnit::max();
     3637    if (shouldComputeLogicalHeightFromAspectRatio())
     3638        std::tie(transferredMinSize, transferredMaxSize) = computeMinMaxLogicalWidthFromAspectRatio();
     3639
     3640    LogicalExtentComputedValues maxValues;
     3641    maxValues.m_extent = LayoutUnit::max();
    36283642    // Calculate constraint equation values for 'max-width' case.
    36293643    if (!style().logicalMaxWidth().isUndefined()) {
    3630         LogicalExtentComputedValues maxValues;
    3631 
    36323644        computePositionedLogicalWidthUsing(MaxSize, style().logicalMaxWidth(), containerBlock, containerDirection,
    36333645                                           containerLogicalWidth, bordersPlusPadding,
    36343646                                           logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
    36353647                                           maxValues);
    3636 
    3637         if (computedValues.m_extent > maxValues.m_extent) {
    3638             computedValues.m_extent = maxValues.m_extent;
    3639             computedValues.m_position = maxValues.m_position;
    3640             computedValues.m_margins.m_start = maxValues.m_margins.m_start;
    3641             computedValues.m_margins.m_end = maxValues.m_margins.m_end;
    3642         }
    3643     }
    3644 
     3648    }
     3649    if (transferredMaxSize < maxValues.m_extent) {
     3650        computePositionedLogicalWidthUsing(MaxSize, Length(transferredMaxSize, Fixed), containerBlock, containerDirection,
     3651            containerLogicalWidth, bordersPlusPadding,
     3652            logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
     3653            maxValues);
     3654    }
     3655    if (computedValues.m_extent > maxValues.m_extent) {
     3656        computedValues.m_extent = maxValues.m_extent;
     3657        computedValues.m_position = maxValues.m_position;
     3658        computedValues.m_margins.m_start = maxValues.m_margins.m_start;
     3659        computedValues.m_margins.m_end = maxValues.m_margins.m_end;
     3660    }
     3661
     3662    LogicalExtentComputedValues minValues;
     3663    minValues.m_extent = LayoutUnit::min();
    36453664    // Calculate constraint equation values for 'min-width' case.
    36463665    if (!style().logicalMinWidth().isZero() || style().logicalMinWidth().isIntrinsic()) {
    3647         LogicalExtentComputedValues minValues;
    3648 
    36493666        computePositionedLogicalWidthUsing(MinSize, style().logicalMinWidth(), containerBlock, containerDirection,
     3667            containerLogicalWidth, bordersPlusPadding,
     3668            logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
     3669            minValues);
     3670    }
     3671    if (transferredMinSize > minValues.m_extent) {
     3672        computePositionedLogicalWidthUsing(MinSize, Length(transferredMinSize, Fixed), containerBlock, containerDirection,
    36503673                                           containerLogicalWidth, bordersPlusPadding,
    36513674                                           logicalLeftLength, logicalRightLength, marginLogicalLeft, marginLogicalRight,
    36523675                                           minValues);
    3653 
    3654         if (computedValues.m_extent < minValues.m_extent) {
    3655             computedValues.m_extent = minValues.m_extent;
    3656             computedValues.m_position = minValues.m_position;
    3657             computedValues.m_margins.m_start = minValues.m_margins.m_start;
    3658             computedValues.m_margins.m_end = minValues.m_margins.m_end;
    3659         }
     3676    }
     3677    if (computedValues.m_extent < minValues.m_extent) {
     3678        computedValues.m_extent = minValues.m_extent;
     3679        computedValues.m_position = minValues.m_position;
     3680        computedValues.m_margins.m_start = minValues.m_margins.m_start;
     3681        computedValues.m_margins.m_end = minValues.m_margins.m_end;
    36603682    }
    36613683
     
    50345056}
    50355057
     5058std::pair<LayoutUnit, LayoutUnit> RenderBox::computeMinMaxLogicalWidthFromAspectRatio() const
     5059{
     5060    auto ratio = LayoutUnit { style().logicalAspectRatio() };
     5061    LayoutUnit blockMinSize = constrainLogicalHeightByMinMax(LayoutUnit(), WTF::nullopt);
     5062    LayoutUnit blockMaxSize = constrainLogicalHeightByMinMax(LayoutUnit::max(), WTF::nullopt);
     5063    LayoutUnit transferredMinSize = LayoutUnit();
     5064    LayoutUnit transferredMaxSize = LayoutUnit::max();
     5065    if (blockMinSize > LayoutUnit())
     5066        transferredMinSize = inlineSizeFromAspectRatio(horizontalBorderAndPaddingExtent(), verticalBorderAndPaddingExtent(), ratio, style().boxSizing(), blockMinSize);
     5067    if (blockMaxSize != LayoutUnit::max())
     5068        transferredMaxSize = inlineSizeFromAspectRatio(horizontalBorderAndPaddingExtent(), verticalBorderAndPaddingExtent(), ratio, style().boxSizing(), blockMaxSize);
     5069    // Minimum size wins over maximum size.
     5070    transferredMaxSize = std::max(transferredMaxSize, transferredMinSize);
     5071    return { transferredMinSize, transferredMaxSize };
     5072}
     5073
    50365074bool RenderBox::hasRelativeDimensions() const
    50375075{
  • trunk/Source/WebCore/rendering/RenderBox.h

    r271439 r271554  
    702702    bool shouldComputeLogicalWidthFromAspectRatioAndInsets() const;
    703703    LayoutUnit computeLogicalWidthFromAspectRatio(RenderFragmentContainer* = nullptr) const;
     704    std::pair<LayoutUnit, LayoutUnit> computeMinMaxLogicalWidthFromAspectRatio() const;
    704705
    705706    static LayoutUnit blockSizeFromAspectRatio(LayoutUnit borderPaddingInlineSum, LayoutUnit borderPaddingBlockSum, LayoutUnit aspectRatio, BoxSizing boxSizing, LayoutUnit inlineSize)
Note: See TracChangeset for help on using the changeset viewer.