Commit 8a1278f5 authored by Javier Fernandez's avatar Javier Fernandez Committed by Commit Bot

[css-grid] Compute baseline alignment offsets for each axis

Flexible tracks should be considered as content-sized if the grid is
laid out under indefinite size constraints. We only know this while
running the track sizing algorithm for each direction, hence we should
apply the same pattern for the Baseline Alignment offsets computation.

Bug: 855568
Change-Id: Icfc9f3cefc70ab87004a772ac97b60e97b97249d
Reviewed-on: https://chromium-review.googlesource.com/1113933
Commit-Queue: Javier Fernandez <jfernandez@igalia.com>
Reviewed-by: default avatarManuel Rego Casasnovas <rego@igalia.com>
Cr-Commit-Position: refs/heads/master@{#571424}
parent 796ffd72
<!doctype html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<div id="grid" style="display: inline-grid; grid-template-columns: 2fr;">
<div id="item" style="justify-self: baseline;"></div>
</div>
<br>
<div id="grid" style="display: inline-grid; grid-template-columns: minmax(100px, 4fr);">
<div id="item" style="justify-self: baseline;"></div>
</div>
<script>
test(() => {}, "No crash or assertion failure.");
</script>
......@@ -160,9 +160,11 @@ LayoutUnit GridBaselineAlignment::BaselineOffsetForChild(
return LayoutUnit();
}
void GridBaselineAlignment::Clear() {
row_axis_alignment_context_.clear();
col_axis_alignment_context_.clear();
void GridBaselineAlignment::Clear(GridAxis baseline_axis) {
if (baseline_axis == kGridColumnAxis)
row_axis_alignment_context_.clear();
else
col_axis_alignment_context_.clear();
}
BaselineGroup::BaselineGroup(WritingMode block_flow,
......
......@@ -159,7 +159,7 @@ class GridBaselineAlignment {
// Clearing the Baseline Alignment context and their internal
// classes and data structures.
void Clear();
void Clear(GridAxis);
private:
const BaselineGroup& GetBaselineGroupForChild(ItemPosition,
......
......@@ -242,11 +242,15 @@ LayoutUnit GridTrackSizingAlgorithm::GridAreaBreadthForChild(
bool GridTrackSizingAlgorithm::IsIntrinsicSizedGridArea(const LayoutBox& child,
GridAxis axis) const {
DCHECK(WasSetup());
GridTrackSizingDirection direction = GridDirectionForAxis(axis);
const GridSpan& span = grid_.GridItemSpan(child, direction);
for (const auto& track_position : span) {
GridTrackSize track_size = RawGridTrackSize(direction, track_position);
// We consider fr units as 'auto' for the min sizing function.
// TODO(jfernandez): https://github.com/w3c/csswg-drafts/issues/2611
if (track_size.IsContentSized() || track_size.IsFitContent() ||
track_size.MinTrackBreadth().IsFlex() ||
(track_size.MaxTrackBreadth().IsFlex() && !FreeSpace(direction)))
return true;
}
......@@ -436,6 +440,7 @@ bool GridTrackSizingAlgorithm::CanParticipateInBaselineAlignment(
void GridTrackSizingAlgorithm::UpdateBaselineAlignmentContext(
LayoutBox& child,
GridAxis baseline_axis) {
DCHECK(WasSetup());
DCHECK(CanParticipateInBaselineAlignment(child, baseline_axis));
DCHECK(!child.NeedsLayout());
......@@ -461,11 +466,6 @@ LayoutUnit GridTrackSizingAlgorithm::BaselineOffsetForChild(
child, baseline_axis);
}
void GridTrackSizingAlgorithm::ClearBaselineAlignment() {
baseline_alignment_.Clear();
baseline_alignment_.SetBlockFlow(layout_grid_->StyleRef().GetWritingMode());
}
LayoutUnit GridTrackSizingAlgorithmStrategy::ComputeTrackBasedSize() const {
return algorithm_.ComputeTrackBasedSize();
}
......@@ -837,6 +837,8 @@ GridTrackSize GridTrackSizingAlgorithm::GetGridTrackSize(
// Flex sizes are invalid as a min sizing function. However we still can have
// a flexible |minTrackBreadth| if the track had a flex size directly (e.g.
// "1fr"), the spec says that in this case it implies an automatic minimum.
// TODO(jfernandez): https://github.com/w3c/csswg-drafts/issues/2611
// TODO(jfernandez): We may have to change IsIntrinsicSizedGridArea too.
if (min_track_breadth.IsFlex())
min_track_breadth = Length(kAuto);
......@@ -1571,30 +1573,22 @@ void GridTrackSizingAlgorithm::Setup(
}
Tracks(direction).resize(num_tracks);
needs_setup_ = false;
}
void GridTrackSizingAlgorithm::UpdateBaselineAlignmentContext(
LayoutBox& child) {
bool can_participate_in_row_axis_baseline =
CanParticipateInBaselineAlignment(child, kGridRowAxis);
bool can_participate_in_column_axis_baseline =
CanParticipateInBaselineAlignment(child, kGridColumnAxis);
if (!can_participate_in_row_axis_baseline &&
!can_participate_in_column_axis_baseline)
return;
ComputeBaselineAlignmentContext();
if (can_participate_in_row_axis_baseline)
UpdateBaselineAlignmentContext(child, kGridRowAxis);
if (can_participate_in_column_axis_baseline)
UpdateBaselineAlignmentContext(child, kGridColumnAxis);
needs_setup_ = false;
}
void GridTrackSizingAlgorithm::ComputeBaselineAlignmentContext() {
ClearBaselineAlignment();
if (sizing_state_ > kRowSizingFirstIteration)
return;
GridAxis axis = GridAxisForDirection(direction_);
baseline_alignment_.Clear(axis);
baseline_alignment_.SetBlockFlow(layout_grid_->StyleRef().GetWritingMode());
for (auto* child = layout_grid_->FirstInFlowChildBox(); child;
child = child->NextInFlowSiblingBox())
UpdateBaselineAlignmentContext(*child);
child = child->NextInFlowSiblingBox()) {
if (CanParticipateInBaselineAlignment(*child, axis))
UpdateBaselineAlignmentContext(*child, axis);
}
}
// Described in https://drafts.csswg.org/css-grid/#algo-track-sizing
......
......@@ -100,9 +100,7 @@ class GridTrackSizingAlgorithm final {
LayoutUnit MinContentSize() const { return min_content_size_; };
LayoutUnit MaxContentSize() const { return max_content_size_; };
void ComputeBaselineAlignmentContext();
LayoutUnit BaselineOffsetForChild(const LayoutBox&, GridAxis) const;
void ClearBaselineAlignment();
LayoutSize EstimatedGridAreaBreadthForChild(const LayoutBox& child) const;
......@@ -157,7 +155,7 @@ class GridTrackSizingAlgorithm final {
LayoutUnit GridAreaBreadthForChild(const LayoutBox&,
GridTrackSizingDirection) const;
void UpdateBaselineAlignmentContext(LayoutBox&);
void ComputeBaselineAlignmentContext();
void UpdateBaselineAlignmentContext(LayoutBox&, GridAxis);
bool CanParticipateInBaselineAlignment(const LayoutBox&, GridAxis) const;
......
......@@ -280,8 +280,6 @@ void LayoutGrid::UpdateBlockLayout(bool relayout_children) {
SubtreeLayoutScope layout_scope(*this);
track_sizing_algorithm_.ClearBaselineAlignment();
{
// LayoutState needs this deliberate scope to pop before updating scroll
// information (which may trigger relayout).
......@@ -307,8 +305,6 @@ void LayoutGrid::UpdateBlockLayout(bool relayout_children) {
PerformGridItemsPreLayout(track_sizing_algorithm_);
track_sizing_algorithm_.ComputeBaselineAlignmentContext();
// 1- First, the track sizing algorithm is used to resolve the sizes of the
// grid columns.
// At this point the logical width is always definite as the above call to
......@@ -504,7 +500,6 @@ void LayoutGrid::ComputeIntrinsicLogicalWidths(
PerformGridItemsPreLayout(algorithm);
algorithm.ComputeBaselineAlignmentContext();
ComputeTrackSizesForIndefiniteSize(algorithm, kForColumns, min_logical_width,
max_logical_width);
......
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