Commit fd60fc3c authored by svillar's avatar svillar Committed by Commit bot

[css-grid] Do not recursively call layout during auto repeat computation

The computation of auto repeat tracks was incorrectly recursively triggering
a layout in order to compute the available size. That was happening whenever
the width was indefinite. In such cases we should treat the width always as
indefinite without having to run any extra code. During the layout phase
we'll have the actual width available.

This partially reverts commit 49bc5ba1 which
was a quick fix for a security issue but that was not actually fixing the
real problem behind.

BUG=633474

Review-Url: https://codereview.chromium.org/2263213002
Cr-Commit-Position: refs/heads/master@{#414446}
parent 2fc863f2
...@@ -441,10 +441,9 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) ...@@ -441,10 +441,9 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
// TODO(svillar): we won't need to do this once the intrinsic width computation is isolated // TODO(svillar): we won't need to do this once the intrinsic width computation is isolated
// from the LayoutGrid object state (it should not touch any attribute) (see crbug.com/627812) // from the LayoutGrid object state (it should not touch any attribute) (see crbug.com/627812)
size_t autoRepeatColumnsCount = computeAutoRepeatTracksCount(ForColumns); if (m_autoRepeatColumns && m_autoRepeatColumns != computeAutoRepeatTracksCount(ForColumns, TrackSizing))
if (m_autoRepeatColumns && m_autoRepeatColumns != autoRepeatColumnsCount)
dirtyGrid(); dirtyGrid();
placeItemsOnGrid(autoRepeatColumnsCount); placeItemsOnGrid(TrackSizing);
GridSizingData sizingData(gridColumnCount(), gridRowCount()); GridSizingData sizingData(gridColumnCount(), gridRowCount());
...@@ -575,7 +574,7 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t st ...@@ -575,7 +574,7 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t st
void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
{ {
const_cast<LayoutGrid*>(this)->placeItemsOnGrid(styleRef().gridAutoRepeatColumns().size()); const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation);
GridSizingData sizingData(gridColumnCount(), gridRowCount()); GridSizingData sizingData(gridColumnCount(), gridRowCount());
sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit(); sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit();
...@@ -1384,7 +1383,7 @@ void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area) ...@@ -1384,7 +1383,7 @@ void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridArea& area)
} }
} }
size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection direction) const size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection direction, SizingOperation sizingOperation) const
{ {
bool isRowAxis = direction == ForColumns; bool isRowAxis = direction == ForColumns;
const auto& autoRepeatTracks = isRowAxis ? styleRef().gridAutoRepeatColumns() : styleRef().gridAutoRepeatRows(); const auto& autoRepeatTracks = isRowAxis ? styleRef().gridAutoRepeatColumns() : styleRef().gridAutoRepeatRows();
...@@ -1393,18 +1392,18 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi ...@@ -1393,18 +1392,18 @@ size_t LayoutGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection directi
if (!autoRepeatTrackListLength) if (!autoRepeatTrackListLength)
return 0; return 0;
LayoutUnit availableSize = isRowAxis ? availableLogicalWidth() : computeContentLogicalHeight(MainOrPreferredSize, styleRef().logicalHeight(), LayoutUnit(-1)); LayoutUnit availableSize;
if (availableSize == -1) { if (isRowAxis) {
const Length& maxLength = isRowAxis ? styleRef().logicalMaxWidth() : styleRef().logicalMaxHeight(); availableSize = sizingOperation == IntrinsicSizeComputation ? LayoutUnit(-1) : availableLogicalWidth();
if (!maxLength.isMaxSizeNone()) {
availableSize = isRowAxis
? computeLogicalWidthUsing(MaxSize, maxLength, containingBlockLogicalWidthForContent(), containingBlock())
: computeContentLogicalHeight(MaxSize, maxLength, LayoutUnit(-1));
}
} else { } else {
availableSize = isRowAxis availableSize = computeContentLogicalHeight(MainOrPreferredSize, styleRef().logicalHeight(), LayoutUnit(-1));
? constrainLogicalWidthByMinMax(availableSize, availableLogicalWidth(), containingBlock()) if (availableSize == -1) {
: constrainLogicalHeightByMinMax(availableSize, LayoutUnit(-1)); const Length& maxLength = styleRef().logicalMaxHeight();
if (!maxLength.isMaxSizeNone())
availableSize = computeContentLogicalHeight(MaxSize, maxLength, LayoutUnit(-1));
} else {
availableSize = constrainLogicalHeightByMinMax(availableSize, LayoutUnit(-1));
}
} }
bool needsToFulfillMinimumSize = false; bool needsToFulfillMinimumSize = false;
...@@ -1491,15 +1490,19 @@ std::unique_ptr<LayoutGrid::OrderedTrackIndexSet> LayoutGrid::computeEmptyTracks ...@@ -1491,15 +1490,19 @@ std::unique_ptr<LayoutGrid::OrderedTrackIndexSet> LayoutGrid::computeEmptyTracks
return emptyTrackIndexes; return emptyTrackIndexes;
} }
void LayoutGrid::placeItemsOnGrid(size_t autoRepeatColumnsCount) void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation)
{ {
if (!m_gridIsDirty) if (!m_gridIsDirty)
return; return;
ASSERT(m_gridItemArea.isEmpty()); DCHECK(m_gridItemArea.isEmpty());
DCHECK(m_gridItemsIndexesMap.isEmpty());
m_autoRepeatColumns = autoRepeatColumnsCount; if (sizingOperation == IntrinsicSizeComputation)
m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows); m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().size();
else
m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOperation);
m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation);
populateExplicitGridAndOrderIterator(); populateExplicitGridAndOrderIterator();
......
...@@ -124,7 +124,7 @@ private: ...@@ -124,7 +124,7 @@ private:
void ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize); void ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize);
void insertItemIntoGrid(LayoutBox&, const GridArea&); void insertItemIntoGrid(LayoutBox&, const GridArea&);
size_t computeAutoRepeatTracksCount(GridTrackSizingDirection) const; size_t computeAutoRepeatTracksCount(GridTrackSizingDirection, SizingOperation) const;
typedef ListHashSet<size_t> OrderedTrackIndexSet; typedef ListHashSet<size_t> OrderedTrackIndexSet;
std::unique_ptr<OrderedTrackIndexSet> computeEmptyTracksForAutoRepeat(GridTrackSizingDirection) const; std::unique_ptr<OrderedTrackIndexSet> computeEmptyTracksForAutoRepeat(GridTrackSizingDirection) const;
...@@ -132,7 +132,7 @@ private: ...@@ -132,7 +132,7 @@ private:
bool hasAutoRepeatEmptyTracks(GridTrackSizingDirection) const; bool hasAutoRepeatEmptyTracks(GridTrackSizingDirection) const;
bool isEmptyAutoRepeatTrack(GridTrackSizingDirection, size_t lineNumber) const; bool isEmptyAutoRepeatTrack(GridTrackSizingDirection, size_t lineNumber) const;
void placeItemsOnGrid(size_t autoRepeatColumnsCount); void placeItemsOnGrid(SizingOperation);
void populateExplicitGridAndOrderIterator(); void populateExplicitGridAndOrderIterator();
std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const LayoutBox&, GridTrackSizingDirection, const GridSpan& specifiedPositions) const; std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const LayoutBox&, GridTrackSizingDirection, const GridSpan& specifiedPositions) const;
void placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>&); void placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>&);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment