Changeset 289986 in webkit
- Timestamp:
- Feb 16, 2022 5:31:02 PM (5 months ago)
- Location:
- trunk
- Files:
-
- 13 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-002-expected.html (modified) (2 diffs)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-005-expected.html (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/rendering/Grid.cpp (modified) (3 diffs)
-
Source/WebCore/rendering/Grid.h (modified) (3 diffs)
-
Source/WebCore/rendering/GridLayoutFunctions.cpp (modified) (1 diff)
-
Source/WebCore/rendering/GridLayoutFunctions.h (modified) (1 diff)
-
Source/WebCore/rendering/RenderGrid.cpp (modified) (11 diffs)
-
Source/WebCore/rendering/RenderGrid.h (modified) (3 diffs)
-
Source/WebCore/rendering/style/GridArea.h (modified) (2 diffs)
-
Source/WebCore/rendering/style/GridPositionsResolver.cpp (modified) (14 diffs)
-
Source/WebCore/rendering/style/GridPositionsResolver.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r289981 r289986 1 2022-02-16 Matt Woodrow <mattwoodrow@apple.com> 2 3 Inherit track count from parent grid for subgridded axes and clamp item placement to that explicit grid. 4 https://bugs.webkit.org/show_bug.cgi?id=236122 5 6 Reviewed by Dean Jackson. 7 8 Test changes to match latest spec, submitted upstream as https://github.com/web-platform-tests/wpt/pull/32629 9 10 * web-platform-tests/css/css-grid/subgrid/line-names-002-expected.html: 11 * web-platform-tests/css/css-grid/subgrid/line-names-005-expected.html: 12 1 13 2022-02-16 Said Abou-Hallawa <said@apple.com> 2 14 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-002-expected.html
r262056 r289986 15 15 .grid { 16 16 display: grid; 17 grid: auto / [a] 50px 50px [a] 50px 50px [a];17 grid: auto / [a] 50px 40px [a] 10px 50px [a]; 18 18 padding: 20px 10px; 19 19 } … … 33 33 <div class="grid"> 34 34 <div class="subgrid"> 35 <x style="grid-column: 1 / 3"></x>35 <x style="grid-column: 3 / 4"></x> 36 36 </div> 37 37 </div> -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/line-names-005-expected.html
r262056 r289986 116 116 <i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i> 117 117 <div class="subgrid2"> 118 <x style="grid-column: span 4/ 11">x</x>118 <x style="grid-column: span 3 / 11">x</x> 119 119 </div> 120 120 </div> … … 130 130 <i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i> 131 131 <div style="display:grid; grid:auto/subgrid; grid-column: span 10; grid-row:2"> 132 <x style="grid-column: 1 / 11">x</x>132 <x style="grid-column: 10 / 11">x</x> 133 133 </div> 134 134 </div> -
trunk/Source/WebCore/ChangeLog
r289981 r289986 1 2022-02-16 Matt Woodrow <mattwoodrow@apple.com> 2 3 Inherit track count from parent grid for subgridded axes and clamp item placement to that explicit grid. 4 https://bugs.webkit.org/show_bug.cgi?id=236122 5 6 Reviewed by Dean Jackson. 7 8 Changes GridPositionsResolver::explicitGrid<>Count to return the number of tracks 9 spanned in the parent grid, for axes that are a subgrid. 10 11 Updates adjustGridPositionsForStyle to use the number of lines specified in the 12 subgrid property, for grid items that are also a subgrid and have an otherwise 13 indefinite span. 14 15 Adds clamping support to Grid so that we can prevent subgrids from ever adding 16 new implicit tracks. 17 18 * rendering/Grid.cpp: 19 (WebCore::Grid::insert): 20 (WebCore::Grid::setClampingForSubgrid): 21 (WebCore::Grid::clampAndTranslateToImplicitGrid): 22 (WebCore::Grid::setNeedsItemsPlacement): 23 * rendering/Grid.h: 24 * rendering/RenderGrid.cpp: 25 (WebCore::RenderGrid::computeIntrinsicLogicalWidths const): 26 (WebCore::RenderGrid::placeItemsOnGrid const): 27 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator const): 28 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid const): 29 (WebCore::RenderGrid::isSubgrid const): 30 (WebCore::RenderGrid::isSubgridRows const): 31 (WebCore::RenderGrid::isSubgridColumns const): 32 (WebCore::RenderGrid::gridAreaBreadthForOutOfFlowChild): 33 (WebCore::RenderGrid::numTracks const): 34 (WebCore::transposedDirection): 35 (WebCore::RenderGrid::computeGridSpanForOutOfFlowChild const): 36 (WebCore::RenderGrid::gridSpanForOutOfFlowChild const): 37 (WebCore::RenderGrid::gridSpanForChild const): 38 * rendering/RenderGrid.h: 39 * rendering/style/GridArea.h: 40 (WebCore::GridSpan::integerSpan const): 41 (WebCore::GridSpan::translateTo): 42 (WebCore::GridSpan::clamp): 43 * rendering/style/GridPositionsResolver.cpp: 44 (WebCore::isIndefiniteSpan): 45 (WebCore::adjustGridPositionsFromStyle): 46 (WebCore::GridPositionsResolver::explicitGridColumnCount): 47 (WebCore::GridPositionsResolver::explicitGridRowCount): 48 (WebCore::explicitGridSizeForSide): 49 (WebCore::resolveNamedGridLinePositionFromStyle): 50 (WebCore::resolveNamedGridLinePositionAgainstOppositePosition): 51 (WebCore::resolveGridPositionAgainstOppositePosition): 52 (WebCore::resolveGridPositionFromStyle): 53 (WebCore::GridPositionsResolver::resolveGridPositionsFromStyle): 54 * rendering/style/GridPositionsResolver.h: 55 1 56 2022-02-16 Said Abou-Hallawa <said@apple.com> 2 57 -
trunk/Source/WebCore/rendering/Grid.cpp
r284093 r289986 62 62 } 63 63 64 void Grid::insert(RenderBox& child, const GridArea& area) 65 { 66 ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslatedDefinite()); 67 ensureGridSize(area.rows.endLine(), area.columns.endLine()); 68 69 for (auto row : area.rows) { 70 for (auto column : area.columns) 64 GridArea Grid::insert(RenderBox& child, const GridArea& area) 65 { 66 GridArea clampedArea = area; 67 if (m_maxRows) 68 clampedArea.rows.clamp(m_maxRows); 69 if (m_maxColumns) 70 clampedArea.columns.clamp(m_maxColumns); 71 72 ASSERT(clampedArea.rows.isTranslatedDefinite() && clampedArea.columns.isTranslatedDefinite()); 73 ensureGridSize(clampedArea.rows.endLine(), clampedArea.columns.endLine()); 74 75 for (auto row : clampedArea.rows) { 76 for (auto column : clampedArea.columns) 71 77 m_grid[row][column].append(child); 72 78 } 73 79 74 setGridItemArea(child, area); 80 setGridItemArea(child, clampedArea); 81 return clampedArea; 75 82 } 76 83 … … 84 91 { 85 92 return direction == ForRows ? m_explicitRowStart : m_explicitColumnStart; 93 } 94 95 void Grid::setClampingForSubgrid(unsigned maxRows, unsigned maxColumns) 96 { 97 m_maxRows = maxRows; 98 m_maxColumns = maxColumns; 99 } 100 101 void Grid::clampAreaToSubgridIfNeeded(GridArea& area) 102 { 103 if (!area.rows.isIndefinite()) { 104 if (m_maxRows) 105 area.rows.clamp(m_maxRows); 106 } 107 if (!area.columns.isIndefinite()) { 108 if (m_maxColumns) 109 area.columns.clamp(m_maxColumns); 110 } 86 111 } 87 112 … … 162 187 m_autoRepeatColumns = 0; 163 188 m_autoRepeatRows = 0; 189 m_maxColumns = 0; 190 m_maxRows = 0; 164 191 } 165 192 -
trunk/Source/WebCore/rendering/Grid.h
r270293 r289986 49 49 50 50 void ensureGridSize(unsigned maximumRowSize, unsigned maximumColumnSize); 51 voidinsert(RenderBox&, const GridArea&);51 GridArea insert(RenderBox&, const GridArea&); 52 52 53 53 // Note that each in flow child of a grid container becomes a grid item. This means that … … 67 67 unsigned autoRepeatTracks(GridTrackSizingDirection) const; 68 68 void setAutoRepeatTracks(unsigned autoRepeatRows, unsigned autoRepeatColumns); 69 70 void setClampingForSubgrid(unsigned maxRows, unsigned maxColumns); 71 72 void clampAreaToSubgridIfNeeded(GridArea&); 69 73 70 74 void setAutoRepeatEmptyColumns(std::unique_ptr<OrderedTrackIndexSet>); … … 92 96 unsigned m_autoRepeatColumns { 0 }; 93 97 unsigned m_autoRepeatRows { 0 }; 98 99 unsigned m_maxColumns { 0 }; 100 unsigned m_maxRows { 0 }; 94 101 95 102 bool m_needsItemsPlacement { true }; -
trunk/Source/WebCore/rendering/GridLayoutFunctions.cpp
r285987 r289986 103 103 } 104 104 105 bool isFlippedDirection(const RenderGrid& grid, GridTrackSizingDirection direction) 106 { 107 if (direction == ForColumns) 108 return !grid.style().isLeftToRightDirection(); 109 return grid.style().isFlippedBlocksWritingMode(); 110 } 111 112 bool isSubgridReversedDirection(const RenderGrid& grid, GridTrackSizingDirection outerDirection, const RenderGrid& subgrid) 113 { 114 GridTrackSizingDirection childDirection = flowAwareDirectionForChild(grid, subgrid, outerDirection); 115 ASSERT(subgrid.isSubgrid(childDirection)); 116 return isFlippedDirection(grid, outerDirection) != isFlippedDirection(subgrid, childDirection); 117 } 118 105 119 } // namespace GridLayoutFunctions 106 120 -
trunk/Source/WebCore/rendering/GridLayoutFunctions.h
r285497 r289986 46 46 std::optional<LayoutUnit> overridingContainingBlockContentSizeForChild(const RenderBox&, GridTrackSizingDirection); 47 47 48 bool isFlippedDirection(const RenderGrid&, GridTrackSizingDirection); 49 bool isSubgridReversedDirection(const RenderGrid&, GridTrackSizingDirection outerDirection, const RenderGrid& subgrid); 50 48 51 } 49 52 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r289437 r289986 447 447 bool hadExcludedChildren = computePreferredWidthsForExcludedChildren(childMinWidth, childMaxWidth); 448 448 449 Grid grid(const_cast<RenderGrid&>(*this)); 450 GridTrackSizingAlgorithm algorithm(this, grid); 449 GridTrackSizingAlgorithm algorithm(this, const_cast<Grid&>(m_grid)); 451 450 placeItemsOnGrid(algorithm, std::nullopt); 452 451 … … 642 641 unsigned autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, availableLogicalWidth); 643 642 unsigned autoRepeatRows = computeAutoRepeatTracksCount(ForRows, availableLogicalHeightForPercentageComputation()); 644 645 643 autoRepeatRows = clampAutoRepeatTracks(ForRows, autoRepeatRows); 646 644 autoRepeatColumns = clampAutoRepeatTracks(ForColumns, autoRepeatColumns); … … 671 669 672 670 GridArea area = grid.gridItemArea(*child); 671 grid.clampAreaToSubgridIfNeeded(area); 673 672 if (!area.rows.isIndefinite()) 674 673 area.rows.translate(grid.explicitGridStart(ForRows)); … … 691 690 #if ASSERT_ENABLED 692 691 if (grid.hasGridItems()) { 693 ASSERT(grid.numTracks(ForRows) >= GridPositionsResolver::explicitGridRowCount( style(), grid.autoRepeatTracks(ForRows)));694 ASSERT(grid.numTracks(ForColumns) >= GridPositionsResolver::explicitGridColumnCount( style(), grid.autoRepeatTracks(ForColumns)));692 ASSERT(grid.numTracks(ForRows) >= GridPositionsResolver::explicitGridRowCount(*this)); 693 ASSERT(grid.numTracks(ForColumns) >= GridPositionsResolver::explicitGridColumnCount(*this)); 695 694 } 696 695 #endif … … 746 745 unsigned explicitRowStart = 0; 747 746 unsigned explicitColumnStart = 0; 748 unsigned autoRepeatRows = grid.autoRepeatTracks(ForRows); 749 unsigned autoRepeatColumns = grid.autoRepeatTracks(ForColumns); 750 unsigned maximumRowIndex = GridPositionsResolver::explicitGridRowCount(style(), autoRepeatRows); 751 unsigned maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(style(), autoRepeatColumns); 747 unsigned maximumRowIndex = GridPositionsResolver::explicitGridRowCount(*this); 748 unsigned maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(*this); 752 749 753 750 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { … … 755 752 continue; 756 753 757 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromStyle(style(), *child, ForRows, autoRepeatRows); 758 if (!rowPositions.isIndefinite()) { 759 explicitRowStart = std::max<int>(explicitRowStart, -rowPositions.untranslatedStartLine()); 760 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine()); 761 } else { 762 // Grow the grid for items with a definite row span, getting the largest such span. 763 unsigned spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*child, ForRows); 764 maximumRowIndex = std::max(maximumRowIndex, spanSize); 765 } 766 767 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFromStyle(style(), *child, ForColumns, autoRepeatColumns); 768 if (!columnPositions.isIndefinite()) { 769 explicitColumnStart = std::max<int>(explicitColumnStart, -columnPositions.untranslatedStartLine()); 770 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositions.untranslatedEndLine()); 771 } else { 772 // Grow the grid for items with a definite column span, getting the largest such span. 773 unsigned spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*child, ForColumns); 774 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); 754 GridSpan rowPositions = GridPositionsResolver::resolveGridPositionsFromStyle(*child, ForRows); 755 if (!isSubgridRows()) { 756 if (!rowPositions.isIndefinite()) { 757 explicitRowStart = std::max<int>(explicitRowStart, -rowPositions.untranslatedStartLine()); 758 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untranslatedEndLine()); 759 } else { 760 // Grow the grid for items with a definite row span, getting the largest such span. 761 unsigned spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*child, ForRows); 762 maximumRowIndex = std::max(maximumRowIndex, spanSize); 763 } 764 } 765 766 GridSpan columnPositions = GridPositionsResolver::resolveGridPositionsFromStyle(*child, ForColumns); 767 if (!isSubgridColumns()) { 768 if (!columnPositions.isIndefinite()) { 769 explicitColumnStart = std::max<int>(explicitColumnStart, -columnPositions.untranslatedStartLine()); 770 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositions.untranslatedEndLine()); 771 } else { 772 // Grow the grid for items with a definite column span, getting the largest such span. 773 unsigned spanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(*child, ForColumns); 774 maximumColumnIndex = std::max(maximumColumnIndex, spanSize); 775 } 775 776 } 776 777 … … 780 781 grid.setExplicitGridStart(explicitRowStart, explicitColumnStart); 781 782 grid.ensureGridSize(maximumRowIndex + explicitRowStart, maximumColumnIndex + explicitColumnStart); 783 grid.setClampingForSubgrid(isSubgridRows() ? maximumRowIndex : 0, isSubgridColumns() ? maximumColumnIndex : 0); 782 784 } 783 785 … … 813 815 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 814 816 815 grid.insert(*autoGridItem, *emptyGridArea);817 *emptyGridArea = grid.insert(*autoGridItem, *emptyGridArea); 816 818 817 819 if (!isGridAutoFlowDense) … … 1611 1613 } 1612 1614 1615 bool RenderGrid::isSubgrid(GridTrackSizingDirection direction) const 1616 { 1617 if (isOutOfFlowPositioned() || isExcludedFromNormalLayout()) 1618 return false; 1619 if ((direction == ForColumns) ? !style().gridSubgridColumns() : !style().gridSubgridRows()) 1620 return false; 1621 return is<RenderGrid>(parent()); 1622 } 1623 1613 1624 LayoutUnit RenderGrid::gridAreaBreadthForOutOfFlowChild(const RenderBox& child, GridTrackSizingDirection direction) 1614 1625 { 1615 1626 ASSERT(child.isOutOfFlowPositioned()); 1616 1627 bool isRowAxis = direction == ForColumns; 1617 GridSpan span = GridPositionsResolver::resolveGridPositionsFromStyle(style(), child, direction, autoRepeatCountForDirection(direction)); 1618 if (span.isIndefinite()) 1628 int lastLine = numTracks(direction, m_grid); 1629 1630 int startLine, endLine; 1631 bool startIsAuto, endIsAuto; 1632 if (!computeGridPositionsForOutOfFlowChild(child, direction, startLine, startIsAuto, endLine, endIsAuto)) 1619 1633 return isRowAxis ? clientLogicalWidth() : clientLogicalHeight(); 1620 1621 unsigned explicitStart = m_grid.explicitGridStart(direction);1622 int startLine = span.untranslatedStartLine() + explicitStart;1623 int endLine = span.untranslatedEndLine() + explicitStart;1624 int lastLine = numTracks(direction, m_grid);1625 GridPosition startPosition = direction == ForColumns ? child.style().gridItemColumnStart() : child.style().gridItemRowStart();1626 GridPosition endPosition = direction == ForColumns ? child.style().gridItemColumnEnd() : child.style().gridItemRowEnd();1627 1628 bool startIsAuto = startPosition.isAuto() || startLine < 0 || startLine > lastLine;1629 bool endIsAuto = endPosition.isAuto() || endLine < 0 || endLine > lastLine;1630 1634 1631 1635 if (startIsAuto && endIsAuto) … … 1921 1925 1922 1926 // FIXME: This still requires knowledge about m_grid internals. 1923 return grid.numTracks(ForRows) ? grid.numTracks(ForColumns) : GridPositionsResolver::explicitGridColumnCount( style(), grid.autoRepeatTracks(ForColumns));1927 return grid.numTracks(ForRows) ? grid.numTracks(ForColumns) : GridPositionsResolver::explicitGridColumnCount(*this); 1924 1928 } 1925 1929 … … 1978 1982 } 1979 1983 1984 bool RenderGrid::computeGridPositionsForOutOfFlowChild(const RenderBox& child, GridTrackSizingDirection direction, int& startLine, bool& startIsAuto, int& endLine, bool& endIsAuto) const 1985 { 1986 ASSERT(child.isOutOfFlowPositioned()); 1987 int lastLine = numTracks(direction, m_grid); 1988 GridSpan span = GridPositionsResolver::resolveGridPositionsFromStyle(child, direction); 1989 if (span.isIndefinite()) 1990 return false; 1991 1992 unsigned explicitStart = m_grid.explicitGridStart(direction); 1993 startLine = span.untranslatedStartLine() + explicitStart; 1994 endLine = span.untranslatedEndLine() + explicitStart; 1995 1996 GridPosition startPosition = direction == ForColumns ? child.style().gridItemColumnStart() : child.style().gridItemRowStart(); 1997 GridPosition endPosition = direction == ForColumns ? child.style().gridItemColumnEnd() : child.style().gridItemRowEnd(); 1998 1999 startIsAuto = startPosition.isAuto() || startLine < 0 || startLine > lastLine; 2000 endIsAuto = endPosition.isAuto() || endLine < 0 || endLine > lastLine; 2001 return true; 2002 } 2003 2004 GridSpan RenderGrid::gridSpanForOutOfFlowChild(const RenderBox& child, GridTrackSizingDirection direction) const 2005 { 2006 int lastLine = numTracks(direction, m_grid); 2007 int startLine, endLine; 2008 bool startIsAuto, endIsAuto; 2009 if (!computeGridPositionsForOutOfFlowChild(child, direction, startLine, startIsAuto, endLine, endIsAuto)) 2010 return GridSpan::translatedDefiniteGridSpan(0, lastLine); 2011 return GridSpan::translatedDefiniteGridSpan(startIsAuto ? 0 : startLine, endIsAuto ? lastLine : endLine); 2012 } 2013 2014 GridSpan RenderGrid::gridSpanForChild(const RenderBox& child, GridTrackSizingDirection direction) const 2015 { 2016 ASSERT(is<RenderGrid>(child.parent())); 2017 2018 RenderGrid* renderGrid = downcast<RenderGrid>(child.parent()); 2019 // |direction| is specified relative to this grid, switch it if |child|'s direct parent grid 2020 // is using a different writing mode. 2021 direction = GridLayoutFunctions::flowAwareDirectionForChild(*this, *renderGrid, direction); 2022 GridSpan span = child.isOutOfFlowPositioned() ? renderGrid->gridSpanForOutOfFlowChild(child, direction) : renderGrid->currentGrid().gridItemSpan(child, direction); 2023 2024 while (renderGrid != this) { 2025 ASSERT(is<RenderGrid>(renderGrid->parent())); 2026 RenderGrid* parent = downcast<RenderGrid>(renderGrid->parent()); 2027 2028 bool isSubgrid = renderGrid->isSubgrid(direction); 2029 2030 direction = GridLayoutFunctions::flowAwareDirectionForChild(*parent, *renderGrid, direction); 2031 2032 GridSpan parentSpan = renderGrid->isOutOfFlowPositioned() ? parent->gridSpanForOutOfFlowChild(*renderGrid, direction) : parent->currentGrid().gridItemSpan(*renderGrid, direction); 2033 if (isSubgrid) 2034 span.translateTo(parentSpan, GridLayoutFunctions::isSubgridReversedDirection(*parent, direction, *renderGrid)); 2035 else 2036 span = parentSpan; 2037 renderGrid = parent; 2038 } 2039 return span; 2040 } 2041 1980 2042 } // namespace WebCore -
trunk/Source/WebCore/rendering/RenderGrid.h
r289437 r289986 83 83 StyleContentAlignmentData contentAlignment(GridTrackSizingDirection) const; 84 84 85 // Computes the span relative to this RenderGrid, even if the RenderBox is a child 86 // of a descendant subgrid. 87 GridSpan gridSpanForChild(const RenderBox&, GridTrackSizingDirection) const; 88 89 bool isSubgrid(GridTrackSizingDirection) const; 90 bool isSubgridRows() const 91 { 92 return isSubgrid(ForRows); 93 } 94 bool isSubgridColumns() const 95 { 96 return isSubgrid(ForColumns); 97 } 98 99 const Grid& currentGrid() const 100 { 101 return m_grid; 102 } 103 85 104 private: 86 105 ItemPosition selfAlignmentNormalBehavior(const RenderBox* child = nullptr) const override … … 151 170 void setLogicalOffsetForChild(RenderBox&, GridTrackSizingDirection) const; 152 171 LayoutUnit logicalOffsetForChild(const RenderBox&, GridTrackSizingDirection) const; 153 GridArea cachedGridArea(const RenderBox&) const;154 GridSpan cachedGridSpan(const RenderBox&, GridTrackSizingDirection) const;155 172 156 173 LayoutUnit gridAreaBreadthForChildIncludingAlignmentOffsets(const RenderBox&, GridTrackSizingDirection) const; … … 194 211 Vector<RenderBox*> computeAspectRatioDependentAndBaselineItems(); 195 212 213 GridSpan gridSpanForOutOfFlowChild(const RenderBox&, GridTrackSizingDirection) const; 214 bool computeGridPositionsForOutOfFlowChild(const RenderBox&, GridTrackSizingDirection, int&, bool&, int&, bool&) const; 215 196 216 Grid m_grid; 197 217 -
trunk/Source/WebCore/rendering/style/GridArea.h
r254087 r289986 66 66 unsigned integerSpan() const 67 67 { 68 ASSERT( isTranslatedDefinite());68 ASSERT(!isIndefinite()); 69 69 return m_endLine - m_startLine; 70 70 } … … 140 140 ASSERT(m_startLine >= 0); 141 141 ASSERT(m_endLine > 0); 142 } 143 144 // Moves this span to be in the same coordinate space as |parent|. 145 // If reverse is specified, then swaps the direction to handle RTL/LTR changes. 146 void translateTo(const GridSpan& parent, bool reverse) 147 { 148 ASSERT(m_type == TranslatedDefinite); 149 ASSERT(parent.m_type == TranslatedDefinite); 150 if (reverse) { 151 int start = m_startLine; 152 m_startLine = parent.endLine() - m_endLine; 153 m_endLine = parent.endLine() - start; 154 } else { 155 m_startLine += parent.m_startLine; 156 m_endLine += parent.m_startLine; 157 } 158 } 159 160 void clamp(int max) 161 { 162 ASSERT(m_type != Indefinite); 163 m_startLine = std::max(m_startLine, 0); 164 m_endLine = std::max(std::min(m_endLine, max), 1); 165 if (m_startLine >= m_endLine) 166 m_startLine = m_endLine - 1; 142 167 } 143 168 -
trunk/Source/WebCore/rendering/style/GridPositionsResolver.cpp
r262262 r289986 34 34 #include "GridArea.h" 35 35 #include "RenderBox.h" 36 #include "RenderGrid.h" 36 37 #include <cstdlib> 37 38 … … 153 154 } 154 155 156 // https://drafts.csswg.org/css-grid-2/#indefinite-grid-span 157 static bool isIndefiniteSpan(GridPosition& initialPosition, GridPosition& finalPosition) 158 { 159 if (initialPosition.isAuto()) 160 return !finalPosition.isSpan(); 161 if (finalPosition.isAuto()) 162 return !initialPosition.isSpan(); 163 return false; 164 } 165 155 166 static void adjustGridPositionsFromStyle(const RenderBox& gridItem, GridTrackSizingDirection direction, GridPosition& initialPosition, GridPosition& finalPosition) 156 167 { … … 169 180 if (finalPosition.isAuto() && initialPosition.isSpan() && !initialPosition.namedGridLine().isNull()) 170 181 initialPosition.setSpanPosition(1, String()); 171 } 172 173 unsigned GridPositionsResolver::explicitGridColumnCount(const RenderStyle& gridContainerStyle, unsigned autoRepeatTracksCount) 174 { 175 return std::min<unsigned>(std::max(gridContainerStyle.gridColumns().size() + autoRepeatTracksCount, gridContainerStyle.namedGridAreaColumnCount()), GridPosition::max()); 176 } 177 178 unsigned GridPositionsResolver::explicitGridRowCount(const RenderStyle& gridContainerStyle, unsigned autoRepeatTracksCount) 179 { 180 return std::min<unsigned>(std::max(gridContainerStyle.gridRows().size() + autoRepeatTracksCount, gridContainerStyle.namedGridAreaRowCount()), GridPosition::max()); 181 } 182 183 static unsigned explicitGridSizeForSide(const RenderStyle& gridContainerStyle, GridPositionSide side, unsigned autoRepeatTracksCount) 184 { 185 return isColumnSide(side) ? GridPositionsResolver::explicitGridColumnCount(gridContainerStyle, autoRepeatTracksCount) : GridPositionsResolver::explicitGridRowCount(gridContainerStyle, autoRepeatTracksCount); 182 183 if (isIndefiniteSpan(initialPosition, finalPosition) && is<RenderGrid>(gridItem) && downcast<RenderGrid>(gridItem).isSubgrid(direction)) { 184 // Indefinite span for an item that is subgridded in this axis. 185 int lineCount = (isForColumns ? gridItem.style().orderedNamedGridColumnLines() : gridItem.style().orderedNamedGridRowLines()).size(); 186 187 if (initialPosition.isAuto()) { 188 // Set initial position to span <line names - 1> 189 initialPosition.setSpanPosition(std::max(1, lineCount - 1), ""); 190 } else { 191 // Set final position to span <line names - 1> 192 finalPosition.setSpanPosition(std::max(1, lineCount - 1), ""); 193 } 194 } 195 } 196 197 unsigned GridPositionsResolver::explicitGridColumnCount(const RenderGrid& gridContainer) 198 { 199 if (gridContainer.isSubgridColumns()) { 200 const RenderGrid& parent = *downcast<RenderGrid>(gridContainer.parent()); 201 GridTrackSizingDirection direction = GridLayoutFunctions::flowAwareDirectionForChild(parent, gridContainer, ForColumns); 202 return parent.gridSpanForChild(gridContainer, direction).integerSpan(); 203 } 204 return std::min<unsigned>(std::max(gridContainer.style().gridColumns().size() + gridContainer.autoRepeatCountForDirection(ForColumns), gridContainer.style().namedGridAreaColumnCount()), GridPosition::max()); 205 } 206 207 unsigned GridPositionsResolver::explicitGridRowCount(const RenderGrid& gridContainer) 208 { 209 if (gridContainer.isSubgridRows()) { 210 const RenderGrid& parent = *downcast<RenderGrid>(gridContainer.parent()); 211 GridTrackSizingDirection direction = GridLayoutFunctions::flowAwareDirectionForChild(parent, gridContainer, ForRows); 212 return parent.gridSpanForChild(gridContainer, direction).integerSpan(); 213 } 214 return std::min<unsigned>(std::max(gridContainer.style().gridRows().size() + gridContainer.autoRepeatCountForDirection(ForRows), gridContainer.style().namedGridAreaRowCount()), GridPosition::max()); 215 } 216 217 static unsigned explicitGridSizeForSide(const RenderGrid& gridContainer, GridPositionSide side) 218 { 219 return isColumnSide(side) ? GridPositionsResolver::explicitGridColumnCount(gridContainer) : GridPositionsResolver::explicitGridRowCount(gridContainer); 186 220 } 187 221 … … 225 259 } 226 260 227 static int resolveNamedGridLinePositionFromStyle(const Render Style& gridContainerStyle, const GridPosition& position, GridPositionSide side, unsigned autoRepeatTracksCount)261 static int resolveNamedGridLinePositionFromStyle(const RenderGrid& gridContainer, const GridPosition& position, GridPositionSide side) 228 262 { 229 263 ASSERT(!position.namedGridLine().isNull()); 230 264 231 unsigned lastLine = explicitGridSizeForSide(gridContainer Style, side, autoRepeatTracksCount);232 NamedLineCollection linesCollection(gridContainer Style, position.namedGridLine(), directionFromSide(side), lastLine, autoRepeatTracksCount);265 unsigned lastLine = explicitGridSizeForSide(gridContainer, side); 266 NamedLineCollection linesCollection(gridContainer.style(), position.namedGridLine(), directionFromSide(side), lastLine, gridContainer.autoRepeatCountForDirection(directionFromSide(side))); 233 267 234 268 if (position.isPositive()) … … 251 285 } 252 286 253 static GridSpan resolveNamedGridLinePositionAgainstOppositePosition(const Render Style& gridContainerStyle, int oppositeLine, const GridPosition& position, GridPositionSide side, unsigned autoRepeatTracksCount)287 static GridSpan resolveNamedGridLinePositionAgainstOppositePosition(const RenderGrid& gridContainer, int oppositeLine, const GridPosition& position, GridPositionSide side) 254 288 { 255 289 ASSERT(position.isSpan()); … … 258 292 ASSERT(position.spanPosition() > 0); 259 293 260 unsigned lastLine = explicitGridSizeForSide(gridContainer Style, side, autoRepeatTracksCount);261 NamedLineCollection linesCollection(gridContainer Style, position.namedGridLine(), directionFromSide(side), lastLine, autoRepeatTracksCount);294 unsigned lastLine = explicitGridSizeForSide(gridContainer, side); 295 NamedLineCollection linesCollection(gridContainer.style(), position.namedGridLine(), directionFromSide(side), lastLine, gridContainer.autoRepeatCountForDirection(directionFromSide(side))); 262 296 return definiteGridSpanWithNamedLineSpanAgainstOpposite(oppositeLine, position, side, lastLine, linesCollection); 263 297 } 264 298 265 static GridSpan resolveGridPositionAgainstOppositePosition(const Render Style& gridContainerStyle, int oppositeLine, const GridPosition& position, GridPositionSide side, unsigned autoRepeatTracksCount)299 static GridSpan resolveGridPositionAgainstOppositePosition(const RenderGrid& gridContainer, int oppositeLine, const GridPosition& position, GridPositionSide side) 266 300 { 267 301 if (position.isAuto()) { … … 276 310 if (!position.namedGridLine().isNull()) { 277 311 // span 2 'c' -> we need to find the appropriate grid line before / after our opposite position. 278 return resolveNamedGridLinePositionAgainstOppositePosition(gridContainer Style, oppositeLine, position, side, autoRepeatTracksCount);312 return resolveNamedGridLinePositionAgainstOppositePosition(gridContainer, oppositeLine, position, side); 279 313 } 280 314 … … 316 350 } 317 351 318 static int resolveGridPositionFromStyle(const Render Style& gridContainerStyle, const GridPosition& position, GridPositionSide side, unsigned autoRepeatTracksCount)352 static int resolveGridPositionFromStyle(const RenderGrid& gridContainer, const GridPosition& position, GridPositionSide side) 319 353 { 320 354 switch (position.type()) { … … 323 357 324 358 if (!position.namedGridLine().isNull()) 325 return resolveNamedGridLinePositionFromStyle(gridContainer Style, position, side, autoRepeatTracksCount);359 return resolveNamedGridLinePositionFromStyle(gridContainer, position, side); 326 360 327 361 // Handle <integer> explicit position. … … 330 364 331 365 unsigned resolvedPosition = std::abs(position.integerPosition()) - 1; 332 const unsigned endOfTrack = explicitGridSizeForSide(gridContainer Style, side, autoRepeatTracksCount);366 const unsigned endOfTrack = explicitGridSizeForSide(gridContainer, side); 333 367 334 368 return endOfTrack - resolvedPosition; … … 342 376 ASSERT(!position.namedGridLine().isNull()); 343 377 344 unsigned lastLine = explicitGridSizeForSide(gridContainer Style, side, autoRepeatTracksCount);345 NamedLineCollection implicitLines(gridContainer Style, implicitNamedGridLineForSide(namedGridLine, side), directionFromSide(side), lastLine, autoRepeatTracksCount);378 unsigned lastLine = explicitGridSizeForSide(gridContainer, side); 379 NamedLineCollection implicitLines(gridContainer.style(), implicitNamedGridLineForSide(namedGridLine, side), directionFromSide(side), lastLine, gridContainer.autoRepeatCountForDirection(directionFromSide(side))); 346 380 if (implicitLines.hasNamedLines()) 347 381 return implicitLines.firstPosition(); … … 349 383 // Otherwise, if there is a named line with the specified name, contributes the first such line to the grid 350 384 // item's placement. 351 NamedLineCollection explicitLines(gridContainer Style, namedGridLine, directionFromSide(side), lastLine, autoRepeatTracksCount);385 NamedLineCollection explicitLines(gridContainer.style(), namedGridLine, directionFromSide(side), lastLine, gridContainer.autoRepeatCountForDirection(directionFromSide(side))); 352 386 if (explicitLines.hasNamedLines()) 353 387 return explicitLines.firstPosition(); … … 366 400 } 367 401 368 GridSpan GridPositionsResolver::resolveGridPositionsFromStyle(const RenderStyle& gridContainerStyle, const RenderBox& gridItem, GridTrackSizingDirection direction, unsigned autoRepeatTracksCount) 369 { 402 GridSpan GridPositionsResolver::resolveGridPositionsFromStyle(const RenderBox& gridItem, GridTrackSizingDirection direction) 403 { 404 auto* gridContainer = downcast<RenderGrid>(gridItem.containingBlock()); 405 ASSERT(gridContainer); 406 370 407 GridPosition initialPosition, finalPosition; 371 408 adjustGridPositionsFromStyle(gridItem, direction, initialPosition, finalPosition); … … 380 417 if (initialPosition.shouldBeResolvedAgainstOppositePosition()) { 381 418 // Infer the position from the final position ('auto / 1' or 'span 2 / 3' case). 382 auto endLine = resolveGridPositionFromStyle( gridContainerStyle, finalPosition, finalSide, autoRepeatTracksCount);383 return resolveGridPositionAgainstOppositePosition( gridContainerStyle, endLine, initialPosition, initialSide, autoRepeatTracksCount);419 auto endLine = resolveGridPositionFromStyle(*gridContainer, finalPosition, finalSide); 420 return resolveGridPositionAgainstOppositePosition(*gridContainer, endLine, initialPosition, initialSide); 384 421 } 385 422 386 423 if (finalPosition.shouldBeResolvedAgainstOppositePosition()) { 387 424 // Infer our position from the initial position ('1 / auto' or '3 / span 2' case). 388 auto startLine = resolveGridPositionFromStyle( gridContainerStyle, initialPosition, initialSide, autoRepeatTracksCount);389 return resolveGridPositionAgainstOppositePosition( gridContainerStyle, startLine, finalPosition, finalSide, autoRepeatTracksCount);390 } 391 392 int startLine = resolveGridPositionFromStyle( gridContainerStyle, initialPosition, initialSide, autoRepeatTracksCount);393 int endLine = resolveGridPositionFromStyle( gridContainerStyle, finalPosition, finalSide, autoRepeatTracksCount);425 auto startLine = resolveGridPositionFromStyle(*gridContainer, initialPosition, initialSide); 426 return resolveGridPositionAgainstOppositePosition(*gridContainer, startLine, finalPosition, finalSide); 427 } 428 429 int startLine = resolveGridPositionFromStyle(*gridContainer, initialPosition, initialSide); 430 int endLine = resolveGridPositionFromStyle(*gridContainer, finalPosition, finalSide); 394 431 395 432 if (startLine > endLine) -
trunk/Source/WebCore/rendering/style/GridPositionsResolver.h
r262262 r289986 37 37 class GridSpan; 38 38 class RenderBox; 39 class RenderGrid; 39 40 class RenderStyle; 40 41 … … 74 75 static GridPositionSide finalPositionSide(GridTrackSizingDirection); 75 76 static unsigned spanSizeForAutoPlacedItem(const RenderBox&, GridTrackSizingDirection); 76 static GridSpan resolveGridPositionsFromStyle(const Render Style&, const RenderBox&, GridTrackSizingDirection, unsigned autoRepeatTracksCount);77 static unsigned explicitGridColumnCount(const Render Style&, unsigned autoRepeatColumnsCount);78 static unsigned explicitGridRowCount(const Render Style&, unsigned autoRepeatRowsCount);77 static GridSpan resolveGridPositionsFromStyle(const RenderBox&, GridTrackSizingDirection); 78 static unsigned explicitGridColumnCount(const RenderGrid&); 79 static unsigned explicitGridRowCount(const RenderGrid&); 79 80 }; 80 81
Note: See TracChangeset
for help on using the changeset viewer.