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;