1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 15:28:11 +00:00

LibWeb: Implement min/max-content

Use the min/max-content properties when given as a size for a
grid-column or grid-row.
This commit is contained in:
martinfalisse 2023-01-17 13:49:55 +01:00 committed by Andreas Kling
parent 9d07ec3934
commit fa5d016176

View file

@ -680,6 +680,8 @@ void GridFormattingContext::calculate_sizes_of_columns(Box const& box, Available
// - An intrinsic sizing function
// Use an initial base size of zero.
case CSS::GridSize::Type::FlexibleLength:
case CSS::GridSize::Type::MaxContent:
case CSS::GridSize::Type::MinContent:
break;
default:
VERIFY_NOT_REACHED();
@ -706,6 +708,12 @@ void GridFormattingContext::calculate_sizes_of_columns(Box const& box, Available
case CSS::GridSize::Type::FlexibleLength:
grid_column.growth_limit = -1;
break;
// - An intrinsic sizing function
// Use an initial growth limit of infinity.
case CSS::GridSize::Type::MaxContent:
case CSS::GridSize::Type::MinContent:
grid_column.growth_limit = -1;
break;
default:
VERIFY_NOT_REACHED();
}
@ -749,16 +757,25 @@ void GridFormattingContext::calculate_sizes_of_columns(Box const& box, Available
boxes_of_column.append(positioned_box.box);
}
switch (grid_column.min_track_sizing_function.type()) {
// - For min-content minimums:
// If the track has a min-content min track sizing function, set its base size to the maximum of the
// items min-content contributions, floored at zero.
// FIXME: Not implemented yet min-content.
case CSS::GridSize::Type::MinContent: {
CSSPixels column_width = 0;
for (auto& box_of_column : boxes_of_column)
column_width = max(column_width, calculate_min_content_width(box_of_column));
grid_column.base_size = column_width;
} break;
// - For max-content minimums:
// If the track has a max-content min track sizing function, set its base size to the maximum of the
// items max-content contributions, floored at zero.
// FIXME: Not implemented yet max-content.
case CSS::GridSize::Type::MaxContent: {
CSSPixels column_width = 0;
for (auto& box_of_column : boxes_of_column)
column_width = max(column_width, calculate_max_content_width(box_of_column));
grid_column.base_size = column_width;
} break;
// - For auto minimums:
// If the track has an auto min track sizing function and the grid container is being sized under a
// min-/max-content constraint, set the tracks base size to the maximum of its items limited
@ -767,8 +784,8 @@ void GridFormattingContext::calculate_sizes_of_columns(Box const& box, Available
// limited by the max track sizing function (which could be the argument to a fit-content() track
// sizing function) if that is fixed and ultimately floored by its minimum contribution (defined
// below).
// FIXME: Not implemented yet min-/max-content.
// FIXME: Container min/max-content
case CSS::GridSize::Type::Length:
// Otherwise, set the tracks base size to the maximum of its items minimum contributions, floored
// at zero. The minimum contribution of an item is the smallest outer size it can have.
// Specifically, if the items computed preferred size behaves as auto or depends on the size of its
@ -776,21 +793,44 @@ void GridFormattingContext::calculate_sizes_of_columns(Box const& box, Available
// result from assuming the items used minimum size as its preferred size; else the items minimum
// contribution is its min-content contribution. Because the minimum contribution often depends on
// the size of the items content, it is considered a type of intrinsic size contribution.
CSSPixels grid_column_width = 0;
for (auto& box_of_column : boxes_of_column)
grid_column_width = max(grid_column_width, calculate_min_content_width(box_of_column).value());
grid_column.base_size = grid_column_width;
case CSS::GridSize::Type::Percentage:
case CSS::GridSize::Type::FlexibleLength: {
CSSPixels grid_column_width = 0;
for (auto& box_of_column : boxes_of_column)
grid_column_width = max(grid_column_width, calculate_min_content_width(box_of_column).value());
grid_column.base_size = grid_column_width;
} break;
default:
VERIFY_NOT_REACHED();
}
switch (grid_column.max_track_sizing_function.type()) {
// - For min-content maximums:
// If the track has a min-content max track sizing function, set its growth limit to the maximum of
// the items min-content contributions.
// FIXME: Not implemented yet min-content maximums.
case CSS::GridSize::Type::MinContent: {
CSSPixels column_width = 0;
for (auto& box_of_column : boxes_of_column)
column_width = max(column_width, calculate_min_content_width(box_of_column));
grid_column.growth_limit = column_width;
} break;
// - For max-content maximums:
// If the track has a max-content max track sizing function, set its growth limit to the maximum of
// the items max-content contributions. For fit-content() maximums, furthermore clamp this growth
// limit by the fit-content() argument.
// FIXME: Not implemented yet max-content maximums.
case CSS::GridSize::Type::MaxContent: {
CSSPixels column_width = 0;
for (auto& box_of_column : boxes_of_column)
column_width = max(column_width, calculate_max_content_width(box_of_column));
grid_column.growth_limit = column_width;
} break;
case CSS::GridSize::Type::Length:
case CSS::GridSize::Type::Percentage:
case CSS::GridSize::Type::FlexibleLength:
break;
default:
VERIFY_NOT_REACHED();
}
// In all cases, if a tracks growth limit is now less than its base size, increase the growth limit
// to match the base size.
@ -1139,6 +1179,8 @@ void GridFormattingContext::calculate_sizes_of_rows(Box const& box)
// - An intrinsic sizing function
// Use an initial base size of zero.
case CSS::GridSize::Type::FlexibleLength:
case CSS::GridSize::Type::MaxContent:
case CSS::GridSize::Type::MinContent:
break;
default:
VERIFY_NOT_REACHED();
@ -1164,6 +1206,12 @@ void GridFormattingContext::calculate_sizes_of_rows(Box const& box)
case CSS::GridSize::Type::FlexibleLength:
grid_row.growth_limit = -1;
break;
// - An intrinsic sizing function
// Use an initial growth limit of infinity.
case CSS::GridSize::Type::MaxContent:
case CSS::GridSize::Type::MinContent:
grid_row.growth_limit = -1;
break;
default:
VERIFY_NOT_REACHED();
}
@ -1207,16 +1255,25 @@ void GridFormattingContext::calculate_sizes_of_rows(Box const& box)
positioned_boxes_of_row.append(positioned_box);
}
switch (grid_row.min_track_sizing_function.type()) {
// - For min-content minimums:
// If the track has a min-content min track sizing function, set its base size to the maximum of the
// items min-content contributions, floored at zero.
// FIXME: Not implemented yet min-content.
case CSS::GridSize::Type::MinContent: {
CSSPixels row_height = 0;
for (auto& positioned_box : positioned_boxes_of_row)
row_height = max(row_height, calculate_min_content_height(positioned_box.box, AvailableSize::make_definite(m_grid_columns[positioned_box.column].base_size)));
grid_row.base_size = row_height;
} break;
// - For max-content minimums:
// If the track has a max-content min track sizing function, set its base size to the maximum of the
// items max-content contributions, floored at zero.
// FIXME: Not implemented yet max-content.
case CSS::GridSize::Type::MaxContent: {
CSSPixels row_height = 0;
for (auto& positioned_box : positioned_boxes_of_row)
row_height = max(row_height, calculate_max_content_height(positioned_box.box, AvailableSize::make_definite(m_grid_columns[positioned_box.column].base_size)));
grid_row.base_size = row_height;
} break;
// - For auto minimums:
// If the track has an auto min track sizing function and the grid container is being sized under a
// min-/max-content constraint, set the tracks base size to the maximum of its items limited
@ -1225,8 +1282,8 @@ void GridFormattingContext::calculate_sizes_of_rows(Box const& box)
// limited by the max track sizing function (which could be the argument to a fit-content() track
// sizing function) if that is fixed and ultimately floored by its minimum contribution (defined
// below).
// FIXME: Not implemented yet min-/max-content.
// FIXME: Container min/max-content
case CSS::GridSize::Type::Length:
// Otherwise, set the tracks base size to the maximum of its items minimum contributions, floored
// at zero. The minimum contribution of an item is the smallest outer size it can have.
// Specifically, if the items computed preferred size behaves as auto or depends on the size of its
@ -1234,21 +1291,44 @@ void GridFormattingContext::calculate_sizes_of_rows(Box const& box)
// result from assuming the items used minimum size as its preferred size; else the items minimum
// contribution is its min-content contribution. Because the minimum contribution often depends on
// the size of the items content, it is considered a type of intrinsic size contribution.
CSSPixels grid_row_height = 0;
for (auto& positioned_box : positioned_boxes_of_row)
grid_row_height = max(grid_row_height, calculate_min_content_height(positioned_box.box, AvailableSize::make_definite(m_grid_columns[positioned_box.column].base_size)));
grid_row.base_size = grid_row_height;
case CSS::GridSize::Type::Percentage:
case CSS::GridSize::Type::FlexibleLength: {
CSSPixels grid_row_height = 0;
for (auto& positioned_box : positioned_boxes_of_row)
grid_row_height = max(grid_row_height, calculate_min_content_height(positioned_box.box, AvailableSize::make_definite(m_grid_columns[positioned_box.column].base_size)));
grid_row.base_size = grid_row_height;
} break;
default:
VERIFY_NOT_REACHED();
}
switch (grid_row.max_track_sizing_function.type()) {
// - For min-content maximums:
// If the track has a min-content max track sizing function, set its growth limit to the maximum of
// the items min-content contributions.
// FIXME: Not implemented yet min-content maximums.
case CSS::GridSize::Type::MinContent: {
CSSPixels row_height = 0;
for (auto& positioned_box : positioned_boxes_of_row)
row_height = max(row_height, calculate_max_content_height(positioned_box.box, AvailableSize::make_definite(m_grid_columns[positioned_box.column].base_size)));
grid_row.base_size = row_height;
} break;
// - For max-content maximums:
// If the track has a max-content max track sizing function, set its growth limit to the maximum of
// the items max-content contributions. For fit-content() maximums, furthermore clamp this growth
// limit by the fit-content() argument.
// FIXME: Not implemented yet max-content maximums.
case CSS::GridSize::Type::MaxContent: {
CSSPixels row_height = 0;
for (auto& positioned_box : positioned_boxes_of_row)
row_height = max(row_height, calculate_max_content_height(positioned_box.box, AvailableSize::make_definite(m_grid_columns[positioned_box.column].base_size)));
grid_row.base_size = row_height;
} break;
case CSS::GridSize::Type::Length:
case CSS::GridSize::Type::Percentage:
case CSS::GridSize::Type::FlexibleLength:
break;
default:
VERIFY_NOT_REACHED();
}
// In all cases, if a tracks growth limit is now less than its base size, increase the growth limit
// to match the base size.