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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 42b03d34f4a3ed31c22d368ce506ae4f4457199a..17330535460b3c56b90238f8c956a22cec1bccdd 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -656,7 +656,9 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size
{
bool isForColumns = direction == ForColumns;
const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTemplateColumns() : style()->gridTemplateRows();
- const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i];
+ const GridTrackSize& autoTrackSize = isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows();
+ int translatedIndex = i + (isForColumns ? m_smallestColumnStart : m_smallestRowStart);
+ const GridTrackSize& trackSize = (translatedIndex < 0 || translatedIndex >= static_cast<int>(trackStyles.size())) ? autoTrackSize : trackStyles[translatedIndex];
GridLength minTrackBreadth = trackSize.minTrackBreadth();
GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
@@ -1132,9 +1134,15 @@ void LayoutGrid::placeItemsOnGrid()
continue;
GridCoordinate coordinate = cachedGridCoordinate(*child);
- if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) {
+ if (!coordinate.rows.isIndefinite())
+ coordinate.rows.translate(abs(m_smallestRowStart));
+ if (!coordinate.columns.isIndefinite())
+ coordinate.columns.translate(abs(m_smallestColumnStart));
+ m_gridItemCoordinate.set(child, coordinate);
+
+ if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite()) {
GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows;
- if (!majorAxisPositions.isDefinite())
+ if (majorAxisPositions.isIndefinite())
svillar 2015/12/18 13:08:30 See my comments in GridPosition.h about why !isDef
autoMajorAxisAutoGridItems.append(child);
else
specifiedMajorAxisAutoGridItems.append(child);
@@ -1166,6 +1174,9 @@ void LayoutGrid::populateExplicitGridAndOrderIterator()
{
OrderIteratorPopulator populator(m_orderIterator);
+ m_smallestRowStart = 0;
+ 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.
+
size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitGridRowCount(*style()));
size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explicitGridColumnCount(*style()));
@@ -1184,26 +1195,28 @@ void LayoutGrid::populateExplicitGridAndOrderIterator()
m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPositions));
// |positions| is 0 if we need to run the auto-placement algorithm.
- if (rowPositions.isDefinite()) {
- maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.resolvedFinalPosition());
+ if (!rowPositions.isIndefinite()) {
+ m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untranslatedResolvedInitialPosition());
+ maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untranslatedResolvedFinalPosition());
} else {
// Grow the grid for items with a definite row span, getting the largest such span.
size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), *child, ForRows);
- maximumRowIndex = std::max<size_t>(maximumRowIndex, spanSize);
+ maximumRowIndex = std::max(maximumRowIndex, spanSize);
}
- if (columnPositions.isDefinite()) {
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPositions.resolvedFinalPosition());
+ if (!columnPositions.isIndefinite()) {
+ m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositions.untranslatedResolvedInitialPosition());
svillar 2015/12/18 13:08:30 Same comments about !isDefinite and isIndefinite
+ maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositions.untranslatedResolvedFinalPosition());
} else {
// Grow the grid for items with a definite column span, getting the largest such span.
size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), *child, ForColumns);
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, spanSize);
+ maximumColumnIndex = std::max(maximumColumnIndex, spanSize);
}
}
- m_grid.grow(maximumRowIndex);
+ m_grid.grow(maximumRowIndex + abs(m_smallestRowStart));
for (auto& column : m_grid)
- column.grow(maximumColumnIndex);
+ column.grow(maximumColumnIndex + abs(m_smallestColumnStart));
}
PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan& specifiedPositions) const
@@ -1476,11 +1489,12 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode());
GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction);
- if (!positions.isDefinite()) {
+ if (positions.isIndefinite()) {
offset = LayoutUnit();
breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight();
return;
}
+ positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smallestRowStart);
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
GridPosition startPosition = (direction == ForColumns) ? child.style()->gridColumnStart() : child.style()->gridRowStart();
GridPosition endPosition = (direction == ForColumns) ? child.style()->gridColumnEnd() : child.style()->gridRowEnd();

Powered by Google App Engine
This is Rietveld 408576698