diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2023-01-11 13:41:06 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2023-01-11 14:02:23 +0000 |
commit | 01e89433adf2d5575b2089716217299519a9ce15 (patch) | |
tree | 5615c6e52f2016c227e6d936cb5005ee6f15418a /chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc | |
parent | 2b11b39a6627d8c71636227374dd8f8ea78c3e6a (diff) | |
download | qtwebengine-chromium-01e89433adf2d5575b2089716217299519a9ce15.tar.gz |
BASELINE: Update Chromium to 108.0.5359.181
Change-Id: Iae2b9d190e7789ad5556dbf4c59498e05ce6e5d2
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/453305
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc | 90 |
1 files changed, 50 insertions, 40 deletions
diff --git a/chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc index 5dd4688f0e7..aab3dfcd146 100644 --- a/chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc +++ b/chromium/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc @@ -116,7 +116,9 @@ NGGridProperties InitializeGridProperties( void CacheGridTrackSpanProperties( const NGGridLayoutTrackCollection& track_collection, GridItems* grid_items, - NGGridProperties* grid_properties = nullptr) { + NGGridProperties* grid_properties = nullptr, + const Vector<GridItemIndices>* range_indices = nullptr, + const Vector<GridArea>* resolved_positions = nullptr) { DCHECK(grid_items); const auto track_direction = track_collection.Direction(); @@ -144,16 +146,29 @@ void CacheGridTrackSpanProperties( CacheGridProperty(TrackSpanProperties::kIsDependentOnAvailableSize); } - auto CacheTrackSpanProperty = - [&](GridItemData& grid_item, const wtf_size_t range_index, - const TrackSpanProperties::PropertyId property) { - if (track_collection.RangeHasTrackSpanProperty(range_index, property)) - grid_item.SetTrackSpanProperty(property, track_direction); - }; - GridItems grid_items_spanning_multiple_ranges; - for (auto& grid_item : *grid_items) { - const auto& range_indices = grid_item.RangeIndices(track_direction); + for (wtf_size_t index = 0; index < grid_items->Size(); ++index) { + auto& grid_item = grid_items->At(index); + + // If positions range indices were provided, assign them before querying + // `RangeIndices` below. + if (resolved_positions && resolved_positions->size()) + grid_item.resolved_position = resolved_positions->at(index); + + if (range_indices && range_indices->size()) { + if (track_direction == kForColumns) + grid_item.column_range_indices = range_indices->at(index); + else + grid_item.row_range_indices = range_indices->at(index); + } + + const auto& item_range_indices = grid_item.RangeIndices(track_direction); + auto& track_span_properties = (track_direction == kForColumns) + ? grid_item.column_span_properties + : grid_item.row_span_properties; + + grid_item.ComputeSetIndices(track_collection); + track_span_properties.Reset(); // If a grid item spans only one range, then we can just cache the track // span properties directly. On the contrary, if a grid item spans multiple @@ -161,17 +176,9 @@ void CacheGridTrackSpanProperties( // to do more work to cache its track span properties. // // TODO(layout-dev): Investigate applying this concept to spans > 1. - if (range_indices.begin == range_indices.end) { - CacheTrackSpanProperty(grid_item, range_indices.begin, - TrackSpanProperties::kHasFlexibleTrack); - CacheTrackSpanProperty(grid_item, range_indices.begin, - TrackSpanProperties::kHasIntrinsicTrack); - CacheTrackSpanProperty(grid_item, range_indices.begin, - TrackSpanProperties::kHasAutoMinimumTrack); - CacheTrackSpanProperty(grid_item, range_indices.begin, - TrackSpanProperties::kHasFixedMinimumTrack); - CacheTrackSpanProperty(grid_item, range_indices.begin, - TrackSpanProperties::kHasFixedMaximumTrack); + if (item_range_indices.begin == item_range_indices.end) { + track_span_properties = + track_collection.RangeProperties(item_range_indices.begin); } else { grid_items_spanning_multiple_ranges.Append(&grid_item); } @@ -287,13 +294,17 @@ const NGLayoutResult* NGGridLayoutAlgorithm::LayoutInternal() { intrinsic_block_size = grid_data->intrinsic_block_size; layout_data = grid_data->layout_data; - for (auto& grid_item : grid_items) { - grid_item.ComputeSetIndices(*layout_data.Columns()); - grid_item.ComputeSetIndices(*layout_data.Rows()); - } - - CacheGridTrackSpanProperties(*layout_data.Columns(), &grid_items); - CacheGridTrackSpanProperties(*layout_data.Rows(), &grid_items); + // Update `grid_items` with resolved positions and range indices stored + // on the break token, as these are dependent on the `layout_data` above. + // + // TODO(kschmi): If these don't change between fragmentainers, we can store + // them (and Columns/Rows) on `NGGridBreakTokenData` and avoid recomputing. + CacheGridTrackSpanProperties( + *layout_data.Columns(), &grid_items, /* grid_properties */ nullptr, + &grid_data->column_range_indices, &grid_data->resolved_positions); + CacheGridTrackSpanProperties(*layout_data.Rows(), &grid_items, + /* grid_properties */ nullptr, + &grid_data->row_range_indices); } else { ComputeGridGeometry(node.CachedPlacementData(), &grid_items, &layout_data, &intrinsic_block_size); @@ -395,12 +406,21 @@ const NGLayoutResult* NGGridLayoutAlgorithm::LayoutInternal() { PlaceOutOfFlowItems(layout_data, block_size, oof_children); if (ConstraintSpace().HasBlockFragmentation()) { + Vector<GridItemIndices> column_range_indices; + Vector<GridItemIndices> row_range_indices; + Vector<GridArea> resolved_positions; + for (auto& grid_item : grid_items) { + column_range_indices.push_back(grid_item.column_range_indices); + row_range_indices.push_back(grid_item.row_range_indices); + resolved_positions.push_back(grid_item.resolved_position); + } container_builder_.SetBreakTokenData( MakeGarbageCollected<NGGridBreakTokenData>( container_builder_.GetBreakTokenData(), layout_data, intrinsic_block_size, consumed_grid_block_size, - grid_items_placement_data, row_offset_adjustments, - row_break_between, oof_children)); + std::move(column_range_indices), std::move(row_range_indices), + std::move(resolved_positions), grid_items_placement_data, + row_offset_adjustments, row_break_between, oof_children)); } // Copy grid layout data for use in computed style and devtools. @@ -442,11 +462,6 @@ MinMaxSizesResult NGGridLayoutAlgorithm::ComputeMinMaxSizes( LayoutTrackCollection(placement_data, kForColumns, &grid_items), LayoutTrackCollection(placement_data, kForRows, &grid_items)); - for (auto& grid_item : grid_items) { - grid_item.ComputeSetIndices(*layout_data.Columns()); - grid_item.ComputeSetIndices(*layout_data.Rows()); - } - auto grid_properties = InitializeGridProperties(grid_items, Style().GetWritingMode()); @@ -804,11 +819,6 @@ void NGGridLayoutAlgorithm::ComputeGridGeometry( *row_builder_collection, is_block_available_size_indefinite); } - for (auto& grid_item : *grid_items) { - grid_item.ComputeSetIndices(*layout_data->Columns()); - grid_item.ComputeSetIndices(*layout_data->Rows()); - } - auto grid_properties = InitializeGridProperties(*grid_items, container_style.GetWritingMode()); |