Changeset 197850 in webkit
- Timestamp:
- Mar 9, 2016 2:15:23 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r197847 r197850 1 2016-03-09 Manuel Rego Casasnovas <rego@igalia.com> 2 3 [css-grid] Initial support for implicit grid before explicit grid 4 https://bugs.webkit.org/show_bug.cgi?id=155014 5 6 Reviewed by Darin Adler. 7 8 Updated results in current tests and added specific test for this. 9 10 * fast/css-grid-layout/grid-auto-flow-resolution.html: 11 * fast/css-grid-layout/grid-item-negative-position-resolution.html: 12 * fast/css-grid-layout/grid-item-spanning-resolution.html: 13 * fast/css-grid-layout/implicit-tracks-before-explicit-expected.txt: Added. 14 * fast/css-grid-layout/implicit-tracks-before-explicit.html: Added. 15 1 16 2016-03-09 Myles C. Maxfield <mmaxfield@apple.com> 2 17 -
trunk/LayoutTests/fast/css-grid-layout/grid-auto-flow-resolution.html
r197503 r197850 24 24 } 25 25 26 /* These 2 classes forces the grid to be sized after the grid-{column|row}-end, thus end up in the27 first row / columns. */28 26 .negativeOverflowingRowFirstColumn { 29 27 -webkit-grid-row: auto / -10; … … 154 152 <div class="unconstrainedContainer"> 155 153 <div class="grid bigGrid gridAutoFlowColumnSparse justifyContentStart"> 156 <div class="sizedToGridArea negativeOverflowingRowFirstColumn" data-offset-x=" 0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>157 <div class="sizedToGridArea secondRowNegativeOverflowingColumn" data-offset-x="0" data-offset-y=" 50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>154 <div class="sizedToGridArea negativeOverflowingRowFirstColumn" data-offset-x="170" data-offset-y="0" data-expected-width="50" data-expected-height="30">XXXXX XXXXX XXXXX</div> 155 <div class="sizedToGridArea secondRowNegativeOverflowingColumn" data-offset-x="0" data-offset-y="80" data-expected-width="170" data-expected-height="100">XXXXX XXXXX XXXXX</div> 158 156 </div> 159 157 </div> … … 161 159 <div class="unconstrainedContainer"> 162 160 <div class="grid bigGrid gridAutoFlowRowSparse justifyContentStart"> 163 <div class="sizedToGridArea negativeOverflowingRowFirstColumn" data-offset-x=" 0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XXXXX XXXXX XXXXX</div>164 <div class="sizedToGridArea secondRowNegativeOverflowingColumn" data-offset-x="0" data-offset-y=" 50" data-expected-width="50" data-expected-height="100">XXXXX XXXXX XXXXX</div>161 <div class="sizedToGridArea negativeOverflowingRowFirstColumn" data-offset-x="170" data-offset-y="0" data-expected-width="50" data-expected-height="30">XXXXX XXXXX XXXXX</div> 162 <div class="sizedToGridArea secondRowNegativeOverflowingColumn" data-offset-x="0" data-offset-y="80" data-expected-width="170" data-expected-height="100">XXXXX XXXXX XXXXX</div> 165 163 </div> 166 164 </div> -
trunk/LayoutTests/fast/css-grid-layout/grid-item-negative-position-resolution.html
r185147 r197850 159 159 160 160 <div style="position: relative"> 161 <div class="grid" data-expected-width="150" data-expected-height=" 150">162 <div class="sizedToGridArea negativeEndPositionStartSpanInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height=" 150"></div>161 <div class="grid" data-expected-width="150" data-expected-height="750"> 162 <div class="sizedToGridArea negativeEndPositionStartSpanInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="750"></div> 163 163 </div> 164 164 </div> … … 171 171 172 172 <div style="position: relative"> 173 <div class="grid" data-expected-width="150" data-expected-height=" 150">174 <div class="sizedToGridArea negativeNamedGridLineEndPositionStartSpanInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height=" 150"></div>173 <div class="grid" data-expected-width="150" data-expected-height="750"> 174 <div class="sizedToGridArea negativeNamedGridLineEndPositionStartSpanInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="750"></div> 175 175 </div> 176 176 </div> … … 183 183 184 184 <div style="position: relative"> 185 <div class="grid" data-expected-width=" 150" data-expected-height="150">186 <div class="sizedToGridArea negativeEndPositionStartNegativeInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width=" 50" data-expected-height="50"></div>185 <div class="grid" data-expected-width="550" data-expected-height="150"> 186 <div class="sizedToGridArea negativeEndPositionStartNegativeInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width="450" data-expected-height="50"></div> 187 187 </div> 188 188 </div> … … 195 195 196 196 <div style="position: relative"> 197 <div class="grid" data-expected-width=" 150" data-expected-height="150">198 <div class="sizedToGridArea namedGridLineEndPositionStartNegativeInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width=" 50" data-expected-height="50"></div>197 <div class="grid" data-expected-width="550" data-expected-height="150"> 198 <div class="sizedToGridArea namedGridLineEndPositionStartNegativeInRowDirection" data-offset-x="0" data-offset-y="0" data-expected-width="450" data-expected-height="50"></div> 199 199 </div> 200 200 </div> -
trunk/LayoutTests/fast/css-grid-layout/grid-item-spanning-resolution.html
r170531 r197850 8 8 width: 400px; 9 9 height: 300px; 10 -webkit-grid-auto-columns: 200px; 11 -webkit-grid-auto-rows: 250px; 10 12 } 11 13 … … 125 127 <div style="position: relative"> 126 128 <div class="grid" data-expected-width="400" data-expected-height="300"> 127 <div class="sizedToGridArea negativeOverflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height=" 90"></div>128 </div> 129 </div> 130 131 <div style="position: relative"> 132 <div class="grid" data-expected-width="400" data-expected-height="300"> 133 <div class="sizedToGridArea overflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height=" 300"></div>134 </div> 135 </div> 136 137 <div style="position: relative"> 138 <div class="grid" data-expected-width="400" data-expected-height="300"> 139 <div class="sizedToGridArea firstRowNegativeOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width=" 160" data-expected-height="90"></div>140 </div> 141 </div> 142 143 <div style="position: relative"> 144 <div class="grid" data-expected-width="400" data-expected-height="300"> 145 <div class="sizedToGridArea firstRowOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width=" 400" data-expected-height="90"></div>129 <div class="sizedToGridArea negativeOverflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="500"></div> 130 </div> 131 </div> 132 133 <div style="position: relative"> 134 <div class="grid" data-expected-width="400" data-expected-height="300"> 135 <div class="sizedToGridArea overflowRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="160" data-expected-height="800"></div> 136 </div> 137 </div> 138 139 <div style="position: relative"> 140 <div class="grid" data-expected-width="400" data-expected-height="300"> 141 <div class="sizedToGridArea firstRowNegativeOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="90"></div> 142 </div> 143 </div> 144 145 <div style="position: relative"> 146 <div class="grid" data-expected-width="400" data-expected-height="300"> 147 <div class="sizedToGridArea firstRowOverflowColumn" data-offset-x="0" data-offset-y="0" data-expected-width="800" data-expected-height="90"></div> 146 148 </div> 147 149 </div> … … 155 157 <div style="position: relative"> 156 158 <div class="grid" data-expected-width="400" data-expected-height="300"> 157 <div class="sizedToGridArea autoSecondRowAutoFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width=" 160" data-expected-height="90"></div>159 <div class="sizedToGridArea autoSecondRowAutoFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="90"></div> 158 160 </div> 159 161 </div> … … 189 191 <div style="position: relative"> 190 192 <div class="grid" id="bigGrid" data-expected-width="200" data-expected-height="100"> 191 <div class="sizedToGridArea underflowSpanning" data-offset-x="0" data-offset-y="0" data-expected-width=" 100" data-expected-height="75"></div>193 <div class="sizedToGridArea underflowSpanning" data-offset-x="0" data-offset-y="0" data-expected-width="300" data-expected-height="1325"></div> 192 194 </div> 193 195 -
trunk/Source/WebCore/ChangeLog
r197847 r197850 1 2016-03-09 Manuel Rego Casasnovas <rego@igalia.com> 2 3 [css-grid] Initial support for implicit grid before explicit grid 4 https://bugs.webkit.org/show_bug.cgi?id=155014 5 6 Reviewed by Darin Adler. 7 8 Change GridSpan to store int instead of unsigned. This allows us to 9 resolve positions before the explicit grid with negative values. 10 11 This patch adds a new type of GridSpan called "Untranslated". 12 This type is only used in populateExplicitGridAndOrderIterator(). 13 Where we store the smallest negative position in both axis. 14 15 Then the GridSpans are translated into positive values, using the offset 16 calculated before. This is done in placeItemsOnGrid() and from that 17 moment the rest of the code uses "Definite" GridSpans, which returns 18 only positive positions (unsigned instead of int). 19 This allows us to don't have to modify the rest of the code, as it keeps 20 using GridSpans as before. 21 22 Let's use an example to explain how it works. Imagine that we've a 2 23 columns grid and 2 items placed like: 24 * Item A: grid-column: -5; 25 * Item B: grid-column: 1; 26 27 Initially we'll use "Unstranslated" GridSpans with the following values: 28 * Item A: GridSpan(-2, -1) 29 * Item B: GridSpan(0, 1) 30 31 Then we'll translate them using the smallest position as offset (-2) 32 so we've "Definite" GridSpans: 33 * Item A: GridSpan(0, 1) 34 * Item B: GridSpan(2, 3) 35 36 Test: fast/css-grid-layout/implicit-tracks-before-explicit.html 37 38 * css/CSSParser.cpp: 39 (WebCore::CSSParser::parseGridTemplateAreasRow): 40 * rendering/RenderGrid.cpp: 41 (WebCore::RenderGrid::GridIterator::nextEmptyGridArea): 42 (WebCore::RenderGrid::computeUsedBreadthOfGridTracks): 43 (WebCore::RenderGrid::gridTrackSize): 44 (WebCore::RenderGrid::insertItemIntoGrid): 45 (WebCore::RenderGrid::placeItemsOnGrid): 46 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): 47 (WebCore::RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid): 48 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): 49 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): 50 (WebCore::RenderGrid::offsetAndBreadthForPositionedChild): 51 (WebCore::RenderGrid::placeAutoMajorAxisItemsOnGrid): Deleted. 52 (WebCore::RenderGrid::layoutPositionedObject): Deleted. 53 * rendering/RenderGrid.h: 54 * rendering/style/GridCoordinate.h: 55 (WebCore::GridSpan::untranslatedDefiniteGridSpan): 56 (WebCore::GridSpan::translatedDefiniteGridSpan): 57 (WebCore::GridSpan::integerSpan): 58 (WebCore::GridSpan::untranslatedResolvedInitialPosition): 59 (WebCore::GridSpan::untranslatedResolvedFinalPosition): 60 (WebCore::GridSpan::resolvedInitialPosition): 61 (WebCore::GridSpan::resolvedFinalPosition): 62 (WebCore::GridSpan::begin): 63 (WebCore::GridSpan::end): 64 (WebCore::GridSpan::isTranslatedDefinite): 65 (WebCore::GridSpan::isIndefinite): 66 (WebCore::GridSpan::translate): 67 (WebCore::GridSpan::GridSpan): 68 (WebCore::GridSpan::operator==): Deleted. 69 (WebCore::GridSpan::GridSpanIterator::GridSpanIterator): Deleted. 70 (WebCore::GridSpan::GridSpanIterator::operator unsigned&): Deleted. 71 * rendering/style/GridResolvedPosition.cpp: 72 (WebCore::resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition): 73 (WebCore::resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition): 74 (WebCore::resolveNamedGridLinePositionAgainstOppositePosition): 75 (WebCore::resolveGridPositionAgainstOppositePosition): 76 (WebCore::resolveGridPositionFromStyle): 77 (WebCore::GridResolvedPosition::resolveGridPositionsFromStyle): 78 (WebCore::GridResolvedPosition::spanSizeForAutoPlacedItem): Deleted. 79 1 80 2016-03-09 Myles C. Maxfield <mmaxfield@apple.com> 2 81 -
trunk/Source/WebCore/css/CSSParser.cpp
r197617 r197850 6250 6250 auto gridAreaIterator = gridAreaMap.find(gridAreaName); 6251 6251 if (gridAreaIterator == gridAreaMap.end()) 6252 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan:: definiteGridSpan(rowCount, rowCount + 1), GridSpan::definiteGridSpan(currentColumn, lookAheadColumn)));6252 gridAreaMap.add(gridAreaName, GridCoordinate(GridSpan::translatedDefiniteGridSpan(rowCount, rowCount + 1), GridSpan::translatedDefiniteGridSpan(currentColumn, lookAheadColumn))); 6253 6253 else { 6254 6254 GridCoordinate& gridCoordinate = gridAreaIterator->value; … … 6267 6267 return false; 6268 6268 6269 gridCoordinate.rows = GridSpan:: definiteGridSpan(gridCoordinate.rows.resolvedInitialPosition(), gridCoordinate.rows.resolvedFinalPosition() + 1);6269 gridCoordinate.rows = GridSpan::translatedDefiniteGridSpan(gridCoordinate.rows.resolvedInitialPosition(), gridCoordinate.rows.resolvedFinalPosition() + 1); 6270 6270 } 6271 6271 currentColumn = lookAheadColumn - 1; -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r197509 r197850 35 35 #include "RenderLayer.h" 36 36 #include "RenderView.h" 37 #include <cstdlib> 37 38 38 39 namespace WebCore { … … 191 192 for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) { 192 193 if (isEmptyAreaEnough(rowSpan, columnSpan)) { 193 std::unique_ptr<GridCoordinate> result = std::make_unique<GridCoordinate>(GridSpan:: definiteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::definiteGridSpan(m_columnIndex, m_columnIndex + columnSpan));194 std::unique_ptr<GridCoordinate> result = std::make_unique<GridCoordinate>(GridSpan::translatedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::translatedDefiniteGridSpan(m_columnIndex, m_columnIndex + columnSpan)); 194 195 // Advance the iterator to avoid an infinite loop where we would return the same grid area over and over. 195 196 ++varyingTrackIndex; … … 567 568 double flexFraction = 0; 568 569 if (hasDefiniteFreeSpace) 569 flexFraction = findFlexFactorUnitSize(tracks, GridSpan:: definiteGridSpan(0, tracks.size()), direction, initialFreeSpace.value());570 flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()), direction, initialFreeSpace.value()); 570 571 else { 571 572 for (const auto& trackIndex : flexibleSizedTracksIndex) … … 688 689 bool isForColumns = (direction == ForColumns); 689 690 auto& trackStyles = isForColumns ? style().gridColumns() : style().gridRows(); 690 auto& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style().gridAutoColumns() : style().gridAutoRows()) : trackStyles[i]; 691 692 auto& autoTrackSize = isForColumns ? style().gridAutoColumns() : style().gridAutoRows(); 693 int translatedIndex = i + (isForColumns ? m_smallestColumnStart : m_smallestRowStart); 694 auto& trackSize = (translatedIndex < 0 || translatedIndex >= static_cast<int>(trackStyles.size())) ? autoTrackSize : trackStyles[translatedIndex]; 691 695 692 696 GridLength minTrackBreadth = trackSize.minTrackBreadth(); … … 1138 1142 void RenderGrid::insertItemIntoGrid(RenderBox& child, const GridCoordinate& coordinate) 1139 1143 { 1140 ASSERT(coordinate.rows.is Definite() && coordinate.columns.isDefinite());1144 ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTranslatedDefinite()); 1141 1145 ensureGridSize(coordinate.rows.resolvedFinalPosition(), coordinate.columns.resolvedFinalPosition()); 1142 1146 … … 1161 1165 1162 1166 GridCoordinate coordinate = cachedGridCoordinate(*child); 1163 1164 if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) { 1167 if (!coordinate.rows.isIndefinite()) 1168 coordinate.rows.translate(std::abs(m_smallestRowStart)); 1169 if (!coordinate.columns.isIndefinite()) 1170 coordinate.columns.translate(std::abs(m_smallestColumnStart)); 1171 m_gridItemCoordinate.set(child, coordinate); 1172 1173 if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite()) { 1165 1174 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1166 if ((majorAxisDirectionIsForColumns && !coordinate.columns.isDefinite())1167 || (!majorAxisDirectionIsForColumns && !coordinate.rows.isDefinite()))1175 if ((majorAxisDirectionIsForColumns && coordinate.columns.isIndefinite()) 1176 || (!majorAxisDirectionIsForColumns && coordinate.rows.isIndefinite())) 1168 1177 autoMajorAxisAutoGridItems.append(child); 1169 1178 else … … 1186 1195 1187 1196 GridCoordinate coordinate = cachedGridCoordinate(*child); 1188 ASSERT(coordinate.rows.is Definite() && coordinate.columns.isDefinite());1197 ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTranslatedDefinite()); 1189 1198 } 1190 1199 #endif … … 1194 1203 { 1195 1204 OrderIteratorPopulator populator(m_orderIterator); 1205 m_smallestRowStart = m_smallestColumnStart = 0; 1196 1206 unsigned maximumRowIndex = std::max<unsigned>(1, GridResolvedPosition::explicitGridRowCount(style())); 1197 1207 unsigned maximumColumnIndex = std::max<unsigned>(1, GridResolvedPosition::explicitGridColumnCount(style())); … … 1204 1214 1205 1215 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForRows); 1206 if (rowPositions.isDefinite()) { 1207 maximumRowIndex = std::max(maximumRowIndex, rowPositions.resolvedFinalPosition()); 1216 if (!rowPositions.isIndefinite()) { 1217 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untranslatedResolvedInitialPosition()); 1218 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untranslatedResolvedFinalPosition()); 1208 1219 } else { 1209 1220 // Grow the grid for items with a definite row span, getting the largest such span. … … 1213 1224 1214 1225 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), *child, ForColumns); 1215 if (columnPositions.isDefinite()) { 1216 maximumColumnIndex = std::max(maximumColumnIndex, columnPositions.resolvedFinalPosition()); 1226 if (!columnPositions.isIndefinite()) { 1227 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositions.untranslatedResolvedInitialPosition()); 1228 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositions.untranslatedResolvedFinalPosition()); 1217 1229 } else { 1218 1230 // Grow the grid for items with a definite column span, getting the largest such span. … … 1224 1236 } 1225 1237 1226 m_grid.grow(maximumRowIndex );1238 m_grid.grow(maximumRowIndex + std::abs(m_smallestRowStart)); 1227 1239 for (auto& column : m_grid) 1228 column.grow(maximumColumnIndex );1240 column.grow(maximumColumnIndex + std::abs(m_smallestColumnStart)); 1229 1241 } 1230 1242 … … 1234 1246 const unsigned endOfCrossDirection = crossDirection == ForColumns ? gridColumnCount() : gridRowCount(); 1235 1247 unsigned crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(style(), gridItem, crossDirection); 1236 GridSpan crossDirectionPositions = GridSpan:: definiteGridSpan(endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize);1248 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize); 1237 1249 return std::make_unique<GridCoordinate>(specifiedDirection == ForColumns ? crossDirectionPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPositions : crossDirectionPositions); 1238 1250 } … … 1250 1262 for (auto& autoGridItem : autoGridItems) { 1251 1263 GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacementMajorAxisDirection()); 1252 ASSERT(majorAxisPositions.is Definite());1253 ASSERT( !cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isDefinite());1264 ASSERT(majorAxisPositions.isTranslatedDefinite()); 1265 ASSERT(cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isIndefinite()); 1254 1266 unsigned minorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(style(), *autoGridItem, autoPlacementMinorAxisDirection()); 1255 1267 unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition(); … … 1285 1297 void RenderGrid::placeAutoMajorAxisItemOnGrid(RenderBox& gridItem, AutoPlacementCursor& autoPlacementCursor) 1286 1298 { 1287 ASSERT( !cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefinite());1299 ASSERT(cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isIndefinite()); 1288 1300 unsigned majorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(style(), gridItem, autoPlacementMajorAxisDirection()); 1289 1301 … … 1294 1306 std::unique_ptr<GridCoordinate> emptyGridArea; 1295 1307 GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxisDirection()); 1296 if (minorAxisPositions.is Definite()) {1308 if (minorAxisPositions.isTranslatedDefinite()) { 1297 1309 // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor. 1298 1310 if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacementCursor) … … 1330 1342 1331 1343 if (!emptyGridArea) 1332 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), GridSpan:: definiteGridSpan(0, minorAxisSpanSize));1344 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize)); 1333 1345 } 1334 1346 … … 1475 1487 1476 1488 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), child, direction); 1477 if ( !positions.isDefinite()) {1489 if (positions.isIndefinite()) { 1478 1490 offset = LayoutUnit(); 1479 1491 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight(); 1480 1492 return; 1481 1493 } 1494 positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smallestRowStart); 1482 1495 1483 1496 GridPosition startPosition = (direction == ForColumns) ? child.style().gridItemColumnStart() : child.style().gridItemRowStart(); -
trunk/Source/WebCore/rendering/RenderGrid.h
r197563 r197850 191 191 Optional<LayoutUnit> m_minContentHeight; 192 192 Optional<LayoutUnit> m_maxContentHeight; 193 194 int m_smallestColumnStart; 195 int m_smallestRowStart; 193 196 }; 194 197 -
trunk/Source/WebCore/rendering/style/GridCoordinate.h
r197400 r197850 42 42 43 43 // Recommended maximum size for both explicit and implicit grids. 44 const unsignedkGridMaxTracks = 1000000;44 const int kGridMaxTracks = 1000000; 45 45 46 46 // A span in a single direction (either rows or columns). Note that |resolvedInitialPosition| … … 50 50 public: 51 51 52 static GridSpan definiteGridSpan(unsigned resolvedInitialPosition, unsigned resolvedFinalPosition) 53 { 54 return GridSpan(resolvedInitialPosition, resolvedFinalPosition, Definite); 52 static GridSpan untranslatedDefiniteGridSpan(int resolvedInitialPosition, int resolvedFinalPosition) 53 { 54 return GridSpan(resolvedInitialPosition, resolvedFinalPosition, UntranslatedDefinite); 55 } 56 57 static GridSpan translatedDefiniteGridSpan(unsigned resolvedInitialPosition, unsigned resolvedFinalPosition) 58 { 59 return GridSpan(resolvedInitialPosition, resolvedFinalPosition, TranslatedDefinite); 55 60 } 56 61 … … 67 72 unsigned integerSpan() const 68 73 { 69 ASSERT(is Definite());74 ASSERT(isTranslatedDefinite()); 70 75 return m_resolvedFinalPosition - m_resolvedInitialPosition; 71 76 } 72 77 78 int untranslatedResolvedInitialPosition() const 79 { 80 ASSERT(m_type == UntranslatedDefinite); 81 return m_resolvedInitialPosition; 82 } 83 84 int untranslatedResolvedFinalPosition() const 85 { 86 ASSERT(m_type == UntranslatedDefinite); 87 return m_resolvedFinalPosition; 88 } 89 73 90 unsigned resolvedInitialPosition() const 74 91 { 75 ASSERT(isDefinite()); 92 ASSERT(isTranslatedDefinite()); 93 ASSERT(m_resolvedFinalPosition >= 0); 76 94 return m_resolvedInitialPosition; 77 95 } … … 79 97 unsigned resolvedFinalPosition() const 80 98 { 81 ASSERT(is Definite());82 ASSERT(m_resolvedFinalPosition );99 ASSERT(isTranslatedDefinite()); 100 ASSERT(m_resolvedFinalPosition > 0); 83 101 return m_resolvedFinalPosition; 84 102 } … … 98 116 GridSpanIterator begin() const 99 117 { 100 ASSERT(is Definite());118 ASSERT(isTranslatedDefinite()); 101 119 return m_resolvedInitialPosition; 102 120 } … … 104 122 GridSpanIterator end() const 105 123 { 106 ASSERT(is Definite());124 ASSERT(isTranslatedDefinite()); 107 125 return m_resolvedFinalPosition; 108 126 } 109 127 110 bool isDefinite() const 111 { 112 return m_type == Definite; 128 bool isTranslatedDefinite() const 129 { 130 return m_type == TranslatedDefinite; 131 } 132 133 bool isIndefinite() const 134 { 135 return m_type == Indefinite; 136 } 137 138 void translate(unsigned offset) 139 { 140 ASSERT(m_type == UntranslatedDefinite); 141 142 m_type = TranslatedDefinite; 143 m_resolvedInitialPosition += offset; 144 m_resolvedFinalPosition += offset; 145 146 ASSERT(m_resolvedInitialPosition >= 0); 147 ASSERT(m_resolvedFinalPosition > 0); 113 148 } 114 149 115 150 private: 116 151 117 enum GridSpanType {Definite, Indefinite}; 118 119 GridSpan(unsigned resolvedInitialPosition, unsigned resolvedFinalPosition, GridSpanType type) 120 : m_resolvedInitialPosition(std::min(resolvedInitialPosition, kGridMaxTracks - 1)) 121 , m_resolvedFinalPosition(std::min(resolvedFinalPosition, kGridMaxTracks)) 122 , m_type(type) 123 { 152 enum GridSpanType {UntranslatedDefinite, TranslatedDefinite, Indefinite}; 153 154 GridSpan(int resolvedInitialPosition, int resolvedFinalPosition, GridSpanType type) 155 : m_type(type) 156 { 157 #if ENABLE(ASSERT) 124 158 ASSERT(resolvedInitialPosition < resolvedFinalPosition); 125 } 126 127 unsigned m_resolvedInitialPosition; 128 unsigned m_resolvedFinalPosition; 159 if (type == TranslatedDefinite) { 160 ASSERT(resolvedInitialPosition >= 0); 161 ASSERT(resolvedFinalPosition > 0); 162 } 163 #endif 164 165 m_resolvedInitialPosition = std::max(-kGridMaxTracks, std::min(resolvedInitialPosition, kGridMaxTracks - 1)); 166 m_resolvedFinalPosition = std::max(-kGridMaxTracks + 1, std::min(resolvedFinalPosition, kGridMaxTracks)); 167 } 168 169 int m_resolvedInitialPosition; 170 int m_resolvedFinalPosition; 129 171 GridSpanType m_type; 130 172 -
trunk/Source/WebCore/rendering/style/GridResolvedPosition.cpp
r197501 r197850 36 36 #include "GridCoordinate.h" 37 37 #include "RenderBox.h" 38 #include <cstdlib> 38 39 39 40 namespace WebCore { … … 141 142 { 142 143 if (!resolvedOppositePosition) 143 return GridSpan:: definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1);144 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 144 145 145 146 unsigned firstLineBeforePositionIndex = 0; … … 153 154 if (resolvedGridLinePosition >= resolvedOppositePosition) 154 155 resolvedGridLinePosition = resolvedOppositePosition - 1; 155 return GridSpan:: definiteGridSpan(std::min(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition);156 return GridSpan::untranslatedDefiniteGridSpan(std::min(resolvedGridLinePosition, resolvedOppositePosition), resolvedOppositePosition); 156 157 } 157 158 … … 168 169 if (resolvedGridLinePosition <= resolvedOppositePosition) 169 170 resolvedGridLinePosition = resolvedOppositePosition + 1; 170 return GridSpan:: definiteGridSpan(resolvedOppositePosition, resolvedGridLinePosition);171 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition, resolvedGridLinePosition); 171 172 } 172 173 … … 184 185 // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html. 185 186 if (it == gridLinesNames.end()) { 186 if (isStartSide(side) && resolvedOppositePosition)187 return GridSpan:: definiteGridSpan(resolvedOppositePosition - 1, resolvedOppositePosition);188 return GridSpan:: definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1);187 if (isStartSide(side)) 188 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition - 1, resolvedOppositePosition); 189 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 189 190 } 190 191 … … 198 199 { 199 200 if (position.isAuto()) { 200 if (isStartSide(side) && resolvedOppositePosition)201 return GridSpan:: definiteGridSpan(resolvedOppositePosition - 1, resolvedOppositePosition);202 return GridSpan:: definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1);201 if (isStartSide(side)) 202 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition - 1, resolvedOppositePosition); 203 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 203 204 } 204 205 … … 214 215 // That's why the CSS span value is one more than the offset we apply. 215 216 unsigned positionOffset = position.spanPosition(); 216 if (isStartSide(side)) { 217 if (!resolvedOppositePosition) 218 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + 1); 219 220 unsigned initialResolvedPosition = std::max<int>(0, resolvedOppositePosition - positionOffset); 221 return GridSpan::definiteGridSpan(initialResolvedPosition, resolvedOppositePosition); 222 } 223 224 return GridSpan::definiteGridSpan(resolvedOppositePosition, resolvedOppositePosition + positionOffset); 217 if (isStartSide(side)) 218 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition - positionOffset, resolvedOppositePosition); 219 220 return GridSpan::untranslatedDefiniteGridSpan(resolvedOppositePosition, resolvedOppositePosition + positionOffset); 225 221 } 226 222 … … 243 239 } 244 240 245 static unsignedresolveGridPositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side)241 static int resolveGridPositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side) 246 242 { 247 243 switch (position.type()) { … … 256 252 return position.integerPosition() - 1; 257 253 258 unsigned resolvedPosition = abs(position.integerPosition()) - 1;254 unsigned resolvedPosition = std::abs(position.integerPosition()) - 1; 259 255 const unsigned endOfTrack = explicitGridSizeForSide(gridContainerStyle, side); 260 261 // Per http://lists.w3.org/Archives/Public/www-style/2013Mar/0589.html, we clamp negative value to the first line.262 if (endOfTrack < resolvedPosition)263 return 0;264 256 265 257 return endOfTrack - resolvedPosition; … … 324 316 } 325 317 326 unsignedresolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialSide);327 unsignedresolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalSide);318 int resolvedInitialPosition = resolveGridPositionFromStyle(gridContainerStyle, initialPosition, initialSide); 319 int resolvedFinalPosition = resolveGridPositionFromStyle(gridContainerStyle, finalPosition, finalSide); 328 320 329 321 if (resolvedInitialPosition > resolvedFinalPosition) … … 332 324 resolvedFinalPosition = resolvedInitialPosition + 1; 333 325 334 return GridSpan:: definiteGridSpan(resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition));326 return GridSpan::untranslatedDefiniteGridSpan(resolvedInitialPosition, std::max(resolvedInitialPosition, resolvedFinalPosition)); 335 327 } 336 328
Note: See TracChangeset
for help on using the changeset viewer.