Commit db55c07a authored by Oriol Brufau's avatar Oriol Brufau Committed by Commit Bot

[css-grid] Prevent FindUsedFlexFraction from iterating items twice

IndefiniteSizeStrategy::FindUsedFlexFraction needs to iterate all grid
items that cross a flexible track. To do so it, takes the indices of the
flex tracks, and for each one it uses GridIterator to iterate the items
in that track.

Then, to avoid processing the same item multiple times, it used to check
that the item started in the current flex track, not in a previous one.

However, this was insufficient: it wasn't taking into account that an
item can be in a single flex track, but span multiple tracks in the
other axis.

Therefore, this patch changes it to use the same approach as in
GridTrackSizingAlgorithm::ResolveIntrinsicTrackSizes, i.e. creates a
HashSet outside of the loop, and inserts each given grid item to it,
checking whether it's a new entry or not.

Bug: 1026275
Change-Id: Ia0327e0459f2398de84b27851be53867f9be5f7a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2506210Reviewed-by: default avatarManuel Rego <rego@igalia.com>
Reviewed-by: default avatarJavier Fernandez <jfernandez@igalia.com>
Commit-Queue: Oriol Brufau <obrufau@igalia.com>
Cr-Commit-Position: refs/heads/master@{#821910}
parent 87eae6df
......@@ -694,16 +694,16 @@ double IndefiniteSizeStrategy::FindUsedFlexFraction(
if (!grid.HasGridItems())
return flex_fraction;
for (size_t i = 0; i < flexible_sized_tracks_index.size(); ++i) {
auto iterator =
grid.CreateIterator(direction, flexible_sized_tracks_index[i]);
HashSet<LayoutBox*> items_set;
for (const auto& track_index : flexible_sized_tracks_index) {
auto iterator = grid.CreateIterator(direction, track_index);
while (LayoutBox* grid_item = iterator->NextGridItem()) {
const GridSpan& span = grid.GridItemSpan(*grid_item, direction);
// Do not include already processed items.
if (i > 0 && span.StartLine() <= flexible_sized_tracks_index[i - 1])
if (!items_set.insert(grid_item).is_new_entry)
continue;
const GridSpan& span = grid.GridItemSpan(*grid_item, direction);
// Removing gutters from the max-content contribution of the item,
// so they are not taken into account in FindFrUnitSize().
LayoutUnit left_over_space =
......
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