From 2def1de4be6d147ea40d61da4511f1a715909473 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sat, 21 Oct 2023 04:29:38 +0200 Subject: [PATCH] LibWeb: Rerun rows sizings if grid auto height is less than min-height If the first pass of rows sizing results in the container's automatic height being less than the specified min-height, we need to run a second pass using the updated available space. --- .../expected/grid/container-min-height.txt | 23 +++++++++++++++++++ .../input/grid/container-min-height.html | 10 ++++++++ .../LibWeb/Layout/GridFormattingContext.cpp | 19 +++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 Tests/LibWeb/Layout/expected/grid/container-min-height.txt create mode 100644 Tests/LibWeb/Layout/input/grid/container-min-height.html diff --git a/Tests/LibWeb/Layout/expected/grid/container-min-height.txt b/Tests/LibWeb/Layout/expected/grid/container-min-height.txt new file mode 100644 index 0000000000..e9613a8e96 --- /dev/null +++ b/Tests/LibWeb/Layout/expected/grid/container-min-height.txt @@ -0,0 +1,23 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (1,1) content-size 798x220 [BFC] children: not-inline + BlockContainer at (10,10) content-size 780x202 children: not-inline + Box at (11,11) content-size 778x200 [GFC] children: not-inline + BlockContainer
at (12,12) content-size 776x98 [BFC] children: inline + line 0 width: 311.21875, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 35, rect: [12,12 311.21875x17.46875] + "Making Commerce Better for Everyone" + TextNode <#text> + BlockContainer
at (12,112) content-size 776x98 [BFC] children: inline + line 0 width: 311.21875, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 35, rect: [12,112 311.21875x17.46875] + "Making Commerce Better for Everyone" + TextNode <#text> + +ViewportPaintable (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x222] + PaintableWithLines (BlockContainer) [9,9 782x204] + PaintableBox (Box
.container) [10,10 780x202] + PaintableWithLines (BlockContainer
) [11,11 778x100] + TextPaintable (TextNode<#text>) + PaintableWithLines (BlockContainer
) [11,111 778x100] + TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/input/grid/container-min-height.html b/Tests/LibWeb/Layout/input/grid/container-min-height.html new file mode 100644 index 0000000000..c35416f6ab --- /dev/null +++ b/Tests/LibWeb/Layout/input/grid/container-min-height.html @@ -0,0 +1,10 @@ +
Making Commerce Better for Everyone
Making Commerce Better for Everyone
\ No newline at end of file diff --git a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp index 2b23cdb7c9..8f3532eb8a 100644 --- a/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/GridFormattingContext.cpp @@ -1803,6 +1803,25 @@ void GridFormattingContext::run(Box const& box, LayoutMode, AvailableSpace const determine_grid_container_height(); + auto const& containing_block_state = m_state.get(*grid_container().containing_block()); + auto height_of_containing_block = containing_block_state.content_height(); + auto min_height = grid_container().computed_values().min_height().to_px(grid_container(), height_of_containing_block); + + // If automatic grid container height is less than min-height, we need to re-run the track sizing algorithm + if (m_automatic_content_height < min_height) { + resolve_items_box_metrics(GridDimension::Row); + + AvailableSize width(available_space.width); + AvailableSize height(AvailableSize::make_definite(min_height)); + run_track_sizing(AvailableSpace(width, height), GridDimension::Row); + + resolve_items_box_metrics(GridDimension::Row); + + resolve_grid_item_heights(); + + determine_grid_container_height(); + } + if (available_space.height.is_intrinsic_sizing_constraint() || available_space.width.is_intrinsic_sizing_constraint()) { determine_intrinsic_size_of_grid_container(available_space); return;