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 1ac1d2d35d3cc99dcec4971c84193397ebd0a8ea..fdf52cfb9d4876d107b110bbbcc236d2ba9dc84f 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| @@ -1307,6 +1307,48 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi |
| return repetitions; |
| } |
| +std::unique_ptr<Vector<size_t>> LayoutGrid::computeEmptyTracksCountForAutoRepeat(GridTrackSizingDirection direction, size_t insertionPoint) const |
| +{ |
|
Manuel Rego
2016/06/21 21:57:38
I think we need a comment explaining what this met
svillar
2016/06/23 08:09:42
Acknowledged.
|
| + std::unique_ptr<Vector<size_t>> emptyTracksCounter; |
| + size_t repetitions = autoRepeatCountForDirection(direction); |
| + if (m_gridItemArea.isEmpty()) { |
| + emptyTracksCounter = wrapUnique(new Vector<size_t>(repetitions)); |
| + for (size_t i = 0; i < repetitions; i++) |
| + emptyTracksCounter->at(i) = i + 1; |
| + return emptyTracksCounter; |
| + } |
| + |
| + size_t emptyTracksCount = 0; |
|
Manuel Rego
2016/06/21 21:57:37
emptyTracksCount and emptyTracksCounter in the ver
svillar
2016/06/23 08:09:42
I agree, I even had build issues because I was rep
|
| + size_t firstAutoRepeatTrack = insertionPoint + std::abs(direction == ForColumns ? m_smallestColumnStart : m_smallestRowStart); |
| + size_t lastAutoRepeatTrack = firstAutoRepeatTrack + repetitions; |
| + for (size_t trackIndex = firstAutoRepeatTrack; trackIndex < lastAutoRepeatTrack; ++trackIndex) { |
| + GridIterator iterator(m_grid, direction, trackIndex); |
| + if (!iterator.nextGridItem()) |
| + ++emptyTracksCount; |
| + |
| + if (!emptyTracksCounter) |
|
jfernandez
2016/06/21 07:40:26
Isn't this name a bit confusing ? I understood the
Manuel Rego
2016/06/21 21:57:37
Maybe we can rename emptyTracksCounter to droppedT
svillar
2016/06/23 08:09:42
OK
svillar
2016/06/23 08:09:42
Well it's a pointer that's the standard way to kno
svillar
2016/06/23 08:19:14
So the thing about your suggestion is that it is n
|
| + emptyTracksCounter = wrapUnique(new Vector<size_t>(repetitions)); |
| + emptyTracksCounter->at(trackIndex - firstAutoRepeatTrack) = emptyTracksCount; |
| + } |
| + return emptyTracksCounter; |
| +} |
| + |
| +size_t LayoutGrid::droppedTracksBeforeLine(GridTrackSizingDirection direction, size_t line) const |
| +{ |
| + bool isRowAxis = direction == ForColumns; |
| + auto* droppedTracksCounter = isRowAxis ? m_emptyColumnsCounter.get() : m_emptyRowsCounter.get(); |
| + size_t smallestStart = abs(isRowAxis ? m_smallestColumnStart : m_smallestRowStart); |
| + size_t firstAutoRepeatTrack = (isRowAxis ? styleRef().gridAutoRepeatColumnsInsertionPoint() : styleRef().gridAutoRepeatRowsInsertionPoint()) + smallestStart; |
| + if (droppedTracksCounter && line > firstAutoRepeatTrack) { |
| + size_t lastAutoRepeatTrack = firstAutoRepeatTrack + droppedTracksCounter->size(); |
| + size_t trackIndex = line - firstAutoRepeatTrack - 1; |
| + size_t droppedTracks = line < lastAutoRepeatTrack ? droppedTracksCounter->at(trackIndex) : droppedTracksCounter->last(); |
| + DCHECK_GE(droppedTracksCounter->size(), droppedTracks); |
| + return droppedTracks; |
| + } |
| + return 0; |
| +} |
| + |
| void LayoutGrid::placeItemsOnGrid() |
| { |
| if (!m_gridIsDirty) |
| @@ -1354,6 +1396,44 @@ void LayoutGrid::placeItemsOnGrid() |
| m_grid.shrinkToFit(); |
| + /* auto-fit */ |
|
Manuel Rego
2016/06/21 21:57:38
Nit: I would move this to a separated method,
it d
svillar
2016/06/23 08:09:42
I guess it's a matter of taste. I don't usually li
|
| + if (m_autoRepeatColumns && styleRef().gridAutoRepeatColumnsType() == AutoFit) |
| + m_emptyColumnsCounter = computeEmptyTracksCountForAutoRepeat(ForColumns, styleRef().gridAutoRepeatColumnsInsertionPoint()); |
| + else |
| + m_emptyColumnsCounter = nullptr; |
| + |
| + if (m_autoRepeatRows && styleRef().gridAutoRepeatRowsType() == AutoFit) |
| + m_emptyRowsCounter = computeEmptyTracksCountForAutoRepeat(ForRows, styleRef().gridAutoRepeatRowsInsertionPoint()); |
| + else |
| + m_emptyRowsCounter = nullptr; |
| + |
| + if (m_emptyRowsCounter || m_emptyColumnsCounter) { |
| + for (auto* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { |
| + if (child->isOutOfFlowPositioned()) |
| + continue; |
| + |
| + GridArea area = cachedGridArea(*child); |
| + size_t droppedColumns = droppedTracksBeforeLine(ForColumns, area.columns.startLine()); |
| + size_t droppedRows = droppedTracksBeforeLine(ForRows, area.rows.startLine()); |
| + if (droppedColumns || droppedRows) { |
| + area.adjustForDroppedTracks(droppedColumns, droppedRows); |
| + m_gridItemArea.set(child, area); |
| + } |
| + } |
| + |
| + size_t droppedColumnsCount = m_emptyColumnsCounter ? m_emptyColumnsCounter->last() : 0; |
| + size_t droppedRowsCount = m_emptyRowsCounter ? m_emptyRowsCounter->last() : 0; |
| + DCHECK_GE(m_autoRepeatColumns, droppedColumnsCount); |
| + DCHECK_GE(m_autoRepeatRows, droppedRowsCount); |
| + |
| + m_autoRepeatColumns -= droppedColumnsCount; |
| + m_autoRepeatRows -= droppedRowsCount; |
| + |
| + m_grid.shrink(m_grid.size() - droppedRowsCount); |
| + for (auto& row : m_grid) |
| + row.shrink(row.size() - droppedColumnsCount); |
| + } |
| + |
| #if ENABLE(ASSERT) |
| for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { |
| if (child->isOutOfFlowPositioned()) |
| @@ -1700,7 +1780,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
| } |
| // For positioned items we cannot use GridSpan::translate(). Because we could end up with negative values, as the positioned items do not create implicit tracks per spec. |
| - int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRowStart); |
| + size_t smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRowStart); |
| int startLine = positions.untranslatedStartLine() + smallestStart; |
| int endLine = positions.untranslatedEndLine() + smallestStart; |
| @@ -1719,6 +1799,9 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
| LayoutUnit start; |
| if (!startIsAuto) { |
| + startLine -= droppedTracksBeforeLine(direction, startLine); |
| + DCHECK_GE(startLine, 0); |
| + |
| if (isForColumns) { |
| if (styleRef().isLeftToRightDirection()) |
| start = m_columnPositions[startLine] - borderLogicalLeft(); |
| @@ -1731,6 +1814,9 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
| LayoutUnit end = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); |
| if (!endIsAuto) { |
| + endLine -= droppedTracksBeforeLine(direction, endLine); |
| + DCHECK_GE(endLine, 0); |
| + |
| if (isForColumns) { |
| if (styleRef().isLeftToRightDirection()) |
| end = m_columnPositions[endLine] - borderLogicalLeft(); |