@@ -742,35 +742,25 @@ void GridFormattingContext::resolve_intrinsic_track_sizes(GridDimension const di
742
742
if (track.min_track_sizing_function .is_auto () && available_size.is_intrinsic_sizing_constraint ()) {
743
743
// If the track has an auto min track sizing function and the grid container is being sized under a
744
744
// min-/max-content constraint, set the track’s base size to the maximum of its items’ limited
745
- // min-/max-content contributions (respectively), floored at zero. The limited min-/max-content
746
- // contribution of an item is (for this purpose) its min-/max-content contribution (accordingly),
747
- // limited by the max track sizing function (which could be the argument to a fit-content() track
748
- // sizing function) if that is fixed and ultimately floored by its minimum contribution (defined
749
- // below).
745
+ // min-/max-content contributions (respectively), floored at zero.
750
746
if (available_size.is_min_content ()) {
751
747
CSSPixels base_size = 0 ;
752
748
for (auto & item : grid_items_of_track) {
753
- base_size = max (base_size, calculate_min_content_contribution (item, dimension));
749
+ base_size = max (base_size, calculate_limited_min_content_contribution (item, dimension));
754
750
}
755
751
track.base_size = base_size;
756
752
} else if (available_size.is_max_content ()) {
757
753
CSSPixels base_size = 0 ;
758
754
for (auto & item : grid_items_of_track) {
759
- base_size = max (base_size, calculate_max_content_contribution (item, dimension));
755
+ base_size = max (base_size, calculate_limited_max_content_contribution (item, dimension));
760
756
}
761
757
track.base_size = base_size;
762
758
}
763
759
} else if (track.min_track_sizing_function .is_auto ()) {
764
- // Otherwise, set the track’s base size to the maximum of its items’ minimum contributions, floored
765
- // at zero. The minimum contribution of an item is the smallest outer size it can have.
766
- // Specifically, if the item’s computed preferred size behaves as auto or depends on the size of its
767
- // containing block in the relevant axis, its minimum contribution is the outer size that would
768
- // result from assuming the item’s used minimum size as its preferred size; else the item’s minimum
769
- // contribution is its min-content contribution. Because the minimum contribution often depends on
770
- // the size of the item’s content, it is considered a type of intrinsic size contribution.
760
+ // Otherwise, set the track’s base size to the maximum of its items’ minimum contributions, floored at zero.
771
761
CSSPixels base_size = 0 ;
772
762
for (auto & item : grid_items_of_track) {
773
- base_size = max (base_size, calculate_min_content_contribution (item, dimension));
763
+ base_size = max (base_size, calculate_minimum_contribution (item, dimension));
774
764
}
775
765
track.base_size = base_size;
776
766
}
@@ -1743,4 +1733,124 @@ CSSPixels GridFormattingContext::calculate_max_content_contribution(GridItem con
1743
1733
return preferred_size.to_px (grid_container (), containing_block_size);
1744
1734
}
1745
1735
1736
+ CSSPixels GridFormattingContext::calculate_limited_min_content_contribution (GridItem const & item, GridDimension const dimension) const
1737
+ {
1738
+ // The limited min-content contribution of an item is its min-content contribution,
1739
+ // limited by the max track sizing function (which could be the argument to a fit-content() track
1740
+ // sizing function) if that is fixed and ultimately floored by its minimum contribution.
1741
+ // FIXME: limit by max track sizing function
1742
+ auto min_content_contribution = calculate_min_content_contribution (item, dimension);
1743
+ auto minimum_contribution = calculate_minimum_contribution (item, dimension);
1744
+ if (min_content_contribution < minimum_contribution)
1745
+ return minimum_contribution;
1746
+ return min_content_contribution;
1747
+ }
1748
+
1749
+ CSSPixels GridFormattingContext::calculate_limited_max_content_contribution (GridItem const & item, GridDimension const dimension) const
1750
+ {
1751
+ // The limited max-content contribution of an item is its max-content contribution,
1752
+ // limited by the max track sizing function (which could be the argument to a fit-content() track
1753
+ // sizing function) if that is fixed and ultimately floored by its minimum contribution.
1754
+ // FIXME: limit by max track sizing function
1755
+ auto max_content_contribution = calculate_max_content_contribution (item, dimension);
1756
+ auto minimum_contribution = calculate_minimum_contribution (item, dimension);
1757
+ if (max_content_contribution < minimum_contribution)
1758
+ return minimum_contribution;
1759
+ return max_content_contribution;
1760
+ }
1761
+
1762
+ CSS::Size const & GridFormattingContext::get_item_minimum_size (GridItem const & item, GridDimension const dimension) const
1763
+ {
1764
+ if (dimension == GridDimension::Column)
1765
+ return item.box ().computed_values ().min_width ();
1766
+ return item.box ().computed_values ().min_height ();
1767
+ }
1768
+
1769
+ CSSPixels GridFormattingContext::content_size_suggestion (GridItem const & item, GridDimension const dimension) const
1770
+ {
1771
+ // The content size suggestion is the min-content size in the relevant axis
1772
+ // FIXME: clamped, if it has a preferred aspect ratio, by any definite opposite-axis minimum and maximum sizes
1773
+ // converted through the aspect ratio.
1774
+ return calculate_min_content_size (item, dimension);
1775
+ }
1776
+
1777
+ Optional<CSSPixels> GridFormattingContext::specified_size_suggestion (GridItem const & item, GridDimension const dimension) const
1778
+ {
1779
+ // https://www.w3.org/TR/css-grid-1/#specified-size-suggestion
1780
+ // If the item’s preferred size in the relevant axis is definite, then the specified size suggestion is that size.
1781
+ // It is otherwise undefined.
1782
+ auto const & used_values = m_state.get (item.box ());
1783
+ auto has_definite_preferred_size = dimension == GridDimension::Column ? used_values.has_definite_width () : used_values.has_definite_height ();
1784
+ if (has_definite_preferred_size) {
1785
+ // FIXME: consider margins, padding and borders because it is outer size.
1786
+ auto containing_block_size = containing_block_size_for_item (item, dimension);
1787
+ return item.box ().computed_values ().width ().to_px (item.box (), containing_block_size);
1788
+ }
1789
+
1790
+ return {};
1791
+ }
1792
+
1793
+ CSSPixels GridFormattingContext::content_based_minimum_size (GridItem const & item, GridDimension const dimension) const
1794
+ {
1795
+ // https://www.w3.org/TR/css-grid-1/#content-based-minimum-size
1796
+ // The content-based minimum size for a grid item in a given dimension is its specified size suggestion if it exists
1797
+ if (auto specified_size_suggestion = this ->specified_size_suggestion (item, dimension); specified_size_suggestion.has_value ()) {
1798
+ return specified_size_suggestion.value ();
1799
+ }
1800
+ // FIXME: otherwise its transferred size suggestion if that exists
1801
+ // else its content size suggestion
1802
+ return content_size_suggestion (item, dimension);
1803
+ }
1804
+
1805
+ CSSPixels GridFormattingContext::automatic_minimum_size (GridItem const & item, GridDimension const dimension) const
1806
+ {
1807
+ // To provide a more reasonable default minimum size for grid items, the used value of its automatic minimum size
1808
+ // in a given axis is the content-based minimum size if all of the following are true:
1809
+ // - it is not a scroll container
1810
+ // - it spans at least one track in that axis whose min track sizing function is auto
1811
+ // FIXME: - if it spans more than one track in that axis, none of those tracks are flexible
1812
+ auto const & tracks = dimension == GridDimension::Column ? m_grid_columns : m_grid_rows;
1813
+ auto item_track_index = [&] {
1814
+ if (dimension == GridDimension::Column)
1815
+ return item.gap_adjusted_column (grid_container ());
1816
+ return item.gap_adjusted_row (grid_container ());
1817
+ }();
1818
+
1819
+ // FIXME: Check all tracks spanned by an item
1820
+ auto item_spans_auto_tracks = tracks[item_track_index].min_track_sizing_function .is_auto ();
1821
+ if (item_spans_auto_tracks && !item.box ().is_scroll_container ()) {
1822
+ return content_based_minimum_size (item, dimension);
1823
+ }
1824
+
1825
+ // Otherwise, the automatic minimum size is zero, as usual.
1826
+ return 0 ;
1827
+ }
1828
+
1829
+ CSSPixels GridFormattingContext::calculate_minimum_contribution (GridItem const & item, GridDimension const dimension) const
1830
+ {
1831
+ // The minimum contribution of an item is the smallest outer size it can have.
1832
+ // Specifically, if the item’s computed preferred size behaves as auto or depends on the size of its
1833
+ // containing block in the relevant axis, its minimum contribution is the outer size that would
1834
+ // result from assuming the item’s used minimum size as its preferred size; else the item’s minimum
1835
+ // contribution is its min-content contribution. Because the minimum contribution often depends on
1836
+ // the size of the item’s content, it is considered a type of intrinsic size contribution.
1837
+
1838
+ auto preferred_size = get_item_preferred_size (item, dimension);
1839
+ auto should_treat_preferred_size_as_auto = [&] {
1840
+ if (dimension == GridDimension::Column)
1841
+ return should_treat_width_as_auto (item.box (), get_available_space_for_item (item));
1842
+ return should_treat_height_as_auto (item.box (), get_available_space_for_item (item));
1843
+ }();
1844
+
1845
+ if (should_treat_preferred_size_as_auto) {
1846
+ auto minimum_size = get_item_minimum_size (item, dimension);
1847
+ if (minimum_size.is_auto ())
1848
+ return automatic_minimum_size (item, dimension);
1849
+ auto containing_block_size = containing_block_size_for_item (item, dimension);
1850
+ return minimum_size.to_px (grid_container (), containing_block_size);
1851
+ }
1852
+
1853
+ return calculate_min_content_contribution (item, dimension);
1854
+ }
1855
+
1746
1856
}
0 commit comments