@@ -2244,6 +2244,12 @@ void GridFormattingContext::resolve_grid_item_sizes(GridDimension dimension)
22442244 CSSPixels containing_block_size = containing_block_size_for_item (item, dimension);
22452245 Alignment alignment = alignment_for_item (item.box , dimension);
22462246
2247+ // https://drafts.csswg.org/css-grid-1/#grid-item-sizing
2248+ // A grid item is sized within the containing block defined by its grid area.
2249+ auto grid_area_constraints = grid_area_constraints_for_item (item);
2250+ if (dimension == GridDimension::Row)
2251+ grid_area_constraints.percentage_basis_height = containing_block_size;
2252+
22472253 auto const & preferred_size = item.preferred_size (dimension);
22482254
22492255 struct ItemAlignment {
@@ -2315,28 +2321,38 @@ void GridFormattingContext::resolve_grid_item_sizes(GridDimension dimension)
23152321 AvailableSize::make_definite (clamp_to_max_dimension_value (containing_block_size_for_item (item, GridDimension::Row)))
23162322 };
23172323
2318- auto calculate_inner_size = [this , &item, dimension, available_space](CSS ::Size const & size) {
2324+ auto calculate_inner_size = [this , &item, dimension, available_space, grid_area_constraints ](CSS ::Size const & size) {
23192325 if (dimension == GridDimension::Column)
2320- return calculate_inner_width (item.box , available_space.width , size, grid_area_constraints_for_item (item) );
2321- return calculate_inner_height (item.box , available_space, size, grid_area_constraints_for_item (item) );
2326+ return calculate_inner_width (item.box , available_space.width , size, grid_area_constraints );
2327+ return calculate_inner_height (item.box , available_space, size, grid_area_constraints );
23222328 };
23232329
2324- auto tentative_size_for_replaced_element = [this , &item, dimension, available_space](CSS ::Size const & size) {
2330+ auto tentative_size_for_replaced_element = [this , &item, dimension, available_space, grid_area_constraints ](CSS ::Size const & size) {
23252331 if (dimension == GridDimension::Column)
2326- return tentative_width_for_replaced_element (item.box , size, available_space, grid_area_constraints_for_item (item) );
2327- return tentative_height_for_replaced_element (item.box , size, available_space, grid_area_constraints_for_item (item) );
2332+ return tentative_width_for_replaced_element (item.box , size, available_space, grid_area_constraints );
2333+ return tentative_height_for_replaced_element (item.box , size, available_space, grid_area_constraints );
23282334 };
23292335
23302336 ItemAlignment used_alignment;
2331- auto hint = item.box .auto_content_box_size ();
2332- bool has_replaced_size_hint_in_this_axis = false ;
2337+ auto natural_size = item.box .auto_content_box_size ();
2338+ bool has_natural_size_in_relevant_axis = false ;
23332339 if (dimension == GridDimension::Column) {
2334- has_replaced_size_hint_in_this_axis = hint .has_width () || (hint .has_height () && item.box .has_preferred_aspect_ratio ());
2340+ has_natural_size_in_relevant_axis = natural_size .has_width () || (natural_size .has_height () && item.box .has_preferred_aspect_ratio ());
23352341 } else {
2336- has_replaced_size_hint_in_this_axis = hint .has_height () || (hint .has_width () && item.box .has_preferred_aspect_ratio ());
2342+ has_natural_size_in_relevant_axis = natural_size .has_height () || (natural_size .has_width () && item.box .has_preferred_aspect_ratio ());
23372343 }
23382344
2339- if (item.box .is_replaced_box () && has_replaced_size_hint_in_this_axis) {
2345+ auto use_replaced_sizing = item.box .is_replaced_box () && has_natural_size_in_relevant_axis;
2346+
2347+ // https://drafts.csswg.org/css-grid-1/#grid-item-sizing
2348+ // If the grid item has no preferred aspect ratio, and no natural size in the relevant axis (if it is a replaced
2349+ // element), the grid item is sized as for 'align-self: stretch'.
2350+ // INTEROP: Blink, WebKit, and Gecko instead use replaced sizing for normal-aligned replaced items. Match that
2351+ // behavior for leaf replaced boxes, while retaining our existing behavior for controls with children.
2352+ if (item.box .is_replaced_box () && alignment == Alignment::Normal && !item.box .is_replaced_box_with_children ())
2353+ use_replaced_sizing = true ;
2354+
2355+ if (use_replaced_sizing) {
23402356 auto tentative_size = tentative_size_for_replaced_element (preferred_size);
23412357 used_alignment = try_compute_size (tentative_size, item.preferred_size (dimension));
23422358 } else {
@@ -2372,14 +2388,14 @@ void GridFormattingContext::resolve_grid_item_sizes(GridDimension dimension)
23722388 } else if (preferred_size.is_auto () || preferred_size.is_fit_content ()) {
23732389 CSSPixels fit_content_size;
23742390 if (dimension == GridDimension::Column) {
2375- fit_content_size = calculate_fit_content_width (item.box , available_space, grid_area_constraints_for_item (item) );
2391+ fit_content_size = calculate_fit_content_width (item.box , available_space, grid_area_constraints );
23762392 } else if (preferred_size.is_auto () && item.box .has_preferred_aspect_ratio () && *item.box .preferred_aspect_ratio () != 0 && item.used_values .has_definite_width ()) {
23772393 // NB: When the item has a preferred aspect ratio and a definite width, resolve the
23782394 // height through the aspect ratio instead of using fit-content sizing, which would
23792395 // incorrectly use the available width (grid area width) instead of the item's width.
2380- fit_content_size = item. used_values . content_width () / * item.box . preferred_aspect_ratio ( );
2396+ fit_content_size = calculate_inner_height ( item.box , available_space, CSS::Size::make_auto (), grid_area_constraints );
23812397 } else {
2382- fit_content_size = calculate_fit_content_height (item.box , available_space, grid_area_constraints_for_item (item) );
2398+ fit_content_size = calculate_fit_content_height (item.box , available_space, grid_area_constraints );
23832399 }
23842400 used_alignment = try_compute_size (fit_content_size, preferred_size);
23852401 } else {
@@ -2388,7 +2404,7 @@ void GridFormattingContext::resolve_grid_item_sizes(GridDimension dimension)
23882404 }
23892405 }
23902406
2391- bool should_treat_maximum_size_as_none = dimension == GridDimension::Column ? should_treat_max_width_as_none (item.box , available_space.width , grid_area_constraints_for_item (item)) : should_treat_max_height_as_none (item.box , available_space.height , grid_area_constraints_for_item (item) );
2407+ bool should_treat_maximum_size_as_none = dimension == GridDimension::Column ? should_treat_max_width_as_none (item.box , available_space.width , grid_area_constraints) : should_treat_max_height_as_none (item.box , available_space.height , grid_area_constraints );
23922408 if (!should_treat_maximum_size_as_none) {
23932409 auto const & maximum_size = item.maximum_size (dimension);
23942410 auto max_size_px = calculate_inner_size (maximum_size);
0 commit comments