LibWeb: Skip flex/grid layout when doing intrinsic sizing for ancestor

We don't need to perform inside layout of flex and grid formatting
contexts when one of their ancestors is undergoing intrinsic size
measurement. This is because the parent formatting context will have
already sized the flex/grid container, and thus inside layout is
completely redundant work.
This commit is contained in:
Andreas Kling 2025-03-07 19:25:51 +01:00 committed by Alexander Kalenik
parent 6444fdf5ae
commit 267b84ebb6
Notes: github-actions[bot] 2025-03-08 02:38:45 +00:00
2 changed files with 18 additions and 0 deletions

View file

@ -51,6 +51,15 @@ void FlexFormattingContext::run(AvailableSpace const& available_space)
{
// This implements https://www.w3.org/TR/css-flexbox-1/#layout-algorithm
// OPTIMIZATION: If we're in intrinsic sizing layout, but the flex container is not the
// box being measured, we can skip everything here.
// The parent formatting context has already figured out our size anyway.
if (m_layout_mode == LayoutMode::IntrinsicSizing
&& !available_space.width.is_intrinsic_sizing_constraint()
&& !available_space.height.is_intrinsic_sizing_constraint()) {
return;
}
m_available_space = available_space;
// 1. Generate anonymous flex items

View file

@ -1956,6 +1956,15 @@ CSSPixelRect GridFormattingContext::get_grid_area_rect(GridItem const& grid_item
void GridFormattingContext::run(AvailableSpace const& available_space)
{
// OPTIMIZATION: If we're in intrinsic sizing layout, but the grid container is not the
// box being measured, we can skip everything here.
// The parent formatting context has already figured out our size anyway.
if (m_layout_mode == LayoutMode::IntrinsicSizing
&& !available_space.width.is_intrinsic_sizing_constraint()
&& !available_space.height.is_intrinsic_sizing_constraint()) {
return;
}
m_available_space = available_space;
init_grid_lines(GridDimension::Column);