Skip to content

Commit

Permalink
[GridNG] Consider subgridded items in parent grid sizing
Browse files Browse the repository at this point in the history
Bug: 618969
Change-Id: I6422f12b04d9041219c0e127f75e336ff7b4caee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3553429
Reviewed-by: Ian Kilpatrick <ikilpatrick@chromium.org>
Commit-Queue: Ethan Jimenez <ethavar@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#987076}
  • Loading branch information
ethanjv authored and Chromium LUCI CQ committed Mar 30, 2022
1 parent 8969a8d commit 5fda693
Show file tree
Hide file tree
Showing 15 changed files with 393 additions and 188 deletions.
27 changes: 17 additions & 10 deletions third_party/blink/renderer/core/layout/ng/grid/layout_ng_grid.cc
Original file line number Diff line number Diff line change
Expand Up @@ -161,18 +161,25 @@ wtf_size_t LayoutNGGrid::ExplicitGridStartForDirection(
wtf_size_t LayoutNGGrid::ExplicitGridEndForDirection(
const GridTrackSizingDirection track_direction) const {
NOT_DESTROYED();
const wtf_size_t start_offset =
ExplicitGridStartForDirection(track_direction);
if (IsGridPlacementDirty())
return 0;

const bool is_for_columns = track_direction == kForColumns;
const wtf_size_t subgrid_span_size =
is_for_columns ? cached_placement_data_.column_subgrid_span_size
: cached_placement_data_.row_subgrid_span_size;

const wtf_size_t explicit_grid_track_count =
is_for_columns ? GridPositionsResolver::ExplicitGridColumnCount(
StyleRef(), AutoRepeatCountForDirection(kForColumns),
/* is_ng_grid */ true, subgrid_span_size)
: GridPositionsResolver::ExplicitGridRowCount(
StyleRef(), AutoRepeatCountForDirection(kForRows),
/* is_ng_grid */ true, subgrid_span_size);

return base::checked_cast<wtf_size_t>(
start_offset +
((track_direction == kForColumns)
? GridPositionsResolver::ExplicitGridColumnCount(
StyleRef(), AutoRepeatCountForDirection(kForColumns),
/* is_ng_grid */ true)
: GridPositionsResolver::ExplicitGridRowCount(
StyleRef(), AutoRepeatCountForDirection(kForRows),
/* is_ng_grid */ true)));
ExplicitGridStartForDirection(track_direction) +
explicit_grid_track_count);
}

LayoutUnit LayoutNGGrid::GridGap(
Expand Down
23 changes: 21 additions & 2 deletions third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,21 @@ struct CORE_EXPORT NGGridPlacementData {
row_start_offset == other.row_start_offset;
}

bool HasStandalonePlacement(GridTrackSizingDirection track_direction) const {
const wtf_size_t subgrid_span_size = (track_direction == kForColumns)
? column_subgrid_span_size
: row_subgrid_span_size;
return subgrid_span_size == kNotFound;
}

void SetSubgridSpanSize(wtf_size_t subgrid_span_size,
GridTrackSizingDirection track_direction) {
if (track_direction == kForColumns)
column_subgrid_span_size = subgrid_span_size;
else
row_subgrid_span_size = subgrid_span_size;
}

Vector<GridArea> grid_item_positions;

bool is_parent_grid_container : 1;
Expand All @@ -50,6 +65,10 @@ struct CORE_EXPORT NGGridLayoutData {
public:
NGGridLayoutData() = default;

NGGridLayoutData(std::unique_ptr<NGGridLayoutTrackCollection> columns,
std::unique_ptr<NGGridLayoutTrackCollection> rows)
: columns(std::move(columns)), rows(std::move(rows)) {}

NGGridLayoutData(const NGGridLayoutData& other) { CopyFrom(other); }

NGGridLayoutData& operator=(const NGGridLayoutData& other) {
Expand All @@ -65,12 +84,12 @@ struct CORE_EXPORT NGGridLayoutData {
}

NGGridLayoutTrackCollection* Columns() const {
DCHECK(columns);
DCHECK(columns && columns->Direction() == kForColumns);
return columns.get();
}

NGGridLayoutTrackCollection* Rows() const {
DCHECK(rows);
DCHECK(rows && rows->Direction() == kForRows);
return rows.get();
}

Expand Down
25 changes: 22 additions & 3 deletions third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,9 @@ BaselineType DetermineBaselineType(
GridItemData::GridItemData(const NGBlockNode node,
const ComputedStyle& container_style,
const WritingMode container_writing_mode)
: node(node), is_sizing_dependent_on_block_size(false) {
: node(node),
is_sizing_dependent_on_block_size(false),
is_subgridded_to_parent_grid(false) {
const auto& style = node.Style();

const bool is_replaced = node.IsReplaced();
Expand Down Expand Up @@ -269,7 +271,7 @@ void GridItemData::ComputeSetIndices(
DCHECK_EQ(computed_range_index, range_indices.begin);

computed_range_index =
track_collection.RangeIndexFromGridLine(EndLine(track_direction)) - 1;
track_collection.RangeIndexFromGridLine(EndLine(track_direction) - 1);
DCHECK_EQ(computed_range_index, range_indices.end);
}
#endif
Expand All @@ -280,7 +282,7 @@ void GridItemData::ComputeSetIndices(
range_indices.begin =
track_collection.RangeIndexFromGridLine(StartLine(track_direction));
range_indices.end =
track_collection.RangeIndexFromGridLine(EndLine(track_direction)) - 1;
track_collection.RangeIndexFromGridLine(EndLine(track_direction) - 1);
}

DCHECK_LT(range_indices.end, track_collection.RangeCount());
Expand Down Expand Up @@ -367,4 +369,21 @@ void GridItemData::ComputeOutOfFlowItemPlacement(
}
}

void GridItems::RemoveSubgriddedItems() {
wtf_size_t new_item_count = 0;
for (const auto& grid_item : item_data) {
if (grid_item.is_subgridded_to_parent_grid)
break;
++new_item_count;
}

#if DCHECK_IS_ON()
for (wtf_size_t i = new_item_count; i < item_data.size(); ++i)
DCHECK(item_data[i].is_subgridded_to_parent_grid);
#endif

reordered_item_indices.Shrink(new_item_count);
item_data.Shrink(new_item_count);
}

} // namespace blink
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ struct CORE_EXPORT GridItemData {
bool is_block_axis_overflow_safe : 1;
bool is_inline_axis_overflow_safe : 1;
bool is_sizing_dependent_on_block_size : 1;
bool is_subgridded_to_parent_grid : 1;

AxisEdge inline_axis_alignment;
AxisEdge block_axis_alignment;
Expand Down Expand Up @@ -226,7 +227,7 @@ struct CORE_EXPORT GridItems {
}
Iterator end() { return Iterator(&item_data, reordered_item_indices.end()); }

void Append(const GridItemData& new_item_data) {
void Append(GridItemData&& new_item_data) {
reordered_item_indices.push_back(item_data.size());
item_data.emplace_back(new_item_data);
}
Expand All @@ -235,6 +236,8 @@ struct CORE_EXPORT GridItems {
item_data.ReserveCapacity(capacity);
}

void RemoveSubgriddedItems();

wtf_size_t Size() const { return item_data.size(); }
bool IsEmpty() const { return item_data.IsEmpty(); }

Expand Down

0 comments on commit 5fda693

Please sign in to comment.