Title: [290077] trunk
Revision
290077
Author
[email protected]
Date
2022-02-17 14:53:52 -0800 (Thu, 17 Feb 2022)

Log Message

Include sub grid items in the track sizing algorithm of the outer grid
https://bugs.webkit.org/show_bug.cgi?id=236337

Patch by Matt Woodrow <[email protected]> on 2022-02-17
Reviewed by Dean Jackson.

Source/WebCore:

resolveIntrinsicTrackSizes and findUsedFlexFraction now recurse into subgridded items
to iterate the children sa if they were directly part of the outer grid.
New constructor added to GridIterator for constructing a new iterator for the subgrid items,
which adjusts the row/column indices into the local coordinate space of the subgrid.
Adds a new method to renderGrid 'placeItems' so that we can ensure subgrid items have finished placement
when doing sizing for the outer grid.

Existing test expectations updated.

* rendering/Grid.cpp:
(WebCore::GridIterator::createForSubgrid):
* rendering/Grid.h:
(WebCore::GridIterator::direction const):
* rendering/GridTrackSizingAlgorithm.cpp:
(WebCore::GridTrackSizingAlgorithm::estimatedGridAreaBreadthForChild const):
(WebCore::GridTrackSizingAlgorithm::gridAreaBreadthForChild const):
(WebCore::GridTrackSizingAlgorithm::isIntrinsicSizedGridArea const):
(WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
(WebCore::GridTrackSizingAlgorithm::updateBaselineAlignmentContext):
(WebCore::GridTrackSizingAlgorithm::baselineOffsetForChild const):
(WebCore::IndefiniteSizeStrategy::accumulateFlexFraction const):
(WebCore::IndefiniteSizeStrategy::findUsedFlexFraction const):
(WebCore::GridTrackSizingAlgorithm::accumulateIntrinsicSizesForTrack):
(WebCore::GridTrackSizingAlgorithm::resolveIntrinsicTrackSizes):
* rendering/GridTrackSizingAlgorithm.h:
* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::placeItems):
(WebCore::insertIntoGrid):
(WebCore::RenderGrid::placeItemsOnGrid const):
(WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid const):
(WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid const):
(WebCore::RenderGrid::layoutGridItems):
(WebCore::RenderGrid::isSubgridInParentDirection const):
* rendering/RenderGrid.h:

LayoutTests:

Existing test expectations updated.

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (290076 => 290077)


--- trunk/LayoutTests/ChangeLog	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/LayoutTests/ChangeLog	2022-02-17 22:53:52 UTC (rev 290077)
@@ -1,3 +1,14 @@
+2022-02-17  Matt Woodrow  <[email protected]>
+
+        Include sub grid items in the track sizing algorithm of the outer grid
+        https://bugs.webkit.org/show_bug.cgi?id=236337
+
+        Reviewed by Dean Jackson.
+
+        Existing test expectations updated.
+
+        * TestExpectations:
+
 2022-02-17  Jon Lee  <[email protected]>
 
         Unreviewed gardening. Add fuzzy data.

Modified: trunk/LayoutTests/TestExpectations (290076 => 290077)


--- trunk/LayoutTests/TestExpectations	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/LayoutTests/TestExpectations	2022-02-17 22:53:52 UTC (rev 290077)
@@ -1409,6 +1409,7 @@
 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-gap-smaller-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/item-percentage-height-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-007.html [ ImageOnlyFailure ]
+imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-008.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-002.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-003.html [ ImageOnlyFailure ]
@@ -1417,7 +1418,6 @@
 imported/w3c/web-platform-tests/css/css-grid/subgrid/parent-repeat-auto-fit-002.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-003.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-004.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-item-block-size-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-002.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-003.html [ ImageOnlyFailure ]

Modified: trunk/Source/WebCore/ChangeLog (290076 => 290077)


--- trunk/Source/WebCore/ChangeLog	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/ChangeLog	2022-02-17 22:53:52 UTC (rev 290077)
@@ -1,3 +1,45 @@
+2022-02-17  Matt Woodrow  <[email protected]>
+
+        Include sub grid items in the track sizing algorithm of the outer grid
+        https://bugs.webkit.org/show_bug.cgi?id=236337
+
+        Reviewed by Dean Jackson.
+
+        resolveIntrinsicTrackSizes and findUsedFlexFraction now recurse into subgridded items
+        to iterate the children sa if they were directly part of the outer grid.
+        New constructor added to GridIterator for constructing a new iterator for the subgrid items,
+        which adjusts the row/column indices into the local coordinate space of the subgrid.
+        Adds a new method to renderGrid 'placeItems' so that we can ensure subgrid items have finished placement
+        when doing sizing for the outer grid.
+
+        Existing test expectations updated.
+
+        * rendering/Grid.cpp:
+        (WebCore::GridIterator::createForSubgrid):
+        * rendering/Grid.h:
+        (WebCore::GridIterator::direction const):
+        * rendering/GridTrackSizingAlgorithm.cpp:
+        (WebCore::GridTrackSizingAlgorithm::estimatedGridAreaBreadthForChild const):
+        (WebCore::GridTrackSizingAlgorithm::gridAreaBreadthForChild const):
+        (WebCore::GridTrackSizingAlgorithm::isIntrinsicSizedGridArea const):
+        (WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
+        (WebCore::GridTrackSizingAlgorithm::updateBaselineAlignmentContext):
+        (WebCore::GridTrackSizingAlgorithm::baselineOffsetForChild const):
+        (WebCore::IndefiniteSizeStrategy::accumulateFlexFraction const):
+        (WebCore::IndefiniteSizeStrategy::findUsedFlexFraction const):
+        (WebCore::GridTrackSizingAlgorithm::accumulateIntrinsicSizesForTrack):
+        (WebCore::GridTrackSizingAlgorithm::resolveIntrinsicTrackSizes):
+        * rendering/GridTrackSizingAlgorithm.h:
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::placeItems):
+        (WebCore::insertIntoGrid):
+        (WebCore::RenderGrid::placeItemsOnGrid const):
+        (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid const):
+        (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid const):
+        (WebCore::RenderGrid::layoutGridItems):
+        (WebCore::RenderGrid::isSubgridInParentDirection const):
+        * rendering/RenderGrid.h:
+
 2022-02-17  Alejandro G. Castro  <[email protected]>
 
         [GTK][WPE] Make proper ANGLE context configuration for some of the expected features

Modified: trunk/Source/WebCore/rendering/Grid.cpp (290076 => 290077)


--- trunk/Source/WebCore/rendering/Grid.cpp	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/rendering/Grid.cpp	2022-02-17 22:53:52 UTC (rev 290077)
@@ -267,4 +267,20 @@
     return nullptr;
 }
 
+GridIterator GridIterator::createForSubgrid(const RenderGrid& subgrid, const GridIterator& outer)
+{
+    ASSERT(subgrid.isSubgridInParentDirection(outer.direction()));
+    GridSpan fixedSpan = downcast<RenderGrid>(subgrid.parent())->gridSpanForChild(subgrid, outer.direction());
+
+    // Translate the current row/column indices into the coordinate
+    // space of the subgrid.
+    unsigned fixedIndex = (outer.direction() == ForColumns) ? outer.m_columnIndex : outer.m_rowIndex;
+    fixedIndex -= fixedSpan.startLine();
+
+    GridTrackSizingDirection innerDirection = GridLayoutFunctions::flowAwareDirectionForChild(*downcast<RenderGrid>(subgrid.parent()), subgrid, outer.direction());
+    ASSERT(subgrid.isSubgrid(innerDirection));
+
+    return GridIterator(subgrid.currentGrid(), innerDirection, fixedIndex);
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/Grid.h (290076 => 290077)


--- trunk/Source/WebCore/rendering/Grid.h	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/rendering/Grid.h	2022-02-17 22:53:52 UTC (rev 290077)
@@ -116,10 +116,17 @@
     // GridIterator(m_grid, ForColumns, 1) will walk over the rows of the 2nd column.
     GridIterator(const Grid&, GridTrackSizingDirection, unsigned fixedTrackIndex, unsigned varyingTrackIndex = 0);
 
+    static GridIterator createForSubgrid(const RenderGrid& subgrid, const GridIterator& outer);
+
     RenderBox* nextGridItem();
     bool isEmptyAreaEnough(unsigned rowSpan, unsigned columnSpan) const;
     std::unique_ptr<GridArea> nextEmptyGridArea(unsigned fixedTrackSpan, unsigned varyingTrackSpan);
 
+    GridTrackSizingDirection direction() const
+    {
+        return m_direction;
+    }
+
 private:
     const GridAsMatrix& m_grid;
     GridTrackSizingDirection m_direction;

Modified: trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp (290076 => 290077)


--- trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp	2022-02-17 22:53:52 UTC (rev 290077)
@@ -587,7 +587,7 @@
 
 std::optional<LayoutUnit> GridTrackSizingAlgorithm::estimatedGridAreaBreadthForChild(const RenderBox& child, GridTrackSizingDirection direction) const
 {
-    const GridSpan& span = m_grid.gridItemSpan(child, direction);
+    const GridSpan& span = m_renderGrid->gridSpanForChild(child, direction);
     LayoutUnit gridAreaSize;
     bool gridAreaIsIndefinite = false;
     std::optional<LayoutUnit> availableSize = availableSpace(direction);
@@ -628,7 +628,7 @@
     }
 
     const Vector<GridTrack>& allTracks = tracks(direction);
-    const GridSpan& span = m_grid.gridItemSpan(child, direction);
+    const GridSpan& span = m_renderGrid->gridSpanForChild(child, direction);
     LayoutUnit gridAreaBreadth;
     for (auto trackPosition : span)
         gridAreaBreadth += allTracks[trackPosition].baseSize();
@@ -650,7 +650,7 @@
 {
     ASSERT(wasSetup());
     GridTrackSizingDirection direction = gridDirectionForAxis(axis);
-    const GridSpan& span = m_grid.gridItemSpan(child, direction);
+    const GridSpan& span = m_renderGrid->gridSpanForChild(child, direction);
     for (auto trackPosition : span) {
         const auto& trackSize = rawGridTrackSize(direction, trackPosition);
         // We consider fr units as 'auto' for the min sizing function.
@@ -859,7 +859,7 @@
 
     if (childMinSize.isAuto() && overflowIsVisible) {
         auto minSize = minContentForChild(child);
-        const GridSpan& span = m_algorithm.grid().gridItemSpan(child, direction());
+        const GridSpan& span = m_algorithm.m_renderGrid->gridSpanForChild(child, direction());
 
         LayoutUnit maxBreadth;
         auto allTracks = m_algorithm.tracks(direction());
@@ -918,7 +918,7 @@
     ASSERT(!child.needsLayout());
 
     ItemPosition align = m_renderGrid->selfAlignmentForChild(baselineAxis, child).position();
-    const auto& span = m_grid.gridItemSpan(child, gridDirectionForAxis(baselineAxis));
+    const auto& span = m_renderGrid->gridSpanForChild(child, gridDirectionForAxis(baselineAxis));
     m_baselineAlignment.updateBaselineAlignmentContext(align, span.startLine(), child, baselineAxis);
 }
 
@@ -928,7 +928,7 @@
         return LayoutUnit();
 
     ItemPosition align = m_renderGrid->selfAlignmentForChild(baselineAxis, child).position();
-    const auto& span = m_grid.gridItemSpan(child, gridDirectionForAxis(baselineAxis));
+    const auto& span = m_renderGrid->gridSpanForChild(child, gridDirectionForAxis(baselineAxis));
     return m_baselineAlignment.baselineOffsetForChild(align, span.startLine(), child, baselineAxis);
 }
 
@@ -990,6 +990,7 @@
     bool recomputeUsedFlexFractionIfNeeded(double& flexFraction, LayoutUnit& totalGrowth) const override;
     LayoutUnit freeSpaceForStretchAutoTracksStep() const override;
     bool isComputingSizeContainment() const override { return shouldApplySizeContainment(*renderGrid()); }
+    void accumulateFlexFraction(double& flexFraction, GridIterator&, GridTrackSizingDirection outermostDirection, HashSet<RenderBox*>& itemsSet) const;
 };
 
 void IndefiniteSizeStrategy::layoutGridItemForMinSizeComputation(RenderBox& child, bool overrideSizeHasChanged) const
@@ -1013,6 +1014,28 @@
     return track.baseSize() / std::max<double>(1, flexFactor);
 }
 
+void IndefiniteSizeStrategy::accumulateFlexFraction(double& flexFraction, GridIterator& iterator, GridTrackSizingDirection outermostDirection, HashSet<RenderBox*>& itemsSet) const
+{
+    while (auto* gridItem = iterator.nextGridItem()) {
+        if (is<RenderGrid>(gridItem) && downcast<RenderGrid>(gridItem)->isSubgridInParentDirection(iterator.direction())) {
+            RenderGrid* inner = downcast<RenderGrid>(gridItem);
+
+            GridIterator childIterator = GridIterator::createForSubgrid(*inner, iterator);
+            accumulateFlexFraction(flexFraction, childIterator, outermostDirection, itemsSet);
+            continue;
+        }
+        // Do not include already processed items.
+        if (!itemsSet.add(gridItem).isNewEntry)
+            continue;
+
+        GridSpan span = m_algorithm.renderGrid()->gridSpanForChild(*gridItem, outermostDirection);
+
+        // Removing gutters from the max-content contribution of the item, so they are not taken into account in FindFrUnitSize().
+        LayoutUnit leftOverSpace = maxContentForChild(*gridItem) - renderGrid()->guttersSize(m_algorithm.grid(), outermostDirection, span.startLine(), span.integerSpan(), availableSpace());
+        flexFraction = std::max(flexFraction, findFrUnitSize(span, leftOverSpace));
+    }
+}
+
 double IndefiniteSizeStrategy::findUsedFlexFraction(Vector<unsigned>& flexibleSizedTracksIndex, GridTrackSizingDirection direction, std::optional<LayoutUnit> freeSpace) const
 {
     UNUSED_PARAM(freeSpace);
@@ -1032,17 +1055,7 @@
     HashSet<RenderBox*> itemsSet;
     for (const auto& trackIndex : flexibleSizedTracksIndex) {
         GridIterator iterator(grid, direction, trackIndex);
-        while (auto* gridItem = iterator.nextGridItem()) {
-            // Do not include already processed items.
-            if (!itemsSet.add(gridItem).isNewEntry)
-                continue;
-
-            const GridSpan& span = grid.gridItemSpan(*gridItem, direction);
-
-            // Removing gutters from the max-content contribution of the item, so they are not taken into account in FindFrUnitSize().
-            LayoutUnit leftOverSpace = maxContentForChild(*gridItem) - renderGrid()->guttersSize(m_algorithm.grid(), direction, span.startLine(), span.integerSpan(), availableSpace());
-            flexFraction = std::max(flexFraction, findFrUnitSize(span, leftOverSpace));
-        }
+        accumulateFlexFraction(flexFraction, iterator, direction, itemsSet);
     }
 
     return flexFraction;
@@ -1209,6 +1222,30 @@
     }
 }
 
+void GridTrackSizingAlgorithm::accumulateIntrinsicSizesForTrack(GridTrack& track, GridIterator& iterator, Vector<GridItemWithSpan>& itemsSortedByIncreasingSpan, Vector<GridItemWithSpan>& itemsCrossingFlexibleTracks, HashSet<RenderBox*>& itemsSet)
+{
+    while (auto* gridItem = iterator.nextGridItem()) {
+        bool isNewEntry = itemsSet.add(gridItem).isNewEntry;
+        if (is<RenderGrid>(gridItem) && downcast<RenderGrid>(gridItem)->isSubgridInParentDirection(iterator.direction())) {
+            RenderGrid* inner = downcast<RenderGrid>(gridItem);
+
+            GridIterator childIterator = GridIterator::createForSubgrid(*inner, iterator);
+            accumulateIntrinsicSizesForTrack(track, childIterator, itemsSortedByIncreasingSpan, itemsCrossingFlexibleTracks, itemsSet);
+            continue;
+        }
+        if (!isNewEntry)
+            continue;
+        GridSpan span = m_renderGrid->gridSpanForChild(*gridItem, m_direction);
+
+        if (spanningItemCrossesFlexibleSizedTracks(span))
+            itemsCrossingFlexibleTracks.append(GridItemWithSpan(*gridItem, span));
+        else if (span.integerSpan() == 1)
+            sizeTrackToFitNonSpanningItem(span, *gridItem, track);
+        else
+            itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
+    }
+}
+
 void GridTrackSizingAlgorithm::resolveIntrinsicTrackSizes()
 {
     Vector<GridTrack>& allTracks = tracks(m_direction);
@@ -1228,22 +1265,13 @@
     Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
     Vector<GridItemWithSpan> itemsCrossingFlexibleTracks;
     HashSet<RenderBox*> itemsSet;
+
     if (m_grid.hasGridItems()) {
         for (auto trackIndex : m_contentSizedTracksIndex) {
             GridIterator iterator(m_grid, m_direction, trackIndex);
             GridTrack& track = allTracks[trackIndex];
 
-            while (auto* gridItem = iterator.nextGridItem()) {
-                if (itemsSet.add(gridItem).isNewEntry) {
-                    const GridSpan& span = m_grid.gridItemSpan(*gridItem, m_direction);
-                    if (spanningItemCrossesFlexibleSizedTracks(span))
-                        itemsCrossingFlexibleTracks.append(GridItemWithSpan(*gridItem, span));
-                    else if (span.integerSpan() == 1)
-                        sizeTrackToFitNonSpanningItem(span, *gridItem, track);
-                    else
-                        itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
-                }
-            }
+            accumulateIntrinsicSizesForTrack(track, iterator, itemsSortedByIncreasingSpan, itemsCrossingFlexibleTracks, itemsSet);
         }
         std::sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncreasingSpan.end());
     }

Modified: trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h (290076 => 290077)


--- trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h	2022-02-17 22:53:52 UTC (rev 290077)
@@ -55,6 +55,7 @@
 };
 
 class GridTrackSizingAlgorithmStrategy;
+class GridItemWithSpan;
 
 class GridTrack {
 public:
@@ -121,6 +122,8 @@
     // and encapsulate any access in the algorithm class.
     Grid& mutableGrid() const { return m_grid; }
 
+    const RenderGrid* renderGrid() { return m_renderGrid; };
+
     LayoutUnit minContentSize() const { return m_minContentSize; };
     LayoutUnit maxContentSize() const { return m_maxContentSize; };
 
@@ -193,6 +196,8 @@
     void stretchFlexibleTracks(std::optional<LayoutUnit> freeSpace);
     void stretchAutoTracks();
 
+    void accumulateIntrinsicSizesForTrack(GridTrack&, GridIterator&, Vector<GridItemWithSpan>& itemsSortedByIncreasingSpan, Vector<GridItemWithSpan>& itemsCrossingFlexibleTracks, HashSet<RenderBox*>& itemsSet);
+
     bool copyUsedTrackSizesForSubgrid();
 
     // State machine.

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (290076 => 290077)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2022-02-17 22:53:52 UTC (rev 290077)
@@ -647,6 +647,26 @@
     return std::min(autoRepeatTracks, maxTracks - insertionPoint);
 }
 
+void RenderGrid::placeItems()
+{
+    updateLogicalWidth();
+
+    LayoutUnit availableSpaceForColumns = availableLogicalWidth();
+    placeItemsOnGrid(m_trackSizingAlgorithm, availableSpaceForColumns);
+}
+
+static GridArea insertIntoGrid(Grid& grid, RenderBox& child, const GridArea& area)
+{
+    GridArea clamped = grid.insert(child, area);
+    if (!is<RenderGrid>(child))
+        return clamped;
+
+    RenderGrid& renderGrid = downcast<RenderGrid>(child);
+    if (renderGrid.isSubgridRows() || renderGrid.isSubgridColumns())
+        renderGrid.placeItems();
+    return clamped;
+}
+
 // FIXME: We shouldn't have to pass the available logical width as argument. The problem is that
 // availableLogicalWidth() does always return a value even if we cannot resolve it like when
 // computing the intrinsic size (preferred widths). That's why we pass the responsibility to the
@@ -700,7 +720,7 @@
                 specifiedMajorAxisAutoGridItems.append(child);
             continue;
         }
-        grid.insert(*child, { area.rows, area.columns });
+        insertIntoGrid(grid, *child, { area.rows, area.columns });
     }
 
 #if ASSERT_ENABLED
@@ -830,7 +850,7 @@
         if (!emptyGridArea)
             emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);
 
-        *emptyGridArea = grid.insert(*autoGridItem, *emptyGridArea);
+        *emptyGridArea = insertIntoGrid(grid, *autoGridItem, *emptyGridArea);
 
         if (!isGridAutoFlowDense)
             minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.startLine() : emptyGridArea->columns.startLine());
@@ -902,7 +922,7 @@
             emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));
     }
 
-    grid.insert(gridItem, *emptyGridArea);
+    *emptyGridArea = insertIntoGrid(grid, gridItem, *emptyGridArea);
     autoPlacementCursor.first = emptyGridArea->rows.startLine();
     autoPlacementCursor.second = emptyGridArea->columns.startLine();
 }
@@ -1015,7 +1035,6 @@
     populateGridPositionsForDirection(ForRows);
 
     for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
-        
         if (m_grid.orderIterator().shouldSkipChild(*child)) {
             if (child->isOutOfFlowPositioned())
                 prepareChildForPositionedLayout(*child);
@@ -1022,6 +1041,9 @@
             continue;
         }
 
+        if (is<RenderGrid>(child) && (downcast<RenderGrid>(child)->isSubgridColumns() || downcast<RenderGrid>(child)->isSubgridRows()))
+            child->setNeedsLayout(MarkOnlyThis);
+
         // Setting the definite grid area's sizes. It may imply that the
         // item must perform a layout if its area differs from the one
         // used during the track sizing algorithm.
@@ -1638,6 +1660,14 @@
     return is<RenderGrid>(parent());
 }
 
+bool RenderGrid::isSubgridInParentDirection(GridTrackSizingDirection parentDirection) const
+{
+    if (!is<RenderGrid>(parent()))
+        return false;
+    GridTrackSizingDirection direction = GridLayoutFunctions::flowAwareDirectionForChild(*downcast<RenderGrid>(parent()), *this, parentDirection);
+    return isSubgrid(direction);
+}
+
 LayoutUnit RenderGrid::gridAreaBreadthForOutOfFlowChild(const RenderBox& child, GridTrackSizingDirection direction)
 {
     ASSERT(child.isOutOfFlowPositioned());

Modified: trunk/Source/WebCore/rendering/RenderGrid.h (290076 => 290077)


--- trunk/Source/WebCore/rendering/RenderGrid.h	2022-02-17 22:41:18 UTC (rev 290076)
+++ trunk/Source/WebCore/rendering/RenderGrid.h	2022-02-17 22:53:52 UTC (rev 290077)
@@ -95,6 +95,7 @@
     {
         return isSubgrid(ForColumns);
     }
+    bool isSubgridInParentDirection(GridTrackSizingDirection parentDirection) const;
 
     const Grid& currentGrid() const
     {
@@ -106,6 +107,8 @@
         return numTracks(direction, m_grid);
     }
 
+    void placeItems();
+
 private:
     friend class GridTrackSizingAlgorithm;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to