Chromium Code Reviews| 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(); |