Changeset 290007 in webkit


Ignore:
Timestamp:
Feb 17, 2022 1:53:19 AM (5 months ago)
Author:
commit-queue@webkit.org
Message:

Copy track sizes from parent grid into subgrid
https://bugs.webkit.org/show_bug.cgi?id=236336

Patch by Matt Woodrow <Matt Woodrow> on 2022-02-17
Reviewed by Dean Jackson.

Source/WebCore:

Copies track sizes from the parent RenderGrid's track sizing algorithm for axes
that are subgridded, rather than doing its own sizing.
Accounts for differences between the subgrid's grid-gap and the parent's grid gap,
as well as space occupied by the subgrid element's margin/border/padding.

Existing test expectations updated.

  • rendering/GridTrackSizingAlgorithm.cpp:

(WebCore::GridTrackSizingAlgorithm::run):

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::layoutBlock):
(WebCore::RenderGrid::gridGap const):
(WebCore::RenderGrid::populateGridPositionsForDirection):

  • rendering/RenderGrid.h:

LayoutTests:

Existing test expectations updated.

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r290003 r290007  
     12022-02-17  Matt Woodrow  <mattwoodrow@apple.com>
     2
     3        Copy track sizes from parent grid into subgrid
     4        https://bugs.webkit.org/show_bug.cgi?id=236336
     5
     6        Reviewed by Dean Jackson.
     7
     8        Existing test expectations updated.
     9
     10        * TestExpectations:
     11
    1122022-02-16  Antoine Quint  <graouts@webkit.org>
    213
  • trunk/LayoutTests/TestExpectations

    r289999 r290007  
    13931393imported/w3c/web-platform-tests/css/css-grid/masonry/tentative/masonry-subgrid-002.html [ ImageOnlyFailure ]
    13941394
     1395imported/w3c/web-platform-tests/css/css-grid/subgrid/auto-track-sizing-001.html [ ImageOnlyFailure ]
    13951396imported/w3c/web-platform-tests/css/css-grid/subgrid/abs-pos-002.html [ ImageOnlyFailure ]
    13961397imported/w3c/web-platform-tests/css/css-grid/subgrid/abs-pos-003.html [ ImageOnlyFailure ]
     
    14011402imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-003.html [ ImageOnlyFailure ]
    14021403imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-004.html [ ImageOnlyFailure ]
    1403 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-005.html [ ImageOnlyFailure ]
    1404 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-006.html [ ImageOnlyFailure ]
    14051404imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-007.html [ ImageOnlyFailure ]
    1406 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-008.html [ ImageOnlyFailure ]
    1407 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-009.html [ ImageOnlyFailure ]
    14081405imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-larger-001.html [ ImageOnlyFailure ]
    14091406imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-larger-002.html [ ImageOnlyFailure ]
    1410 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-normal-001.html [ ImageOnlyFailure ]
    14111407imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-smaller-001.html [ ImageOnlyFailure ]
    14121408imported/w3c/web-platform-tests/css/css-grid/subgrid/item-percentage-height-001.html [ ImageOnlyFailure ]
    1413 imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-002.html [ ImageOnlyFailure ]
    14141409imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-007.html [ ImageOnlyFailure ]
    14151410imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-001.html [ ImageOnlyFailure ]
     
    14201415imported/w3c/web-platform-tests/css/css-grid/subgrid/parent-repeat-auto-fit-002.html [ ImageOnlyFailure ]
    14211416imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-003.html [ ImageOnlyFailure ]
     1417imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-004.html [ ImageOnlyFailure ]
    14221418imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-item-block-size-001.html [ ImageOnlyFailure ]
    14231419imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-001.html [ ImageOnlyFailure ]
  • trunk/Source/WebCore/ChangeLog

    r290005 r290007  
     12022-02-17  Matt Woodrow  <mattwoodrow@apple.com>
     2
     3        Copy track sizes from parent grid into subgrid
     4        https://bugs.webkit.org/show_bug.cgi?id=236336
     5
     6        Reviewed by Dean Jackson.
     7
     8        Copies track sizes from the parent RenderGrid's track sizing algorithm for axes
     9        that are subgridded, rather than doing its own sizing.
     10        Accounts for differences between the subgrid's grid-gap and the parent's grid gap,
     11        as well as space occupied by the subgrid element's margin/border/padding.
     12
     13        Existing test expectations updated.
     14
     15        * rendering/GridTrackSizingAlgorithm.cpp:
     16        (WebCore::GridTrackSizingAlgorithm::run):
     17        * rendering/RenderGrid.cpp:
     18        (WebCore::RenderGrid::layoutBlock):
     19        (WebCore::RenderGrid::gridGap const):
     20        (WebCore::RenderGrid::populateGridPositionsForDirection):
     21        * rendering/RenderGrid.h:
     22
    1232022-02-17  Jean-Yves Avenard  <jya@apple.com>
    224
  • trunk/Source/WebCore/rendering/GridLayoutFunctions.cpp

    r289986 r290007  
    8383}
    8484
     85bool isOrthogonalParent(const RenderGrid& grid, const RenderElement& parent)
     86{
     87    return parent.isHorizontalWritingMode() != grid.isHorizontalWritingMode();
     88}
     89
    8590bool isAspectRatioBlockSizeDependentChild(const RenderBox& child)
    8691{
     
    9196{
    9297    return !isOrthogonalChild(grid, child) ? direction : (direction == ForColumns ? ForRows : ForColumns);
     98}
     99
     100GridTrackSizingDirection flowAwareDirectionForParent(const RenderGrid& grid, const RenderElement& parent, GridTrackSizingDirection direction)
     101{
     102    return isOrthogonalParent(grid, parent) ? (direction == ForColumns ? ForRows : ForColumns) : direction;
    93103}
    94104
  • trunk/Source/WebCore/rendering/GridLayoutFunctions.h

    r289986 r290007  
    3232
    3333class RenderBox;
     34class RenderElement;
    3435class RenderGrid;
    3536
     
    4142LayoutUnit marginLogicalSizeForChild(const RenderGrid&, GridTrackSizingDirection, const RenderBox&);
    4243bool isOrthogonalChild(const RenderGrid&, const RenderBox&);
     44bool isOrthogonalParent(const RenderGrid&, const RenderElement& parent);
    4345bool isAspectRatioBlockSizeDependentChild(const RenderBox&);
    4446GridTrackSizingDirection flowAwareDirectionForChild(const RenderGrid&, const RenderBox&, GridTrackSizingDirection);
     47GridTrackSizingDirection flowAwareDirectionForParent(const RenderGrid&, const RenderElement& parent, GridTrackSizingDirection);
    4548bool hasOverridingContainingBlockContentSizeForChild(const RenderBox&, GridTrackSizingDirection);
    4649std::optional<LayoutUnit> overridingContainingBlockContentSizeForChild(const RenderBox&, GridTrackSizingDirection);
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp

    r287977 r290007  
    14001400}
    14011401
     1402static void removeSubgridMarginBorderPaddingFromTracks(Vector<GridTrack>& tracks, LayoutUnit mbp, bool forwards)
     1403{
     1404    int numTracks = tracks.size();
     1405    int i = forwards ? 0 : numTracks - 1;
     1406    while (mbp > 0 && (forwards ? i < numTracks : i >= 0)) {
     1407        LayoutUnit size = tracks[i].baseSize();
     1408        if (size > mbp) {
     1409            size -= mbp;
     1410            mbp = 0;
     1411        } else {
     1412            mbp -= size;
     1413            size = 0;
     1414        }
     1415        tracks[i].setBaseSize(size);
     1416
     1417        forwards ? i++ : i--;
     1418    }
     1419}
     1420
     1421bool GridTrackSizingAlgorithm::copyUsedTrackSizesForSubgrid()
     1422{
     1423    ASSERT(is<RenderGrid>(m_renderGrid->parent()));
     1424    RenderGrid* outer = downcast<RenderGrid>(m_renderGrid->parent());
     1425    GridTrackSizingAlgorithm& parentAlgo = outer->m_trackSizingAlgorithm;
     1426    GridTrackSizingDirection direction = GridLayoutFunctions::flowAwareDirectionForParent(*m_renderGrid, *outer, m_direction);
     1427    Vector<GridTrack>& parentTracks = parentAlgo.tracks(direction);
     1428
     1429    if (!parentTracks.size())
     1430        return false;
     1431
     1432    GridSpan span = outer->gridSpanForChild(*m_renderGrid, direction);
     1433    Vector<GridTrack>& allTracks = tracks(m_direction);
     1434    int numTracks = allTracks.size();
     1435    for (int i = 0; i < numTracks; i++)
     1436        allTracks[i] = parentTracks[i + span.startLine()];
     1437
     1438    if (GridLayoutFunctions::isSubgridReversedDirection(*outer, direction, *m_renderGrid))
     1439        allTracks.reverse();
     1440
     1441    LayoutUnit startMBP = (m_direction == ForColumns) ? m_renderGrid->marginAndBorderAndPaddingStart() : m_renderGrid->marginAndBorderAndPaddingBefore();
     1442    removeSubgridMarginBorderPaddingFromTracks(allTracks, startMBP, true);
     1443    LayoutUnit endMBP = (m_direction == ForColumns) ? m_renderGrid->marginAndBorderAndPaddingEnd() : m_renderGrid->marginAndBorderAndPaddingAfter();
     1444    removeSubgridMarginBorderPaddingFromTracks(allTracks, endMBP, false);
     1445
     1446    LayoutUnit gapDifference = (m_renderGrid->gridGap(m_direction) - outer->gridGap(direction)) / 2;
     1447    for (int i = 0; i < numTracks; i++) {
     1448        LayoutUnit size = allTracks[i].baseSize();
     1449        if (i)
     1450            size -= gapDifference;
     1451        if (i != numTracks - 1)
     1452            size -= gapDifference;
     1453        allTracks[i].setBaseSize(std::max(size, 0_lu));
     1454    }
     1455    return true;
     1456}
     1457
    14021458void GridTrackSizingAlgorithm::run()
    14031459{
    14041460    ASSERT(wasSetup());
    14051461    StateMachine stateMachine(*this);
     1462
     1463    if (m_renderGrid->isSubgrid(m_direction) && copyUsedTrackSizesForSubgrid())
     1464        return;
    14061465
    14071466    // Step 1.
     
    14541513bool GridTrackSizingAlgorithm::tracksAreWiderThanMinTrackBreadth() const
    14551514{
     1515    // Subgrids inherit their sizing directly from the parent, so may be unrelated
     1516    // to their initial base size.
     1517    if (m_renderGrid->isSubgrid(m_direction))
     1518        return true;
     1519
    14561520    const Vector<GridTrack>& allTracks = tracks(m_direction);
    14571521    for (size_t i = 0; i < allTracks.size(); ++i) {
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h

    r286148 r290007  
    194194    void stretchAutoTracks();
    195195
     196    bool copyUsedTrackSizesForSubgrid();
     197
    196198    // State machine.
    197199    void advanceNextState();
  • trunk/Source/WebCore/rendering/RenderBoxModelObject.h

    r289606 r290007  
    178178    LayoutUnit borderAndPaddingAfter() const { return borderAfter() + paddingAfter(); }
    179179
     180    LayoutUnit marginAndBorderAndPaddingStart() const { return marginStart() + borderStart() + paddingStart(); }
     181    LayoutUnit marginAndBorderAndPaddingEnd() const { return marginEnd() + borderEnd() + paddingEnd(); }
     182    LayoutUnit marginAndBorderAndPaddingBefore() const { return marginBefore() + borderBefore() + paddingBefore(); }
     183    LayoutUnit marginAndBorderAndPaddingAfter() const { return marginAfter() + borderAfter() + paddingAfter(); }
     184
    180185    LayoutUnit verticalBorderAndPaddingExtent() const { return borderTop() + borderBottom() + paddingTop() + paddingBottom(); }
    181186    LayoutUnit horizontalBorderAndPaddingExtent() const { return borderLeft() + borderRight() + paddingLeft() + paddingRight(); }
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r289998 r290007  
    330330
    331331        layoutGridItems();
    332         m_trackSizingAlgorithm.reset();
    333332
    334333        endAndCommitUpdateScrollInfoAfterLayoutTransaction();
     
    341340
    342341        layoutPositionedObjects(relayoutChildren || isDocumentElementRenderer());
     342        m_trackSizingAlgorithm.reset();
    343343
    344344        computeOverflow(clientLogicalRightAndBottomAfterRepositioning().height());
     
    363363    ASSERT(!availableSize || *availableSize >= 0);
    364364    const GapLength& gapLength = direction == ForColumns? style().columnGap() : style().rowGap();
    365     if (gapLength.isNormal())
    366         return 0_lu;
     365    if (gapLength.isNormal()) {
     366        if (!isSubgrid(direction))
     367            return 0_lu;
     368
     369        GridTrackSizingDirection parentDirection = GridLayoutFunctions::flowAwareDirectionForParent(*this, *parent(), direction);
     370        if (!availableSize)
     371            return downcast<RenderGrid>(parent())->gridGap(parentDirection, std::nullopt);
     372        return downcast<RenderGrid>(parent())->gridGap(parentDirection);
     373    }
    367374
    368375    return valueForLength(gapLength.length(), availableSize.value_or(0));
     
    11291136        LayoutUnit gap = !hasCollapsedTracks ? gridGap(direction) : 0_lu;
    11301137        unsigned nextToLastLine = numberOfLines - 2;
     1138
    11311139        for (unsigned i = 0; i < nextToLastLine; ++i)
    11321140            positions[i + 1] = positions[i] + offset.distributionOffset + tracks[i].baseSize() + gap;
  • trunk/Source/WebCore/rendering/RenderGrid.h

    r289998 r290007  
    108108
    109109private:
     110    friend class GridTrackSizingAlgorithm;
     111
    110112    ItemPosition selfAlignmentNormalBehavior(const RenderBox* child = nullptr) const override
    111113    {
Note: See TracChangeset for help on using the changeset viewer.