Changeset 290077 in webkit
- Timestamp:
- Feb 17, 2022 2:53:52 PM (5 months ago)
- Location:
- trunk
- Files:
-
- 9 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/TestExpectations (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/rendering/Grid.cpp (modified) (1 diff)
-
Source/WebCore/rendering/Grid.h (modified) (1 diff)
-
Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp (modified) (12 diffs)
-
Source/WebCore/rendering/GridTrackSizingAlgorithm.h (modified) (3 diffs)
-
Source/WebCore/rendering/RenderGrid.cpp (modified) (7 diffs)
-
Source/WebCore/rendering/RenderGrid.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r290072 r290077 1 2022-02-17 Matt Woodrow <mattwoodrow@apple.com> 2 3 Include sub grid items in the track sizing algorithm of the outer grid 4 https://bugs.webkit.org/show_bug.cgi?id=236337 5 6 Reviewed by Dean Jackson. 7 8 Existing test expectations updated. 9 10 * TestExpectations: 11 1 12 2022-02-17 Jon Lee <jonlee@apple.com> 2 13 -
trunk/LayoutTests/TestExpectations
r290038 r290077 1410 1410 imported/w3c/web-platform-tests/css/css-grid/subgrid/item-percentage-height-001.html [ ImageOnlyFailure ] 1411 1411 imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-007.html [ ImageOnlyFailure ] 1412 imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-008.html [ ImageOnlyFailure ] 1412 1413 imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-001.html [ ImageOnlyFailure ] 1413 1414 imported/w3c/web-platform-tests/css/css-grid/subgrid/orthogonal-writing-mode-002.html [ ImageOnlyFailure ] … … 1418 1419 imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-003.html [ ImageOnlyFailure ] 1419 1420 imported/w3c/web-platform-tests/css/css-grid/subgrid/repeat-auto-fill-004.html [ ImageOnlyFailure ] 1420 imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-item-block-size-001.html [ ImageOnlyFailure ]1421 1421 imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-001.html [ ImageOnlyFailure ] 1422 1422 imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-002.html [ ImageOnlyFailure ] -
trunk/Source/WebCore/ChangeLog
r290064 r290077 1 2022-02-17 Matt Woodrow <mattwoodrow@apple.com> 2 3 Include sub grid items in the track sizing algorithm of the outer grid 4 https://bugs.webkit.org/show_bug.cgi?id=236337 5 6 Reviewed by Dean Jackson. 7 8 resolveIntrinsicTrackSizes and findUsedFlexFraction now recurse into subgridded items 9 to iterate the children sa if they were directly part of the outer grid. 10 New constructor added to GridIterator for constructing a new iterator for the subgrid items, 11 which adjusts the row/column indices into the local coordinate space of the subgrid. 12 Adds a new method to renderGrid 'placeItems' so that we can ensure subgrid items have finished placement 13 when doing sizing for the outer grid. 14 15 Existing test expectations updated. 16 17 * rendering/Grid.cpp: 18 (WebCore::GridIterator::createForSubgrid): 19 * rendering/Grid.h: 20 (WebCore::GridIterator::direction const): 21 * rendering/GridTrackSizingAlgorithm.cpp: 22 (WebCore::GridTrackSizingAlgorithm::estimatedGridAreaBreadthForChild const): 23 (WebCore::GridTrackSizingAlgorithm::gridAreaBreadthForChild const): 24 (WebCore::GridTrackSizingAlgorithm::isIntrinsicSizedGridArea const): 25 (WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const): 26 (WebCore::GridTrackSizingAlgorithm::updateBaselineAlignmentContext): 27 (WebCore::GridTrackSizingAlgorithm::baselineOffsetForChild const): 28 (WebCore::IndefiniteSizeStrategy::accumulateFlexFraction const): 29 (WebCore::IndefiniteSizeStrategy::findUsedFlexFraction const): 30 (WebCore::GridTrackSizingAlgorithm::accumulateIntrinsicSizesForTrack): 31 (WebCore::GridTrackSizingAlgorithm::resolveIntrinsicTrackSizes): 32 * rendering/GridTrackSizingAlgorithm.h: 33 * rendering/RenderGrid.cpp: 34 (WebCore::RenderGrid::placeItems): 35 (WebCore::insertIntoGrid): 36 (WebCore::RenderGrid::placeItemsOnGrid const): 37 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid const): 38 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid const): 39 (WebCore::RenderGrid::layoutGridItems): 40 (WebCore::RenderGrid::isSubgridInParentDirection const): 41 * rendering/RenderGrid.h: 42 1 43 2022-02-17 Alejandro G. Castro <alex@igalia.com> 2 44 -
trunk/Source/WebCore/rendering/Grid.cpp
r289986 r290077 268 268 } 269 269 270 GridIterator GridIterator::createForSubgrid(const RenderGrid& subgrid, const GridIterator& outer) 271 { 272 ASSERT(subgrid.isSubgridInParentDirection(outer.direction())); 273 GridSpan fixedSpan = downcast<RenderGrid>(subgrid.parent())->gridSpanForChild(subgrid, outer.direction()); 274 275 // Translate the current row/column indices into the coordinate 276 // space of the subgrid. 277 unsigned fixedIndex = (outer.direction() == ForColumns) ? outer.m_columnIndex : outer.m_rowIndex; 278 fixedIndex -= fixedSpan.startLine(); 279 280 GridTrackSizingDirection innerDirection = GridLayoutFunctions::flowAwareDirectionForChild(*downcast<RenderGrid>(subgrid.parent()), subgrid, outer.direction()); 281 ASSERT(subgrid.isSubgrid(innerDirection)); 282 283 return GridIterator(subgrid.currentGrid(), innerDirection, fixedIndex); 284 } 285 270 286 } // namespace WebCore -
trunk/Source/WebCore/rendering/Grid.h
r289986 r290077 117 117 GridIterator(const Grid&, GridTrackSizingDirection, unsigned fixedTrackIndex, unsigned varyingTrackIndex = 0); 118 118 119 static GridIterator createForSubgrid(const RenderGrid& subgrid, const GridIterator& outer); 120 119 121 RenderBox* nextGridItem(); 120 122 bool isEmptyAreaEnough(unsigned rowSpan, unsigned columnSpan) const; 121 123 std::unique_ptr<GridArea> nextEmptyGridArea(unsigned fixedTrackSpan, unsigned varyingTrackSpan); 124 125 GridTrackSizingDirection direction() const 126 { 127 return m_direction; 128 } 122 129 123 130 private: -
trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp
r290007 r290077 588 588 std::optional<LayoutUnit> GridTrackSizingAlgorithm::estimatedGridAreaBreadthForChild(const RenderBox& child, GridTrackSizingDirection direction) const 589 589 { 590 const GridSpan& span = m_ grid.gridItemSpan(child, direction);590 const GridSpan& span = m_renderGrid->gridSpanForChild(child, direction); 591 591 LayoutUnit gridAreaSize; 592 592 bool gridAreaIsIndefinite = false; … … 629 629 630 630 const Vector<GridTrack>& allTracks = tracks(direction); 631 const GridSpan& span = m_ grid.gridItemSpan(child, direction);631 const GridSpan& span = m_renderGrid->gridSpanForChild(child, direction); 632 632 LayoutUnit gridAreaBreadth; 633 633 for (auto trackPosition : span) … … 651 651 ASSERT(wasSetup()); 652 652 GridTrackSizingDirection direction = gridDirectionForAxis(axis); 653 const GridSpan& span = m_ grid.gridItemSpan(child, direction);653 const GridSpan& span = m_renderGrid->gridSpanForChild(child, direction); 654 654 for (auto trackPosition : span) { 655 655 const auto& trackSize = rawGridTrackSize(direction, trackPosition); … … 860 860 if (childMinSize.isAuto() && overflowIsVisible) { 861 861 auto minSize = minContentForChild(child); 862 const GridSpan& span = m_algorithm. grid().gridItemSpan(child, direction());862 const GridSpan& span = m_algorithm.m_renderGrid->gridSpanForChild(child, direction()); 863 863 864 864 LayoutUnit maxBreadth; … … 919 919 920 920 ItemPosition align = m_renderGrid->selfAlignmentForChild(baselineAxis, child).position(); 921 const auto& span = m_ grid.gridItemSpan(child, gridDirectionForAxis(baselineAxis));921 const auto& span = m_renderGrid->gridSpanForChild(child, gridDirectionForAxis(baselineAxis)); 922 922 m_baselineAlignment.updateBaselineAlignmentContext(align, span.startLine(), child, baselineAxis); 923 923 } … … 929 929 930 930 ItemPosition align = m_renderGrid->selfAlignmentForChild(baselineAxis, child).position(); 931 const auto& span = m_ grid.gridItemSpan(child, gridDirectionForAxis(baselineAxis));931 const auto& span = m_renderGrid->gridSpanForChild(child, gridDirectionForAxis(baselineAxis)); 932 932 return m_baselineAlignment.baselineOffsetForChild(align, span.startLine(), child, baselineAxis); 933 933 } … … 991 991 LayoutUnit freeSpaceForStretchAutoTracksStep() const override; 992 992 bool isComputingSizeContainment() const override { return shouldApplySizeContainment(*renderGrid()); } 993 void accumulateFlexFraction(double& flexFraction, GridIterator&, GridTrackSizingDirection outermostDirection, HashSet<RenderBox*>& itemsSet) const; 993 994 }; 994 995 … … 1012 1013 double flexFactor = track.cachedTrackSize().maxTrackBreadth().flex(); 1013 1014 return track.baseSize() / std::max<double>(1, flexFactor); 1015 } 1016 1017 void IndefiniteSizeStrategy::accumulateFlexFraction(double& flexFraction, GridIterator& iterator, GridTrackSizingDirection outermostDirection, HashSet<RenderBox*>& itemsSet) const 1018 { 1019 while (auto* gridItem = iterator.nextGridItem()) { 1020 if (is<RenderGrid>(gridItem) && downcast<RenderGrid>(gridItem)->isSubgridInParentDirection(iterator.direction())) { 1021 RenderGrid* inner = downcast<RenderGrid>(gridItem); 1022 1023 GridIterator childIterator = GridIterator::createForSubgrid(*inner, iterator); 1024 accumulateFlexFraction(flexFraction, childIterator, outermostDirection, itemsSet); 1025 continue; 1026 } 1027 // Do not include already processed items. 1028 if (!itemsSet.add(gridItem).isNewEntry) 1029 continue; 1030 1031 GridSpan span = m_algorithm.renderGrid()->gridSpanForChild(*gridItem, outermostDirection); 1032 1033 // Removing gutters from the max-content contribution of the item, so they are not taken into account in FindFrUnitSize(). 1034 LayoutUnit leftOverSpace = maxContentForChild(*gridItem) - renderGrid()->guttersSize(m_algorithm.grid(), outermostDirection, span.startLine(), span.integerSpan(), availableSpace()); 1035 flexFraction = std::max(flexFraction, findFrUnitSize(span, leftOverSpace)); 1036 } 1014 1037 } 1015 1038 … … 1033 1056 for (const auto& trackIndex : flexibleSizedTracksIndex) { 1034 1057 GridIterator iterator(grid, direction, trackIndex); 1035 while (auto* gridItem = iterator.nextGridItem()) { 1036 // Do not include already processed items. 1037 if (!itemsSet.add(gridItem).isNewEntry) 1038 continue; 1039 1040 const GridSpan& span = grid.gridItemSpan(*gridItem, direction); 1041 1042 // Removing gutters from the max-content contribution of the item, so they are not taken into account in FindFrUnitSize(). 1043 LayoutUnit leftOverSpace = maxContentForChild(*gridItem) - renderGrid()->guttersSize(m_algorithm.grid(), direction, span.startLine(), span.integerSpan(), availableSpace()); 1044 flexFraction = std::max(flexFraction, findFrUnitSize(span, leftOverSpace)); 1045 } 1058 accumulateFlexFraction(flexFraction, iterator, direction, itemsSet); 1046 1059 } 1047 1060 … … 1210 1223 } 1211 1224 1225 void GridTrackSizingAlgorithm::accumulateIntrinsicSizesForTrack(GridTrack& track, GridIterator& iterator, Vector<GridItemWithSpan>& itemsSortedByIncreasingSpan, Vector<GridItemWithSpan>& itemsCrossingFlexibleTracks, HashSet<RenderBox*>& itemsSet) 1226 { 1227 while (auto* gridItem = iterator.nextGridItem()) { 1228 bool isNewEntry = itemsSet.add(gridItem).isNewEntry; 1229 if (is<RenderGrid>(gridItem) && downcast<RenderGrid>(gridItem)->isSubgridInParentDirection(iterator.direction())) { 1230 RenderGrid* inner = downcast<RenderGrid>(gridItem); 1231 1232 GridIterator childIterator = GridIterator::createForSubgrid(*inner, iterator); 1233 accumulateIntrinsicSizesForTrack(track, childIterator, itemsSortedByIncreasingSpan, itemsCrossingFlexibleTracks, itemsSet); 1234 continue; 1235 } 1236 if (!isNewEntry) 1237 continue; 1238 GridSpan span = m_renderGrid->gridSpanForChild(*gridItem, m_direction); 1239 1240 if (spanningItemCrossesFlexibleSizedTracks(span)) 1241 itemsCrossingFlexibleTracks.append(GridItemWithSpan(*gridItem, span)); 1242 else if (span.integerSpan() == 1) 1243 sizeTrackToFitNonSpanningItem(span, *gridItem, track); 1244 else 1245 itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span)); 1246 } 1247 } 1248 1212 1249 void GridTrackSizingAlgorithm::resolveIntrinsicTrackSizes() 1213 1250 { … … 1229 1266 Vector<GridItemWithSpan> itemsCrossingFlexibleTracks; 1230 1267 HashSet<RenderBox*> itemsSet; 1268 1231 1269 if (m_grid.hasGridItems()) { 1232 1270 for (auto trackIndex : m_contentSizedTracksIndex) { … … 1234 1272 GridTrack& track = allTracks[trackIndex]; 1235 1273 1236 while (auto* gridItem = iterator.nextGridItem()) { 1237 if (itemsSet.add(gridItem).isNewEntry) { 1238 const GridSpan& span = m_grid.gridItemSpan(*gridItem, m_direction); 1239 if (spanningItemCrossesFlexibleSizedTracks(span)) 1240 itemsCrossingFlexibleTracks.append(GridItemWithSpan(*gridItem, span)); 1241 else if (span.integerSpan() == 1) 1242 sizeTrackToFitNonSpanningItem(span, *gridItem, track); 1243 else 1244 itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span)); 1245 } 1246 } 1274 accumulateIntrinsicSizesForTrack(track, iterator, itemsSortedByIncreasingSpan, itemsCrossingFlexibleTracks, itemsSet); 1247 1275 } 1248 1276 std::sort(itemsSortedByIncreasingSpan.begin(), itemsSortedByIncreasingSpan.end()); -
trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h
r290007 r290077 56 56 57 57 class GridTrackSizingAlgorithmStrategy; 58 class GridItemWithSpan; 58 59 59 60 class GridTrack { … … 121 122 // and encapsulate any access in the algorithm class. 122 123 Grid& mutableGrid() const { return m_grid; } 124 125 const RenderGrid* renderGrid() { return m_renderGrid; }; 123 126 124 127 LayoutUnit minContentSize() const { return m_minContentSize; }; … … 194 197 void stretchAutoTracks(); 195 198 199 void accumulateIntrinsicSizesForTrack(GridTrack&, GridIterator&, Vector<GridItemWithSpan>& itemsSortedByIncreasingSpan, Vector<GridItemWithSpan>& itemsCrossingFlexibleTracks, HashSet<RenderBox*>& itemsSet); 200 196 201 bool copyUsedTrackSizesForSubgrid(); 197 202 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r290032 r290077 648 648 } 649 649 650 void RenderGrid::placeItems() 651 { 652 updateLogicalWidth(); 653 654 LayoutUnit availableSpaceForColumns = availableLogicalWidth(); 655 placeItemsOnGrid(m_trackSizingAlgorithm, availableSpaceForColumns); 656 } 657 658 static GridArea insertIntoGrid(Grid& grid, RenderBox& child, const GridArea& area) 659 { 660 GridArea clamped = grid.insert(child, area); 661 if (!is<RenderGrid>(child)) 662 return clamped; 663 664 RenderGrid& renderGrid = downcast<RenderGrid>(child); 665 if (renderGrid.isSubgridRows() || renderGrid.isSubgridColumns()) 666 renderGrid.placeItems(); 667 return clamped; 668 } 669 650 670 // FIXME: We shouldn't have to pass the available logical width as argument. The problem is that 651 671 // availableLogicalWidth() does always return a value even if we cannot resolve it like when … … 701 721 continue; 702 722 } 703 grid.insert(*child, { area.rows, area.columns });723 insertIntoGrid(grid, *child, { area.rows, area.columns }); 704 724 } 705 725 … … 831 851 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 832 852 833 *emptyGridArea = grid.insert(*autoGridItem, *emptyGridArea);853 *emptyGridArea = insertIntoGrid(grid, *autoGridItem, *emptyGridArea); 834 854 835 855 if (!isGridAutoFlowDense) … … 903 923 } 904 924 905 grid.insert(gridItem, *emptyGridArea);925 *emptyGridArea = insertIntoGrid(grid, gridItem, *emptyGridArea); 906 926 autoPlacementCursor.first = emptyGridArea->rows.startLine(); 907 927 autoPlacementCursor.second = emptyGridArea->columns.startLine(); … … 1016 1036 1017 1037 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { 1018 1019 1038 if (m_grid.orderIterator().shouldSkipChild(*child)) { 1020 1039 if (child->isOutOfFlowPositioned()) … … 1022 1041 continue; 1023 1042 } 1043 1044 if (is<RenderGrid>(child) && (downcast<RenderGrid>(child)->isSubgridColumns() || downcast<RenderGrid>(child)->isSubgridRows())) 1045 child->setNeedsLayout(MarkOnlyThis); 1024 1046 1025 1047 // Setting the definite grid area's sizes. It may imply that the … … 1637 1659 return false; 1638 1660 return is<RenderGrid>(parent()); 1661 } 1662 1663 bool RenderGrid::isSubgridInParentDirection(GridTrackSizingDirection parentDirection) const 1664 { 1665 if (!is<RenderGrid>(parent())) 1666 return false; 1667 GridTrackSizingDirection direction = GridLayoutFunctions::flowAwareDirectionForChild(*downcast<RenderGrid>(parent()), *this, parentDirection); 1668 return isSubgrid(direction); 1639 1669 } 1640 1670 -
trunk/Source/WebCore/rendering/RenderGrid.h
r290007 r290077 96 96 return isSubgrid(ForColumns); 97 97 } 98 bool isSubgridInParentDirection(GridTrackSizingDirection parentDirection) const; 98 99 99 100 const Grid& currentGrid() const … … 106 107 return numTracks(direction, m_grid); 107 108 } 109 110 void placeItems(); 108 111 109 112 private:
Note: See TracChangeset
for help on using the changeset viewer.