Commit 49bc5ba1 authored by rego's avatar rego Committed by Commit bot

[css-grid] Avoid computing twice the number of auto-repeat columns

During the track sizing layout, we were computing twice the number
of auto-repeat columns.
That was causing crashes on debug and ASAN builds.
The patch computes the value once and pass it to
LayoutGrid::placeItemsOnGrid(), which avoids the issue.

Add new cases that were crashing to test introduced in r405529.

BUG=633474
TBR=svillar@igalia.com
TEST=fast/css-grid-layout/grid-indefinite-size-auto-repeat-crash.html

Review-Url: https://codereview.chromium.org/2254843002
Cr-Commit-Position: refs/heads/master@{#412638}
parent 2cf52b95
item
item
item
item
item
item
item
item
item
item
This test checks that the computation of auto repeat tracks works when the grid container width is indefinite.
This test has PASSED if it didn't CRASH.
......@@ -27,5 +27,20 @@ if (window.testRunner)
<div class="grid autoFill min-width-max-content min-height-max-content"></div>
<div class="grid autoFit min-width-max-content min-height-max-content"></div>
<div class="grid autoFill">item</div>
<div class="grid autoFit">item</div>
<div class="grid autoFill min-content">item</div>
<div class="grid autoFit min-content">item</div>
<div class="grid autoFill max-content">item</div>
<div class="grid autoFit max-content">item</div>
<div class="grid autoFill min-width-min-content min-height-min-content">item</div>
<div class="grid autoFit min-width-min-content min-height-min-content">item</div>
<div class="grid autoFill min-width-max-content min-height-max-content">item</div>
<div class="grid autoFit min-width-max-content min-height-max-content">item</div>
<p>This test checks that the computation of auto repeat tracks works when the grid container width is indefinite.</p>
<p>This test has PASSED if it didn't CRASH.</p>
......@@ -441,9 +441,10 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
// 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)
if (m_autoRepeatColumns && m_autoRepeatColumns != computeAutoRepeatTracksCount(ForColumns))
size_t autoRepeatColumnsCount = computeAutoRepeatTracksCount(ForColumns);
if (m_autoRepeatColumns && m_autoRepeatColumns != autoRepeatColumnsCount)
dirtyGrid();
placeItemsOnGrid(TrackSizing);
placeItemsOnGrid(autoRepeatColumnsCount);
GridSizingData sizingData(gridColumnCount(), gridRowCount());
......@@ -574,7 +575,7 @@ LayoutUnit LayoutGrid::guttersSize(GridTrackSizingDirection direction, size_t st
void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
{
const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation);
const_cast<LayoutGrid*>(this)->placeItemsOnGrid(styleRef().gridAutoRepeatColumns().size());
GridSizingData sizingData(gridColumnCount(), gridRowCount());
sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit();
......@@ -1490,17 +1491,14 @@ std::unique_ptr<LayoutGrid::OrderedTrackIndexSet> LayoutGrid::computeEmptyTracks
return emptyTrackIndexes;
}
void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation)
void LayoutGrid::placeItemsOnGrid(size_t autoRepeatColumnsCount)
{
if (!m_gridIsDirty)
return;
ASSERT(m_gridItemArea.isEmpty());
if (sizingOperation == IntrinsicSizeComputation)
m_autoRepeatColumns = styleRef().gridAutoRepeatColumns().size();
else
m_autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns);
m_autoRepeatColumns = autoRepeatColumnsCount;
m_autoRepeatRows = computeAutoRepeatTracksCount(ForRows);
populateExplicitGridAndOrderIterator();
......
......@@ -132,7 +132,7 @@ private:
bool hasAutoRepeatEmptyTracks(GridTrackSizingDirection) const;
bool isEmptyAutoRepeatTrack(GridTrackSizingDirection, size_t lineNumber) const;
void placeItemsOnGrid(SizingOperation);
void placeItemsOnGrid(size_t autoRepeatColumnsCount);
void populateExplicitGridAndOrderIterator();
std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const LayoutBox&, GridTrackSizingDirection, const GridSpan& specifiedPositions) const;
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