Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(695)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 1529083006: [css-grid] Initial support for implicit grid before explicit grid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Try to fix Windows build Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 649
650 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons t 650 bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) cons t
651 { 651 {
652 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi calWidth(); 652 return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogi calWidth();
653 } 653 }
654 654
655 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t i) const 655 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t i) const
656 { 656 {
657 bool isForColumns = direction == ForColumns; 657 bool isForColumns = direction == ForColumns;
658 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl ateColumns() : style()->gridTemplateRows(); 658 const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTempl ateColumns() : style()->gridTemplateRows();
659 const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i]; 659 const GridTrackSize& autoTrackSize = isForColumns ? style()->gridAutoColumns () : style()->gridAutoRows();
660 int translatedIndex = i + (isForColumns ? m_smallestColumnStart : m_smallest RowStart);
661 const GridTrackSize& trackSize = (translatedIndex < 0 || translatedIndex >= static_cast<int>(trackStyles.size())) ? autoTrackSize : trackStyles[translatedIn dex];
660 662
661 GridLength minTrackBreadth = trackSize.minTrackBreadth(); 663 GridLength minTrackBreadth = trackSize.minTrackBreadth();
662 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); 664 GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
663 665
664 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto> 666 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto>
665 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { 667 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) {
666 if (!hasDefiniteLogicalSize(direction)) { 668 if (!hasDefiniteLogicalSize(direction)) {
667 if (minTrackBreadth.hasPercentage()) 669 if (minTrackBreadth.hasPercentage())
668 minTrackBreadth = Length(Auto); 670 minTrackBreadth = Length(Auto);
669 if (maxTrackBreadth.hasPercentage()) 671 if (maxTrackBreadth.hasPercentage())
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 // We clear the dirty bit here as the grid sizes have been updated. 1127 // We clear the dirty bit here as the grid sizes have been updated.
1126 m_gridIsDirty = false; 1128 m_gridIsDirty = false;
1127 1129
1128 Vector<LayoutBox*> autoMajorAxisAutoGridItems; 1130 Vector<LayoutBox*> autoMajorAxisAutoGridItems;
1129 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; 1131 Vector<LayoutBox*> specifiedMajorAxisAutoGridItems;
1130 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 1132 for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
1131 if (child->isOutOfFlowPositioned()) 1133 if (child->isOutOfFlowPositioned())
1132 continue; 1134 continue;
1133 1135
1134 GridCoordinate coordinate = cachedGridCoordinate(*child); 1136 GridCoordinate coordinate = cachedGridCoordinate(*child);
1135 if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) { 1137 if (!coordinate.rows.isIndefinite())
1138 coordinate.rows.translate(abs(m_smallestRowStart));
1139 if (!coordinate.columns.isIndefinite())
1140 coordinate.columns.translate(abs(m_smallestColumnStart));
1141 m_gridItemCoordinate.set(child, coordinate);
1142
1143 if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite()) {
1136 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows; 1144 GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows;
1137 if (!majorAxisPositions.isDefinite()) 1145 if (majorAxisPositions.isIndefinite())
svillar 2015/12/18 13:08:30 See my comments in GridPosition.h about why !isDef
1138 autoMajorAxisAutoGridItems.append(child); 1146 autoMajorAxisAutoGridItems.append(child);
1139 else 1147 else
1140 specifiedMajorAxisAutoGridItems.append(child); 1148 specifiedMajorAxisAutoGridItems.append(child);
1141 continue; 1149 continue;
1142 } 1150 }
1143 insertItemIntoGrid(*child, coordinate); 1151 insertItemIntoGrid(*child, coordinate);
1144 } 1152 }
1145 1153
1146 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() )); 1154 ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style() ));
1147 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle())); 1155 ASSERT(gridColumnCount() >= GridResolvedPosition::explicitGridColumnCount(*s tyle()));
(...skipping 11 matching lines...) Expand all
1159 GridCoordinate coordinate = cachedGridCoordinate(*child); 1167 GridCoordinate coordinate = cachedGridCoordinate(*child);
1160 ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); 1168 ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite());
1161 } 1169 }
1162 #endif 1170 #endif
1163 } 1171 }
1164 1172
1165 void LayoutGrid::populateExplicitGridAndOrderIterator() 1173 void LayoutGrid::populateExplicitGridAndOrderIterator()
1166 { 1174 {
1167 OrderIteratorPopulator populator(m_orderIterator); 1175 OrderIteratorPopulator populator(m_orderIterator);
1168 1176
1177 m_smallestRowStart = 0;
1178 m_smallestColumnStart = 0;
svillar 2015/12/18 13:08:30 Using a single line is allowed in this case.
Manuel Rego 2015/12/18 22:42:30 Acknowledged.
1179
1169 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style())); 1180 size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitG ridRowCount(*style()));
1170 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style())); 1181 size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explic itGridColumnCount(*style()));
1171 1182
1172 ASSERT(m_gridItemsIndexesMap.isEmpty()); 1183 ASSERT(m_gridItemsIndexesMap.isEmpty());
1173 size_t childIndex = 0; 1184 size_t childIndex = 0;
1174 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) { 1185 for (LayoutBox* child = firstChildBox(); child; child = child->nextInFlowSib lingBox()) {
1175 if (child->isOutOfFlowPositioned()) 1186 if (child->isOutOfFlowPositioned())
1176 continue; 1187 continue;
1177 1188
1178 populator.collectChild(child); 1189 populator.collectChild(child);
1179 m_gridItemsIndexesMap.set(child, childIndex++); 1190 m_gridItemsIndexesMap.set(child, childIndex++);
1180 1191
1181 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it. 1192 // This function bypasses the cache (cachedGridCoordinate()) as it is us ed to build it.
1182 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(*style(), *child, ForRows); 1193 GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromSt yle(*style(), *child, ForRows);
1183 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(*style(), *child, ForColumns); 1194 GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFro mStyle(*style(), *child, ForColumns);
1184 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions)); 1195 m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPosit ions));
1185 1196
1186 // |positions| is 0 if we need to run the auto-placement algorithm. 1197 // |positions| is 0 if we need to run the auto-placement algorithm.
1187 if (rowPositions.isDefinite()) { 1198 if (!rowPositions.isIndefinite()) {
1188 maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.res olvedFinalPosition()); 1199 m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untra nslatedResolvedInitialPosition());
1200 maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untran slatedResolvedFinalPosition());
1189 } else { 1201 } else {
1190 // Grow the grid for items with a definite row span, getting the lar gest such span. 1202 // Grow the grid for items with a definite row span, getting the lar gest such span.
1191 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForRows); 1203 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForRows);
1192 maximumRowIndex = std::max<size_t>(maximumRowIndex, spanSize); 1204 maximumRowIndex = std::max(maximumRowIndex, spanSize);
1193 } 1205 }
1194 1206
1195 if (columnPositions.isDefinite()) { 1207 if (!columnPositions.isIndefinite()) {
1196 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPosi tions.resolvedFinalPosition()); 1208 m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositi ons.untranslatedResolvedInitialPosition());
svillar 2015/12/18 13:08:30 Same comments about !isDefinite and isIndefinite
1209 maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositio ns.untranslatedResolvedFinalPosition());
1197 } else { 1210 } else {
1198 // Grow the grid for items with a definite column span, getting the largest such span. 1211 // Grow the grid for items with a definite column span, getting the largest such span.
1199 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForColumns); 1212 size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*s tyle(), *child, ForColumns);
1200 maximumColumnIndex = std::max<size_t>(maximumColumnIndex, spanSize); 1213 maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
1201 } 1214 }
1202 } 1215 }
1203 1216
1204 m_grid.grow(maximumRowIndex); 1217 m_grid.grow(maximumRowIndex + abs(m_smallestRowStart));
1205 for (auto& column : m_grid) 1218 for (auto& column : m_grid)
1206 column.grow(maximumColumnIndex); 1219 column.grow(maximumColumnIndex + abs(m_smallestColumnStart));
1207 } 1220 }
1208 1221
1209 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const 1222 PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu tsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection , const GridSpan& specifiedPositions) const
1210 { 1223 {
1211 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; 1224 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns;
1212 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount(); 1225 const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumn Count() : gridRowCount();
1213 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI tem(*style(), gridItem, crossDirection); 1226 size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedI tem(*style(), gridItem, crossDirection);
1214 GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDire ction, endOfCrossDirection + crossDirectionSpanSize); 1227 GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDire ction, endOfCrossDirection + crossDirectionSpanSize);
1215 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions)); 1228 return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossD irectionPositions : specifiedPositions, specifiedDirection == ForColumns ? speci fiedPositions : crossDirectionPositions));
1216 } 1229 }
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1469 } 1482 }
1470 1483
1471 LayoutBlock::layoutPositionedObjects(relayoutChildren, info); 1484 LayoutBlock::layoutPositionedObjects(relayoutChildren, info);
1472 } 1485 }
1473 1486
1474 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) 1487 void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid TrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth)
1475 { 1488 {
1476 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); 1489 ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode());
1477 1490
1478 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st yle(), child, direction); 1491 GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*st yle(), child, direction);
1479 if (!positions.isDefinite()) { 1492 if (positions.isIndefinite()) {
1480 offset = LayoutUnit(); 1493 offset = LayoutUnit();
1481 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight(); 1494 breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogic alHeight();
1482 return; 1495 return;
1483 } 1496 }
1497 positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smal lestRowStart);
svillar 2015/12/18 13:08:30 Not sure why we need this here...
Manuel Rego 2015/12/18 22:42:30 Basically positioned objects are skipped in popula
1484 1498
1485 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid ColumnStart() : child.style()->gridRowStart(); 1499 GridPosition startPosition = (direction == ForColumns) ? child.style()->grid ColumnStart() : child.style()->gridRowStart();
1486 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo lumnEnd() : child.style()->gridRowEnd(); 1500 GridPosition endPosition = (direction == ForColumns) ? child.style()->gridCo lumnEnd() : child.style()->gridRowEnd();
1487 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR owCount()) - 1; 1501 size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridR owCount()) - 1;
1488 1502
1489 bool startIsAuto = startPosition.isAuto() 1503 bool startIsAuto = startPosition.isAuto()
1490 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in itialPositionSide(direction))) 1504 || (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNam edLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::in itialPositionSide(direction)))
1491 || (positions.resolvedInitialPosition() > lastTrackIndex); 1505 || (positions.resolvedInitialPosition() > lastTrackIndex);
1492 bool endIsAuto = endPosition.isAuto() 1506 bool endIsAuto = endPosition.isAuto()
1493 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP ositionSide(direction))) 1507 || (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamed LineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalP ositionSide(direction)))
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after
2057 2071
2058 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child)); 2072 return LayoutPoint(rowAxisOffset, columnAxisOffsetForChild(child));
2059 } 2073 }
2060 2074
2061 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2075 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2062 { 2076 {
2063 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2077 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2064 } 2078 }
2065 2079
2066 } // namespace blink 2080 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698