Changeset 292465 in webkit


Ignore:
Timestamp:
Apr 6, 2022 8:02:01 AM (2 years ago)
Author:
Alan Bujtas
Message:

[CSS-Contain] Grid layout should take "contain: inline-size" into account when computing the grid item's logical width
https://bugs.webkit.org/show_bug.cgi?id=238850

Reviewed by Antti Koivisto.

Source/WebCore:

Ignore grid item's logical width when "contain: inline-size" is present (i.e. ignore descendant content in inline direction when sizing).

  • rendering/GridTrackSizingAlgorithm.cpp:

(WebCore::GridTrackSizingAlgorithm::computeGridContainerIntrinsicSizes):
(WebCore::GridTrackSizingAlgorithmStrategy::minContentForChild const):
(WebCore::GridTrackSizingAlgorithmStrategy::maxContentForChild const):
(WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
(WebCore::GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild const):
(WebCore::GridTrackSizingAlgorithm::advanceNextState):

  • rendering/GridTrackSizingAlgorithm.h:
  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::layoutBlock):
(WebCore::RenderGrid::computeEmptyTracksForAutoRepeat const):

LayoutTests:

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r292463 r292465  
     12022-04-06  Alan Bujtas  <zalan@apple.com>
     2
     3        [CSS-Contain] Grid layout should take "contain: inline-size" into account when computing the grid item's logical width
     4        https://bugs.webkit.org/show_bug.cgi?id=238850
     5
     6        Reviewed by Antti Koivisto.
     7
     8        * TestExpectations:
     9
    1102022-04-06  Oriol Brufau  <obrufau@igalia.com>
    211
  • trunk/LayoutTests/TestExpectations

    r292432 r292465  
    46414641# CSS containment tests that fail
    46424642imported/w3c/web-platform-tests/css/css-contain/contain-inline-size-bfc-floats-001.html [ ImageOnlyFailure ]
    4643 imported/w3c/web-platform-tests/css/css-contain/contain-inline-size-grid.html [ ImageOnlyFailure ]
    46444643# webkit-ruby-text
    46454644imported/w3c/web-platform-tests/css/css-contain/contain-layout-017.html [ ImageOnlyFailure ]
  • trunk/Source/WebCore/ChangeLog

    r292463 r292465  
     12022-04-06  Alan Bujtas  <zalan@apple.com>
     2
     3        [CSS-Contain] Grid layout should take "contain: inline-size" into account when computing the grid item's logical width
     4        https://bugs.webkit.org/show_bug.cgi?id=238850
     5
     6        Reviewed by Antti Koivisto.
     7
     8        Ignore grid item's logical width when "contain: inline-size" is present (i.e. ignore descendant content in inline direction when sizing).
     9
     10        * rendering/GridTrackSizingAlgorithm.cpp:
     11        (WebCore::GridTrackSizingAlgorithm::computeGridContainerIntrinsicSizes):
     12        (WebCore::GridTrackSizingAlgorithmStrategy::minContentForChild const):
     13        (WebCore::GridTrackSizingAlgorithmStrategy::maxContentForChild const):
     14        (WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
     15        (WebCore::GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild const):
     16        (WebCore::GridTrackSizingAlgorithm::advanceNextState):
     17        * rendering/GridTrackSizingAlgorithm.h:
     18        * rendering/RenderGrid.cpp:
     19        (WebCore::RenderGrid::layoutBlock):
     20        (WebCore::RenderGrid::computeEmptyTracksForAutoRepeat const):
     21
    1222022-04-06  Oriol Brufau  <obrufau@igalia.com>
    223
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp

    r292079 r292465  
    784784    Vector<GridTrack>& allTracks = tracks(m_direction);
    785785    for (auto& track : allTracks) {
    786         ASSERT(m_strategy->isComputingSizeContainment() || !track.infiniteGrowthPotential());
     786        ASSERT(m_strategy->isComputingSizeContainment() || m_strategy->isComputingInlineSizeContainment() || !track.infiniteGrowthPotential());
    787787        m_minContentSize += track.baseSize();
    788788        m_maxContentSize += track.growthLimitIsInfinite() ? track.baseSize() : track.growthLimit();
     
    816816    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
    817817    if (direction() == childInlineDirection) {
     818        if (isComputingInlineSizeContainment())
     819            return { };
    818820        // FIXME: It's unclear if we should return the intrinsic width or the preferred width.
    819821        // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
     
    839841    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
    840842    if (direction() == childInlineDirection) {
     843        if (isComputingInlineSizeContainment())
     844            return { };
    841845        // FIXME: It's unclear if we should return the intrinsic width or the preferred width.
    842846        // See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
     
    855859    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
    856860    bool isRowAxis = direction() == childInlineDirection;
     861    if (isRowAxis && isComputingInlineSizeContainment())
     862        return { };
    857863    const Length& childSize = isRowAxis ? child.style().logicalWidth() : child.style().logicalHeight();
    858864    if (!childSize.isAuto() && !childSize.isPercentOrCalculated())
     
    10071013    bool isRowAxis = direction() == childInlineDirection;
    10081014    if (isRowAxis)
    1009         return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize.value_or(0), *renderGrid(), nullptr) + GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), childInlineDirection, child);
     1015        return isComputingInlineSizeContainment() ? 0_lu : child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize.value_or(0), *renderGrid(), nullptr) + GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), childInlineDirection, child);
    10101016    bool overrideSizeHasChanged = updateOverridingContainingBlockContentSizeForChild(child, childInlineDirection, availableSize);
    10111017    layoutGridItemForMinSizeComputation(child, overrideSizeHasChanged);
     
    10261032    LayoutUnit freeSpaceForStretchAutoTracksStep() const override;
    10271033    bool isComputingSizeContainment() const override { return shouldApplySizeContainment(*renderGrid()); }
     1034    bool isComputingInlineSizeContainment() const override { return shouldApplyInlineSizeContainment(*renderGrid()); }
    10281035    void accumulateFlexFraction(double& flexFraction, GridIterator&, GridTrackSizingDirection outermostDirection, HashSet<RenderBox*>& itemsSet) const;
    10291036};
     
    11381145    LayoutUnit minLogicalSizeForChild(RenderBox&, const Length& childMinSize, std::optional<LayoutUnit> availableSize) const override;
    11391146    bool isComputingSizeContainment() const override { return false; }
     1147    bool isComputingInlineSizeContainment() const override { return false; }
    11401148};
    11411149
     
    14111419    switch (m_sizingState) {
    14121420    case ColumnSizingFirstIteration:
    1413         m_sizingState = m_strategy->isComputingSizeContainment() ? ColumnSizingExtraIterationForSizeContainment : RowSizingFirstIteration;
     1421        m_sizingState = m_strategy->isComputingSizeContainment() || m_strategy->isComputingInlineSizeContainment() ? ColumnSizingExtraIterationForSizeContainment : RowSizingFirstIteration;
    14141422        return;
    14151423    case ColumnSizingExtraIterationForSizeContainment:
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h

    r292079 r292465  
    283283    virtual LayoutUnit freeSpaceForStretchAutoTracksStep() const = 0;
    284284    virtual bool isComputingSizeContainment() const = 0;
     285    virtual bool isComputingInlineSizeContainment() const = 0;
    285286
    286287protected:
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r292221 r292465  
    281281        // sizes. We cannot do the same for heights though because many code paths inside updateLogicalHeight() require
    282282        // a previous call to setLogicalHeight() to resolve heights properly (like for positioned items for example).
    283         if (shouldApplySizeContainment(*this))
     283        auto shouldIgnoreGridItemContentForLogicalWidth = shouldApplySizeContainment(*this) || shouldApplyInlineSizeContainment(*this);
     284        if (shouldIgnoreGridItemContentForLogicalWidth)
    284285            computeTrackSizesForIndefiniteSize(m_trackSizingAlgorithm, ForColumns);
    285286        else
     
    288289        m_minContentSize = m_trackSizingAlgorithm.minContentSize();
    289290        m_maxContentSize = m_trackSizingAlgorithm.maxContentSize();
    290         if (shouldApplySizeContainment(*this))
     291        if (shouldIgnoreGridItemContentForLogicalWidth)
    291292            computeTrackSizesForDefiniteSize(ForColumns, availableSpaceForColumns);
    292293
     
    628629    unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + grid.autoRepeatTracks(direction);
    629630
    630     if (!grid.hasGridItems() || shouldApplySizeContainment(*this)) {
     631    if (!grid.hasGridItems() || shouldApplySizeContainment(*this) || shouldApplyInlineSizeContainment(*this)) {
    631632        emptyTrackIndexes = makeUnique<OrderedTrackIndexSet>();
    632633        for (unsigned trackIndex = firstAutoRepeatTrack; trackIndex < lastAutoRepeatTrack; ++trackIndex)
Note: See TracChangeset for help on using the changeset viewer.