LibWeb: Resolve subgrid inline sizing before row contributions

When collecting row-axis contributions from subgrid descendants,
resolve the subgrid column metrics first so intrinsic height measurement
uses the correct inline size. This prevents text from being measured as
if it had no usable width, which inflated auto row sizes.
This commit is contained in:
Shannon Booth 2026-06-15 19:27:21 +02:00 committed by Alexander Kalenik
parent 8c06273dbf
commit 870aaa8a1f
3 changed files with 53 additions and 0 deletions

View file

@ -369,6 +369,14 @@ void GridFormattingContext::for_each_subgrid_item_contributing_to_track_sizing(G
subgrid_context.place_grid_items();
subgrid_context.initialize_grid_tracks_for_columns_and_rows();
subgrid_context.initialize_gap_tracks(*m_available_space);
if (dimension == GridDimension::Row) {
subgrid_context.resolve_items_box_metrics(GridDimension::Column);
subgrid_context.run_track_sizing(GridDimension::Column);
subgrid_context.resolve_items_box_metrics(GridDimension::Column);
subgrid_context.resolve_grid_item_sizes(GridDimension::Column);
}
subgrid_context.resolve_items_box_metrics(dimension);
subgrid_context.for_each_item_contributing_to_track_sizing(dimension, [&](GridItem const& item) {

View file

@ -0,0 +1,23 @@
Viewport <#document> at [0,0] [0+0+0 800 0+0+0] [0+0+0 600 0+0+0] [BFC] children: not-inline
BlockContainer <html> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] [BFC] children: not-inline
BlockContainer <body> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] children: not-inline
Box <div.outer> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] [GFC] children: not-inline
Box <div.subgrid> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] [GFC] children: not-inline
ImageBox <img> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] children: not-inline
(SVG-as-image isolated context)
Viewport <#document> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] [BFC] children: not-inline
SVGSVGBox <svg> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] [SVG] children: not-inline
SVGGeometryBox <rect> at [0,0] [0+0+0 800 0+0+0] [0+0+0 40 0+0+0] children: not-inline
BlockContainer <(anonymous)> at [0,40] [0+0+0 800 0+0+0] [0+0+0 0 0+0+0] children: inline
TextNode <#text> (not painted)
ViewportPaintable (Viewport<#document>) [0,0 800x600]
PaintableWithLines (BlockContainer<HTML>) [0,0 800x40]
PaintableWithLines (BlockContainer<BODY>) [0,0 800x40]
PaintableBox (Box<DIV>.outer) [0,0 800x40]
PaintableBox (Box<DIV>.subgrid) [0,0 800x40]
ImagePaintable (ImageBox<IMG>) [0,0 800x40]
PaintableWithLines (BlockContainer(anonymous)) [0,40 800x0]
SC for Viewport<#document> [0,0 800x600] (z-index: auto)
SC for BlockContainer<HTML> [0,0 800x40] (z-index: auto)

View file

@ -0,0 +1,22 @@
<!DOCTYPE html>
<style>
body {
margin: 0;
}
.outer {
display: grid;
outline: 2px solid red;
}
.subgrid {
display: grid;
grid-template-rows: subgrid;
}
img {
display: block;
width: 100%;
}
</style>
<div class="outer"><div class="subgrid"><img src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='800' height='40'><rect width='800' height='40' fill='green'/></svg>"></div></div>