Changeset 192154 in webkit


Ignore:
Timestamp:
Nov 9, 2015 4:56:43 AM (8 years ago)
Author:
svillar@igalia.com
Message:

[css-grid] Improve grid container sizing with size constraints and intrinsic sizes
https://bugs.webkit.org/show_bug.cgi?id=150679

Reviewed by Darin Adler.

Source/WebCore:

The grid container stores from now on its min-content and
max-content block sizes in order to be able to properly
compute its intrinsic size. It has to redefine
computeIntrinsicLogicalContentHeightUsing() because the
behavior of grid is different to "normal" blocks:

  • the min-content size is the sum of the grid container's

track sizes in the appropiate axis when the grid is sized
under a min-content constraint.

  • the max-content size is the sum of the grid container's

track sizes in the appropiate axis when the grid is sized
under a max-content constraint.

  • the auto block size is the max-content size.

A nice side effect is that we can now properly detect whether
the grid has a definite size on a given axis or not.

Tests: fast/css-grid-layout/absolute-positioning-definite-sizes.html

fast/css-grid-layout/flex-and-intrinsic-sizes.html
fast/css-grid-layout/maximize-tracks-definite-indefinite-height.html
fast/css-grid-layout/maximize-tracks-definite-indefinite-width.html

  • rendering/RenderBox.h: made

computeIntrinsicLogicalContentHeightUsing() virtual.

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::GridSizingData::GridSizingData):
(WebCore::RenderGrid::GridSizingData::freeSpaceForDirection):
(WebCore::RenderGrid::GridSizingData::setFreeSpaceForDirection):
(WebCore::RenderGrid::computeTrackBasedLogicalHeight):
(WebCore::RenderGrid::computeTrackSizesForDirection):
(WebCore::RenderGrid::layoutBlock):
(WebCore::RenderGrid::computeIntrinsicLogicalWidths):
(WebCore::RenderGrid::computeIntrinsicLogicalHeight):
(WebCore::RenderGrid::computeIntrinsicLogicalContentHeightUsing):
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::distributeSpaceToTracks):
(WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth):
(WebCore::RenderGrid::applyStretchAlignmentToTracksIfNeeded):
(WebCore::RenderGrid::layoutGridItems):
(WebCore::RenderGrid::populateGridPositions):
(WebCore::RenderGrid::gridElementIsShrinkToFit): Deleted.

  • rendering/RenderGrid.h:

LayoutTests:

  • fast/css-grid-layout/absolute-positioning-definite-sizes-expected.txt: Added.
  • fast/css-grid-layout/absolute-positioning-definite-sizes.html: Added.
  • fast/css-grid-layout/flex-and-intrinsic-sizes-expected.txt: Added.
  • fast/css-grid-layout/flex-and-intrinsic-sizes.html: Added.
  • fast/css-grid-layout/grid-element-change-columns-repaint.html:
  • fast/css-grid-layout/grid-item-change-column-repaint.html:
  • fast/css-grid-layout/grid-preferred-logical-widths.html:
  • fast/css-grid-layout/maximize-tracks-definite-indefinite-height-expected.txt: Added.
  • fast/css-grid-layout/maximize-tracks-definite-indefinite-height.html: Added.
  • fast/css-grid-layout/maximize-tracks-definite-indefinite-width-expected.txt: Added.
  • fast/css-grid-layout/maximize-tracks-definite-indefinite-width.html: Added.
  • fast/css-grid-layout/percent-of-indefinite-track-size.html:
  • fast/events/key-events-in-editable-gridbox-expected.txt:
  • fast/events/key-events-in-editable-gridbox.html: Added more test

cases for intrinsic and fixed sized heights.

Location:
trunk
Files:
8 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r192153 r192154  
     12015-11-02  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [css-grid] Improve grid container sizing with size constraints and intrinsic sizes
     4        https://bugs.webkit.org/show_bug.cgi?id=150679
     5
     6        Reviewed by Darin Adler.
     7
     8        * fast/css-grid-layout/absolute-positioning-definite-sizes-expected.txt: Added.
     9        * fast/css-grid-layout/absolute-positioning-definite-sizes.html: Added.
     10        * fast/css-grid-layout/flex-and-intrinsic-sizes-expected.txt: Added.
     11        * fast/css-grid-layout/flex-and-intrinsic-sizes.html: Added.
     12        * fast/css-grid-layout/grid-element-change-columns-repaint.html:
     13        * fast/css-grid-layout/grid-item-change-column-repaint.html:
     14        * fast/css-grid-layout/grid-preferred-logical-widths.html:
     15        * fast/css-grid-layout/maximize-tracks-definite-indefinite-height-expected.txt: Added.
     16        * fast/css-grid-layout/maximize-tracks-definite-indefinite-height.html: Added.
     17        * fast/css-grid-layout/maximize-tracks-definite-indefinite-width-expected.txt: Added.
     18        * fast/css-grid-layout/maximize-tracks-definite-indefinite-width.html: Added.
     19        * fast/css-grid-layout/percent-of-indefinite-track-size.html:
     20        * fast/events/key-events-in-editable-gridbox-expected.txt:
     21        * fast/events/key-events-in-editable-gridbox.html: Added more test
     22        cases for intrinsic and fixed sized heights.
     23
    1242015-11-05  Sergio Villar Senin  <svillar@igalia.com>
    225
  • trunk/LayoutTests/fast/css-grid-layout/grid-element-change-columns-repaint.html

    r168416 r192154  
    1717
    1818.grid {
    19     width: -webkit-fit-content;
     19    width: -webkit-min-content;
    2020    -webkit-grid-template-rows: 50px;
    2121    -webkit-grid-template-columns: minmax(100px, 180px) 100px minmax(50px, 100px);
  • trunk/LayoutTests/fast/css-grid-layout/grid-item-change-column-repaint.html

    r168416 r192154  
    1717
    1818.grid {
    19     width: -webkit-fit-content;
     19    width: -webkit-min-content;
    2020    -webkit-grid-template-rows: 50px;
    2121    -webkit-grid-template-columns: minmax(100px, 180px) 100px minmax(50px, 100px);
  • trunk/LayoutTests/fast/css-grid-layout/grid-preferred-logical-widths.html

    r189166 r192154  
    4444}
    4545
    46 .dummyContainer { }
    47 
    4846.minWidth70 {
    4947    min-width: 70px;
     
    5755</head>
    5856<script src="../../resources/check-layout.js"></script>
    59 <body onload="checkLayout('.dummyContainer')">
     57<body onload="checkLayout('.grid')">
    6058<body>
    6159<p>This test checks that the grid element's preferred logical widths are properly computed with different combinations of minmax().</p>
    62 <div class="dummyContainer">
    63     <div class="grid gridMinContentFixed min-content" data-expected-height="10" data-expected-width="40">
    64         <div class="firstRowFirstColumn">XX XX XX</div>
    65         <div class="firstRowSecondColumn">XX XX XX</div>
    66     </div>
    67 </div>
    68 
    69 <div class="dummyContainer">
    70     <div class="grid gridMinContentFixed max-content" data-expected-height="10" data-expected-width="80">
    71         <div class="firstRowFirstColumn">XX XX XX</div>
    72         <div class="firstRowSecondColumn">XX XX XX</div>
    73     </div>
    74 </div>
    75 
    76 <div class="dummyContainer">
    77     <div class="grid gridFixedMinContent min-content" data-expected-height="10" data-expected-width="60">
    78         <div class="firstRowFirstColumn">XXXXX XXXXX</div>
    79         <div class="firstRowSecondColumn">XXXXX XXXXX</div>
    80     </div>
    81 </div>
    82 
    83 <div class="dummyContainer">
    84     <div class="grid gridFixedMinContent max-content" data-expected-height="10" data-expected-width="100">
    85         <div class="firstRowFirstColumn">XXXXX XXXXX</div>
    86         <div class="firstRowSecondColumn">XXXXX XXXXX</div>
    87     </div>
    88 </div>
    89 
    90 <div class="dummyContainer">
    91     <div class="grid gridFixedMaxContent min-content" data-expected-height="10" data-expected-width="80">
    92         <div class="firstRowFirstColumn">XX XX XX</div>
    93         <div class="firstRowSecondColumn">XX XX XX</div>
    94     </div>
    95 </div>
    96 
    97 <div class="dummyContainer">
    98     <div class="grid gridFixedMaxContent max-content" data-expected-height="10" data-expected-width="160">
    99         <div class="firstRowFirstColumn">XX XX XX</div>
    100         <div class="firstRowSecondColumn">XX XX XX</div>
    101     </div>
    102 </div>
    103 
    104 <div class="dummyContainer">
    105     <div class="grid gridFixedFixed min-content" data-expected-height="10" data-expected-width="60"></div>
    106 </div>
    107 
    108 <div class="dummyContainer">
    109     <div class="grid gridFixedFixed max-content" data-expected-height="10" data-expected-width="80"></div>
    110 </div>
    111 
    112 <div class="dummyContainer">
    113     <div class="grid gridAutoContent min-content" data-expected-height="10" data-expected-width="40">
    114         <div class="firstRowFirstColumn">XX XX XX</div>
    115         <div class="firstRowSecondColumn">XX XX XX</div>
    116     </div>
    117 </div>
    118 
    119 <div class="dummyContainer">
    120     <div class="grid gridAutoContent max-content" data-expected-height="10" data-expected-width="160">
    121         <div class="firstRowFirstColumn">XX XX XX</div>
    122         <div class="firstRowSecondColumn">XX XX XX</div>
    123     </div>
    124 </div>
    125 
    126 <div class="dummyContainer">
    127     <div class="grid gridFixedFraction min-content" data-expected-height="10" data-expected-width="10"></div>
    128 </div>
    129 
    130 <div class="dummyContainer">
    131     <div class="grid gridFixedFraction max-content" data-expected-height="10" data-expected-width="30"></div>
    132 </div>
     60<div class="grid gridMinContentFixed min-content" data-expected-height="10" data-expected-width="40">
     61    <div class="firstRowFirstColumn">XX XX XX</div>
     62    <div class="firstRowSecondColumn">XX XX XX</div>
     63</div>
     64
     65<div class="grid gridMinContentFixed max-content" data-expected-height="10" data-expected-width="80">
     66    <div class="firstRowFirstColumn">XX XX XX</div>
     67    <div class="firstRowSecondColumn">XX XX XX</div>
     68</div>
     69
     70<div class="grid gridFixedMinContent min-content" data-expected-height="10" data-expected-width="60">
     71    <div class="firstRowFirstColumn">XXXXX XXXXX</div>
     72    <div class="firstRowSecondColumn">XXXXX XXXXX</div>
     73</div>
     74
     75<div class="grid gridFixedMinContent max-content" data-expected-height="10" data-expected-width="100">
     76    <div class="firstRowFirstColumn">XXXXX XXXXX</div>
     77    <div class="firstRowSecondColumn">XXXXX XXXXX</div>
     78</div>
     79
     80<div class="grid gridFixedMaxContent min-content" data-expected-height="10" data-expected-width="80">
     81    <div class="firstRowFirstColumn">XX XX XX</div>
     82    <div class="firstRowSecondColumn">XX XX XX</div>
     83</div>
     84
     85<div class="grid gridFixedMaxContent max-content" data-expected-height="10" data-expected-width="160">
     86    <div class="firstRowFirstColumn">XX XX XX</div>
     87    <div class="firstRowSecondColumn">XX XX XX</div>
     88</div>
     89
     90<div class="grid gridFixedFixed min-content" data-expected-height="10" data-expected-width="60"></div>
     91
     92<div class="grid gridFixedFixed max-content" data-expected-height="10" data-expected-width="80"></div>
     93
     94<div class="grid gridAutoContent min-content" data-expected-height="10" data-expected-width="40">
     95    <div class="firstRowFirstColumn">XX XX XX</div>
     96    <div class="firstRowSecondColumn">XX XX XX</div>
     97</div>
     98
     99<div class="grid gridAutoContent max-content" data-expected-height="10" data-expected-width="160">
     100    <div class="firstRowFirstColumn">XX XX XX</div>
     101    <div class="firstRowSecondColumn">XX XX XX</div>
     102</div>
     103
     104<div class="grid gridFixedFraction min-content" data-expected-height="10" data-expected-width="10"></div>
     105
     106<div class="grid gridFixedFraction max-content" data-expected-height="10" data-expected-width="30"></div>
    133107<!-- Now with margin on one of the grid items. -->
    134 <div class="dummyContainer">
    135     <div class="grid gridMinContentFixed min-content" data-expected-height="10" data-expected-width="100">
    136         <div class="firstRowFirstColumn">XX XX XX</div>
    137         <div class="firstRowSecondColumn margins">XX XX XX</div>
    138     </div>
    139 </div>
    140 
    141 <div class="dummyContainer">
    142     <div class="grid gridMinContentFixed max-content" data-expected-height="10" data-expected-width="120">
    143         <div class="firstRowFirstColumn margins">XX XX XX</div>
    144         <div class="firstRowSecondColumn">XX XX XX</div>
    145     </div>
    146 </div>
    147 
    148 <div class="dummyContainer">
    149     <div class="grid gridFixedMinContent min-content" data-expected-height="10" data-expected-width="60">
    150         <div class="firstRowFirstColumn">XXXXX XXXXX</div>
    151         <div class="firstRowSecondColumn margins">XXXXX XXXXX</div>
    152     </div>
    153 </div>
    154 
    155 <div class="dummyContainer">
    156     <div class="grid gridFixedMinContent max-content" data-expected-height="10" data-expected-width="160">
    157         <div class="firstRowFirstColumn margins">XXXXX XXXXX</div>
    158         <div class="firstRowSecondColumn">XXXXX XXXXX</div>
    159     </div>
    160 </div>
    161 
    162 <div class="dummyContainer">
    163     <div class="grid gridFixedMaxContent min-content" data-expected-height="10" data-expected-width="80">
    164         <div class="firstRowFirstColumn">XX XX XX</div>
    165         <div class="firstRowSecondColumn margins">XX XX XX</div>
    166     </div>
    167 </div>
    168 
    169 <div class="dummyContainer">
    170     <div class="grid gridFixedMaxContent max-content" data-expected-height="10" data-expected-width="220">
    171         <div class="firstRowFirstColumn margins">XX XX XX</div>
    172         <div class="firstRowSecondColumn">XX XX XX</div>
    173     </div>
     108<div class="grid gridMinContentFixed min-content" data-expected-height="10" data-expected-width="100">
     109    <div class="firstRowFirstColumn">XX XX XX</div>
     110    <div class="firstRowSecondColumn margins">XX XX XX</div>
     111</div>
     112
     113<div class="grid gridMinContentFixed max-content" data-expected-height="10" data-expected-width="120">
     114    <div class="firstRowFirstColumn margins">XX XX XX</div>
     115    <div class="firstRowSecondColumn">XX XX XX</div>
     116</div>
     117
     118<div class="grid gridFixedMinContent min-content" data-expected-height="10" data-expected-width="60">
     119    <div class="firstRowFirstColumn">XXXXX XXXXX</div>
     120    <div class="firstRowSecondColumn margins">XXXXX XXXXX</div>
     121</div>
     122
     123<div class="grid gridFixedMinContent max-content" data-expected-height="10" data-expected-width="160">
     124    <div class="firstRowFirstColumn margins">XXXXX XXXXX</div>
     125    <div class="firstRowSecondColumn">XXXXX XXXXX</div>
     126</div>
     127
     128<div class="grid gridFixedMaxContent min-content" data-expected-height="10" data-expected-width="80">
     129    <div class="firstRowFirstColumn">XX XX XX</div>
     130    <div class="firstRowSecondColumn margins">XX XX XX</div>
     131</div>
     132
     133<div class="grid gridFixedMaxContent max-content" data-expected-height="10" data-expected-width="220">
     134    <div class="firstRowFirstColumn margins">XX XX XX</div>
     135    <div class="firstRowSecondColumn">XX XX XX</div>
    174136</div>
    175137
    176138<!-- Spanning cells -->
    177 <div class="dummyContainer">
    178     <div class="grid gridMinContentFixed min-content" data-expected-height="10" data-expected-width="20">
    179         <div class="firstRowBothColumn">XX XX XX</div>
    180     </div>
    181 </div>
    182 
    183 <div class="dummyContainer">
    184     <div class="grid gridFixedMinContent max-content" data-expected-height="10" data-expected-width="80">
    185         <div class="firstRowBothColumn">XXXXX XXXXX</div>
    186         <div class="firstRowSecondColumn">XXXXX XXXXX</div>
    187     </div>
    188 </div>
    189 
    190 <div class="dummyContainer">
    191     <div class="grid gridFixedMaxContent max-content" data-expected-height="10" data-expected-width="80">
    192         <div class="firstRowBothColumn">XX XX XX</div>
    193         <div class="firstRowBothColumn">XX XX XX</div>
    194     </div>
    195 </div>
    196 
    197 <div class="dummyContainer">
    198     <div class="grid gridAutoContent min-content" data-expected-height="10" data-expected-width="20">
    199         <div class="firstRowFirstColumn">XX XX XX</div>
    200         <div class="firstRowBothColumn">XX XX XX</div>
    201     </div>
    202 </div>
    203 
    204 <div class="dummyContainer">
    205     <div class="grid gridAutoContent max-content" data-expected-height="10" data-expected-width="80">
    206         <div class="firstRowBothColumn">XX XX XX</div>
    207         <div class="firstRowSecondColumn">XX XX XX</div>
    208     </div>
     139<div class="grid gridMinContentFixed min-content" data-expected-height="10" data-expected-width="20">
     140    <div class="firstRowBothColumn">XX XX XX</div>
     141</div>
     142
     143<div class="grid gridFixedMinContent max-content" data-expected-height="10" data-expected-width="80">
     144    <div class="firstRowBothColumn">XXXXX XXXXX</div>
     145    <div class="firstRowSecondColumn">XXXXX XXXXX</div>
     146</div>
     147
     148<div class="grid gridFixedMaxContent max-content" data-expected-height="10" data-expected-width="80">
     149    <div class="firstRowBothColumn">XX XX XX</div>
     150    <div class="firstRowBothColumn">XX XX XX</div>
     151</div>
     152
     153<div class="grid gridAutoContent min-content" data-expected-height="10" data-expected-width="20">
     154    <div class="firstRowFirstColumn">XX XX XX</div>
     155    <div class="firstRowBothColumn">XX XX XX</div>
     156</div>
     157
     158<div class="grid gridAutoContent max-content" data-expected-height="10" data-expected-width="80">
     159    <div class="firstRowBothColumn">XX XX XX</div>
     160    <div class="firstRowSecondColumn">XX XX XX</div>
    209161</div>
    210162
    211163<!-- Grids under min-width / max-width constraints -->
    212 <div class="dummyContainer min-content" data-expected-height="10" data-expected-width="70">
    213     <div class="grid gridMinContentFixed minWidth70" data-expected-height="10" data-expected-width="70">
    214         <div class="firstRowFirstColumn">XX XX XX</div>
    215         <div class="firstRowSecondColumn">XX XX XX</div>
    216     </div>
    217 </div>
    218 
    219 <div class="dummyContainer max-content" data-expected-height="10" data-expected-width="20">
    220     <div class="grid gridMinContentFixed maxWidth20" data-expected-height="10" data-expected-width="20">
    221         <div class="firstRowFirstColumn">XX XX XX</div>
    222         <div class="firstRowSecondColumn">XX XX XX</div>
    223     </div>
    224 </div>
    225 
    226 <div class="dummyContainer min-content" data-expected-height="10" data-expected-width="70">
    227     <div class="grid gridFixedMinContent minWidth70" data-expected-height="10" data-expected-width="70">
    228         <div class="firstRowFirstColumn">XXXXX XXXXX</div>
    229         <div class="firstRowSecondColumn">XXXXX XXXXX</div>
    230     </div>
    231 </div>
    232 
    233 <div class="dummyContainer max-content" data-expected-height="10" data-expected-width="20">
    234     <div class="grid gridFixedMinContent maxWidth20" data-expected-height="10" data-expected-width="20">
    235         <div class="firstRowFirstColumn">XXXXX XXXXX</div>
    236         <div class="firstRowSecondColumn">XXXXX XXXXX</div>
    237     </div>
    238 </div>
    239 
    240 <div class="dummyContainer min-content" data-expected-height="10" data-expected-width="80">
    241     <div class="grid gridFixedMaxContent minWidth70" data-expected-height="10" data-expected-width="80">
    242         <div class="firstRowFirstColumn">XX XX XX</div>
    243         <div class="firstRowSecondColumn">XX XX XX</div>
    244     </div>
    245 </div>
    246 
    247 <div class="dummyContainer max-content" data-expected-height="10" data-expected-width="20">
    248     <div class="grid gridFixedMaxContent maxWidth20" data-expected-height="10" data-expected-width="20">
    249         <div class="firstRowFirstColumn">XX XX XX</div>
    250         <div class="firstRowSecondColumn">XX XX XX</div>
    251     </div>
    252 </div>
    253 
    254 <div class="dummyContainer min-content" data-expected-height="10" data-expected-width="70">
    255     <div class="grid gridFixedFixed minWidth70" data-expected-height="10" data-expected-width="70"></div>
    256 </div>
    257 
    258 <div class="dummyContainer max-content" data-expected-height="10" data-expected-width="20">
    259     <div class="grid gridFixedFixed maxWidth20" data-expected-height="10" data-expected-width="20"></div>
    260 </div>
    261 
    262 <div class="dummyContainer min-content" data-expected-height="10" data-expected-width="70">
    263     <div class="grid gridAutoContent minWidth70" data-expected-height="10" data-expected-width="70">
    264         <div class="firstRowFirstColumn">XX XX XX</div>
    265         <div class="firstRowSecondColumn">XX XX XX</div>
    266     </div>
    267 </div>
    268 
    269 <div class="dummyContainer max-content" data-expected-height="10" data-expected-width="20">
    270     <div class="grid gridAutoContent maxWidth20" data-expected-height="10" data-expected-width="20">
    271         <div class="firstRowFirstColumn">XX XX XX</div>
    272         <div class="firstRowSecondColumn">XX XX XX</div>
    273     </div>
    274 </div>
    275 
    276 <div class="dummyContainer min-content" data-expected-height="10" data-expected-width="70">
    277     <div class="grid gridFixedFraction minWidth70" data-expected-height="10" data-expected-width="70"></div>
    278 </div>
    279 
    280 <div class="dummyContainer max-content" data-expected-height="10" data-expected-width="20">
    281     <div class="grid gridFixedFraction maxWidth20" data-expected-height="10" data-expected-width="20"></div>
    282 </div>
     164<div class="min-content grid gridMinContentFixed minWidth70" data-expected-height="10" data-expected-width="70">
     165    <div class="firstRowFirstColumn">XX XX XX</div>
     166    <div class="firstRowSecondColumn">XX XX XX</div>
     167</div>
     168
     169<div class="max-content grid gridMinContentFixed maxWidth20" data-expected-height="10" data-expected-width="20">
     170    <div class="firstRowFirstColumn">XX XX XX</div>
     171    <div class="firstRowSecondColumn">XX XX XX</div>
     172</div>
     173
     174<div class="min-content grid gridFixedMinContent minWidth70" data-expected-height="10" data-expected-width="70">
     175    <div class="firstRowFirstColumn">XXXXX XXXXX</div>
     176    <div class="firstRowSecondColumn">XXXXX XXXXX</div>
     177</div>
     178
     179<div class="max-content grid gridFixedMinContent maxWidth20" data-expected-height="10" data-expected-width="20">
     180    <div class="firstRowFirstColumn">XXXXX XXXXX</div>
     181    <div class="firstRowSecondColumn">XXXXX XXXXX</div>
     182</div>
     183
     184<div class="min-content grid gridFixedMaxContent minWidth70" data-expected-height="10" data-expected-width="80">
     185    <div class="firstRowFirstColumn">XX XX XX</div>
     186    <div class="firstRowSecondColumn">XX XX XX</div>
     187</div>
     188
     189<div class="max-content grid gridFixedMaxContent maxWidth20" data-expected-height="10" data-expected-width="20">
     190    <div class="firstRowFirstColumn">XX XX XX</div>
     191    <div class="firstRowSecondColumn">XX XX XX</div>
     192</div>
     193
     194<div class="min-content grid gridFixedFixed minWidth70" data-expected-height="10" data-expected-width="70"></div>
     195
     196<div class="max-content grid gridFixedFixed maxWidth20" data-expected-height="10" data-expected-width="20"></div>
     197
     198<div class="min-content grid gridAutoContent minWidth70" data-expected-height="10" data-expected-width="70">
     199    <div class="firstRowFirstColumn">XX XX XX</div>
     200    <div class="firstRowSecondColumn">XX XX XX</div>
     201</div>
     202
     203<div class="max-content grid gridAutoContent maxWidth20" data-expected-height="10" data-expected-width="20">
     204    <div class="firstRowFirstColumn">XX XX XX</div>
     205    <div class="firstRowSecondColumn">XX XX XX</div>
     206</div>
     207
     208<div class="min-content grid gridFixedFraction minWidth70" data-expected-height="10" data-expected-width="70"></div>
     209
     210<div class="max-content grid gridFixedFraction maxWidth20" data-expected-height="10" data-expected-width="20"></div>
    283211
    284212</body>
  • trunk/LayoutTests/fast/css-grid-layout/percent-of-indefinite-track-size.html

    r178642 r192154  
    44.indefiniteSizeGrid {
    55    font: 10px/1 Ahem;
     6    width: -webkit-min-content;
    67}
    78.gridWithPercent {
  • trunk/LayoutTests/fast/events/key-events-in-editable-gridbox-expected.txt

    r180050 r192154  
     1PASS targetDiv.innerText is "TEST"
     2PASS targetDiv.innerText is ""
     3PASS targetDiv.innerText is "TEST"
     4PASS targetDiv.innerText is "TEST"
     5PASS targetDiv.innerText is ""
     6PASS targetDiv.innerText is "TEST"
    17PASS targetDiv.innerText is "TEST"
    28PASS targetDiv.innerText is ""
     
    612TEST COMPLETE
    713TEST
     14TEST
     15TEST
  • trunk/LayoutTests/fast/events/key-events-in-editable-gridbox.html

    r180050 r192154  
    44<script src="../../resources/js-test.js"></script>
    55<style>
    6     #target {
    7         display: -webkit-grid;
    8     }
     6.grid { display: -webkit-grid; }
     7.intrinsicSize { height: -webkit-min-content; }
     8.fixedSize { height: 1px; }
    99</style>
     10
     11<div id="targetAuto" class="grid" contentEditable>T</div>
     12<div id="targetFixed" class="grid fixedSize" contentEditable>T</div>
     13<div id="targetIntrinsic" class="grid intrinsicSize" contentEditable>T</div>
     14
    1015<script>
    11     var targetDiv;
    12     function test()
    13     {
    14         targetDiv = document.getElementById('target');
    15         targetDiv.focus();
     16var targetDiv;
     17function test(id)
     18{
     19    targetDiv = document.getElementById(id);
     20    targetDiv.focus();
    1621
    17         // Move cursor to the end of line.
    18         getSelection().modify('move', 'forward', 'lineboundary');
     22    // Move cursor to the end of line.
     23    getSelection().modify('move', 'forward', 'lineboundary');
    1924
    20         document.execCommand("insertText", false, "EST");
    21         shouldBeEqualToString("targetDiv.innerText", "TEST");
     25    document.execCommand("insertText", false, "EST");
     26    shouldBeEqualToString("targetDiv.innerText", "TEST");
    2227
    23         document.execCommand("delete");
    24         document.execCommand("delete");
    25         document.execCommand("delete");
    26         document.execCommand("delete");
    27         document.execCommand("delete"); // Remove '\n'
    28         shouldBeEmptyString("targetDiv.innerText");
     28    document.execCommand("delete");
     29    document.execCommand("delete");
     30    document.execCommand("delete");
     31    document.execCommand("delete");
     32    document.execCommand("delete"); // Remove '\n'
     33    shouldBeEmptyString("targetDiv.innerText");
    2934
    30         document.execCommand("insertText", false, "TEST");
    31         shouldBeEqualToString("targetDiv.innerText", "TEST");
    32     }
     35    document.execCommand("insertText", false, "TEST");
     36    shouldBeEqualToString("targetDiv.innerText", "TEST");
     37}
     38test("targetAuto");
     39test("targetFixed");
     40test("targetIntrinsic");
    3341</script>
    34 </head>
    35 <body onload="test()">
    36 <div id="target" contentEditable>T</div>
    37 </body>
    38 </html>
  • trunk/Source/WebCore/ChangeLog

    r192153 r192154  
     12015-11-02  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [css-grid] Improve grid container sizing with size constraints and intrinsic sizes
     4        https://bugs.webkit.org/show_bug.cgi?id=150679
     5
     6        Reviewed by Darin Adler.
     7
     8        The grid container stores from now on its min-content and
     9        max-content block sizes in order to be able to properly
     10        compute its intrinsic size. It has to redefine
     11        computeIntrinsicLogicalContentHeightUsing() because the
     12        behavior of grid is different to "normal" blocks:
     13
     14        - the min-content size is the sum of the grid container's
     15        track sizes in the appropiate axis when the grid is sized
     16        under a min-content constraint.
     17        - the max-content size is the sum of the grid container's
     18        track sizes in the appropiate axis when the grid is sized
     19        under a max-content constraint.
     20        - the auto block size is the max-content size.
     21
     22        A nice side effect is that we can now properly detect whether
     23        the grid has a definite size on a given axis or not.
     24
     25        Tests: fast/css-grid-layout/absolute-positioning-definite-sizes.html
     26               fast/css-grid-layout/flex-and-intrinsic-sizes.html
     27               fast/css-grid-layout/maximize-tracks-definite-indefinite-height.html
     28               fast/css-grid-layout/maximize-tracks-definite-indefinite-width.html
     29
     30        * rendering/RenderBox.h: made
     31        computeIntrinsicLogicalContentHeightUsing() virtual.
     32        * rendering/RenderGrid.cpp:
     33        (WebCore::RenderGrid::GridSizingData::GridSizingData):
     34        (WebCore::RenderGrid::GridSizingData::freeSpaceForDirection):
     35        (WebCore::RenderGrid::GridSizingData::setFreeSpaceForDirection):
     36        (WebCore::RenderGrid::computeTrackBasedLogicalHeight):
     37        (WebCore::RenderGrid::computeTrackSizesForDirection):
     38        (WebCore::RenderGrid::layoutBlock):
     39        (WebCore::RenderGrid::computeIntrinsicLogicalWidths):
     40        (WebCore::RenderGrid::computeIntrinsicLogicalHeight):
     41        (WebCore::RenderGrid::computeIntrinsicLogicalContentHeightUsing):
     42        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
     43        (WebCore::RenderGrid::distributeSpaceToTracks):
     44        (WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth):
     45        (WebCore::RenderGrid::applyStretchAlignmentToTracksIfNeeded):
     46        (WebCore::RenderGrid::layoutGridItems):
     47        (WebCore::RenderGrid::populateGridPositions):
     48        (WebCore::RenderGrid::gridElementIsShrinkToFit): Deleted.
     49        * rendering/RenderGrid.h:
     50
    1512015-11-05  Sergio Villar Senin  <svillar@igalia.com>
    252
  • trunk/Source/WebCore/rendering/RenderBox.h

    r192054 r192154  
    653653
    654654    LayoutUnit computeIntrinsicLogicalWidthUsing(Length logicalWidthLength, LayoutUnit availableLogicalWidth, LayoutUnit borderAndPadding) const;
    655     Optional<LayoutUnit> computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, Optional<LayoutUnit> intrinsicContentHeight, LayoutUnit borderAndPadding) const;
     655    virtual Optional<LayoutUnit> computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, Optional<LayoutUnit> intrinsicContentHeight, LayoutUnit borderAndPadding) const;
    656656   
    657657    virtual bool shouldComputeSizeAsReplaced() const { return isReplaced() && !isInlineBlockOrInlineTable(); }
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r192054 r192154  
    211211    WTF_MAKE_NONCOPYABLE(GridSizingData);
    212212public:
    213     GridSizingData(unsigned gridColumnCount, unsigned gridRowCount, LayoutUnit freeSpaceForColumns, LayoutUnit freeSpaceForRows)
     213    GridSizingData(unsigned gridColumnCount, unsigned gridRowCount)
    214214        : columnTracks(gridColumnCount)
    215215        , rowTracks(gridRowCount)
    216         , freeSpaceForColumns(freeSpaceForColumns)
    217         , freeSpaceForRows(freeSpaceForRows)
    218216    {
    219217    }
     
    228226    Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
    229227
    230     LayoutUnit& freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
     228    Optional<LayoutUnit> freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
     229    void setFreeSpaceForDirection(GridTrackSizingDirection, Optional<LayoutUnit> freeSpace);
    231230
    232231private:
    233     LayoutUnit freeSpaceForColumns;
    234     LayoutUnit freeSpaceForRows;
     232    Optional<LayoutUnit> freeSpaceForColumns;
     233    Optional<LayoutUnit> freeSpaceForRows;
    235234};
     235
     236void RenderGrid::GridSizingData::setFreeSpaceForDirection(GridTrackSizingDirection direction, Optional<LayoutUnit> freeSpace)
     237{
     238    if (direction == ForColumns)
     239        freeSpaceForColumns = freeSpace;
     240    else
     241        freeSpaceForRows = freeSpace;
     242}
    236243
    237244RenderGrid::RenderGrid(Element& element, Ref<RenderStyle>&& style)
     
    294301}
    295302
     303LayoutUnit RenderGrid::computeTrackBasedLogicalHeight(const GridSizingData& sizingData) const
     304{
     305    LayoutUnit logicalHeight;
     306
     307    for (const auto& row : sizingData.rowTracks)
     308        logicalHeight += row.baseSize();
     309
     310    logicalHeight += guttersSize(ForRows, sizingData.rowTracks.size());
     311
     312    return logicalHeight;
     313}
     314
     315void RenderGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit freeSpace)
     316{
     317    ASSERT(freeSpace >= 0);
     318    LayoutUnit totalGuttersSize = guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
     319    freeSpace = std::max<LayoutUnit>(0, freeSpace - totalGuttersSize);
     320    sizingData.setFreeSpaceForDirection(direction, freeSpace);
     321
     322    LayoutUnit baseSizes, growthLimits;
     323    computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimits);
     324    ASSERT(tracksAreWiderThanMinTrackBreadth(direction, sizingData));
     325}
     326
    296327void RenderGrid::layoutBlock(bool relayoutChildren, LayoutUnit)
    297328{
     
    301332        return;
    302333
    303     // FIXME: Much of this method is boiler plate that matches RenderBox::layoutBlock and Render*FlexibleBox::layoutBlock.
    304     // It would be nice to refactor some of the duplicate code.
    305334    LayoutRepainter repainter(*this, checkForRepaintDuringLayout());
    306335    LayoutStateMaintainer statePusher(view(), *this, locationOffset(), hasTransform() || hasReflection() || style().isFlippedBlocksWritingMode());
     
    312341    setLogicalHeight(0);
    313342    updateLogicalWidth();
    314 
    315     layoutGridItems();
     343    bool logicalHeightWasIndefinite = !computeContentLogicalHeight(MainOrPreferredSize, style().logicalHeight(), Nullopt);
     344
     345    placeItemsOnGrid();
     346
     347    GridSizingData sizingData(gridColumnCount(), gridRowCount());
     348
     349    // At this point the logical width is always definite as the above call to updateLogicalWidth()
     350    // properly resolves intrinsic sizes. We cannot do the same for heights though because many code
     351    // paths inside updateLogicalHeight() require a previous call to setLogicalHeight() to resolve
     352    // heights properly (like for positioned items for example).
     353    computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWidth());
     354
     355    if (logicalHeightWasIndefinite)
     356        computeIntrinsicLogicalHeight(sizingData);
     357    else
     358        computeTrackSizesForDirection(ForRows, sizingData, availableLogicalHeight(ExcludeMarginBorderPadding));
     359    setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddingLogicalHeight());
    316360
    317361    LayoutUnit oldClientAfterEdge = clientLogicalBottom();
    318362    updateLogicalHeight();
     363
     364    // The above call might have changed the grid's logical height depending on min|max height restrictions.
     365    // Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes).
     366    if (logicalHeightWasIndefinite)
     367        computeTrackSizesForDirection(ForRows, sizingData, logicalHeight());
     368
     369    // Grid container should have the minimum height of a line if it's editable. That does not affect track sizing though.
     370    if (hasLineIfEmpty()) {
     371        LayoutUnit minHeightForEmptyLine = borderAndPaddingLogicalHeight()
     372            + lineHeight(true, isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes)
     373            + scrollbarLogicalHeight();
     374        setLogicalHeight(std::max(logicalHeight(), minHeightForEmptyLine));
     375    }
     376
     377    applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData);
     378    applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData);
     379
     380    layoutGridItems(sizingData);
    319381
    320382    if (size() != previousSize)
     
    356418        const_cast<RenderGrid*>(this)->placeItemsOnGrid();
    357419
    358     GridSizingData sizingData(gridColumnCount(), gridRowCount(), 0, 0);
    359     const_cast<RenderGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, sizingData);
    360 
    361     for (auto& column : sizingData.columnTracks) {
    362         LayoutUnit minTrackBreadth = column.baseSize();
    363         LayoutUnit maxTrackBreadth = column.growthLimit();
    364 
    365         minLogicalWidth += minTrackBreadth;
    366         maxLogicalWidth += maxTrackBreadth;
    367     }
     420    GridSizingData sizingData(gridColumnCount(), gridRowCount());
     421    sizingData.setFreeSpaceForDirection(ForColumns, Nullopt);
     422    const_cast<RenderGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
    368423
    369424    LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTracks.size());
     
    379434}
    380435
    381 bool RenderGrid::gridElementIsShrinkToFit()
    382 {
    383     return isFloatingOrOutOfFlowPositioned();
     436void RenderGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData)
     437{
     438    ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
     439    sizingData.setFreeSpaceForDirection(ForRows, Nullopt);
     440    LayoutUnit minHeight, maxHeight;
     441    computeUsedBreadthOfGridTracks(ForRows, sizingData, minHeight, maxHeight);
     442
     443    // FIXME: This should be really added to the intrinsic height in RenderBox::computeContentAndScrollbarLogicalHeightUsing().
     444    // Remove this when that is fixed.
     445    LayoutUnit scrollbarHeight = scrollbarLogicalHeight();
     446    minHeight += scrollbarHeight;
     447    maxHeight += scrollbarHeight;
     448
     449    LayoutUnit totalGuttersSize = guttersSize(ForRows, gridRowCount());
     450    minHeight += totalGuttersSize;
     451    maxHeight += totalGuttersSize;
     452
     453    m_minContentHeight = minHeight;
     454    m_maxContentHeight = maxHeight;
     455
     456    ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData));
     457}
     458
     459Optional<LayoutUnit> RenderGrid::computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, Optional<LayoutUnit> intrinsicLogicalHeight, LayoutUnit borderAndPadding) const
     460{
     461    if (!intrinsicLogicalHeight)
     462        return Nullopt;
     463
     464    if (logicalHeightLength.isMinContent())
     465        return m_minContentHeight;
     466
     467    if (logicalHeightLength.isMaxContent())
     468        return m_maxContentHeight;
     469
     470    if (logicalHeightLength.isFitContent()) {
     471        LayoutUnit fillAvailableExtent = containingBlock()->availableLogicalHeight(ExcludeMarginBorderPadding);
     472        return std::min(m_maxContentHeight.valueOr(0), std::max(m_minContentHeight.valueOr(0), fillAvailableExtent));
     473    }
     474
     475    if (logicalHeightLength.isFillAvailable())
     476        return containingBlock()->availableLogicalHeight(ExcludeMarginBorderPadding) - borderAndPadding;
     477    ASSERT_NOT_REACHED();
     478    return Nullopt;
    384479}
    385480
     
    389484}
    390485
    391 void RenderGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection direction, GridSizingData& sizingData)
    392 {
    393     LayoutUnit& availableLogicalSpace = sizingData.freeSpaceForDirection(direction);
    394     const LayoutUnit initialAvailableLogicalSpace = availableLogicalSpace;
     486void RenderGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit& baseSizesWithoutMaximization, LayoutUnit& growthLimitsWithoutMaximization)
     487{
     488    const Optional<LayoutUnit> initialFreeSpace = sizingData.freeSpaceForDirection(direction);
    395489    Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
    396490    Vector<unsigned> flexibleSizedTracksIndex;
    397491    sizingData.contentSizedTracksIndex.shrink(0);
    398492
    399     const LayoutUnit maxSize = direction == ForColumns ? contentLogicalWidth() : computeContentLogicalHeight(MainOrPreferredSize, style().logicalHeight(), Nullopt).valueOr(0);
     493    const LayoutUnit maxSize = initialFreeSpace.valueOr(0);
    400494    // 1. Initialize per Grid track variables.
    401495    for (unsigned i = 0; i < tracks.size(); ++i) {
     
    419513        resolveContentBasedTrackSizingFunctions(direction, sizingData);
    420514
     515    baseSizesWithoutMaximization = growthLimitsWithoutMaximization = 0;
     516
    421517    for (auto& track : tracks) {
    422518        ASSERT(!track.growthLimitIsInfinite());
    423         availableLogicalSpace -= track.baseSize();
    424     }
    425 
    426     const bool hasUndefinedRemainingSpace = (direction == ForRows) ? style().logicalHeight().isAuto() : gridElementIsShrinkToFit();
    427 
    428     if (!hasUndefinedRemainingSpace && availableLogicalSpace <= 0)
     519        baseSizesWithoutMaximization += track.baseSize();
     520        growthLimitsWithoutMaximization += track.growthLimit();
     521    }
     522    LayoutUnit freeSpace = initialFreeSpace ? initialFreeSpace.value() - baseSizesWithoutMaximization : LayoutUnit(0);
     523
     524    const bool hasDefiniteFreeSpace = !!initialFreeSpace;
     525
     526    if (hasDefiniteFreeSpace && freeSpace <= 0) {
     527        sizingData.setFreeSpaceForDirection(direction, freeSpace);
    429528        return;
    430 
    431     // 3. Grow all Grid tracks in GridTracks from their UsedBreadth up to their MaxBreadth value until availableLogicalSpace is exhausted.
    432     if (!hasUndefinedRemainingSpace) {
     529    }
     530
     531    // 3. Grow all Grid tracks in GridTracks from their UsedBreadth up to their MaxBreadth value until freeSpace is exhausted.
     532    if (hasDefiniteFreeSpace) {
    433533        const unsigned tracksSize = tracks.size();
    434534        Vector<GridTrack*> tracksForDistribution(tracksSize);
     
    438538        }
    439539
    440         distributeSpaceToTracks<MaximizeTracks>(tracksForDistribution, nullptr, availableLogicalSpace);
     540        distributeSpaceToTracks<MaximizeTracks>(tracksForDistribution, nullptr, freeSpace);
    441541
    442542        for (auto* track : tracksForDistribution)
     
    447547    }
    448548
    449     if (flexibleSizedTracksIndex.isEmpty())
     549    if (flexibleSizedTracksIndex.isEmpty()) {
     550        sizingData.setFreeSpaceForDirection(direction, freeSpace);
    450551        return;
     552    }
    451553
    452554    // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction.
    453555    double flexFraction = 0;
    454     if (!hasUndefinedRemainingSpace)
    455         flexFraction = findFlexFactorUnitSize(tracks, GridSpan(0, tracks.size() - 1), direction, initialAvailableLogicalSpace);
     556    if (hasDefiniteFreeSpace)
     557        flexFraction = findFlexFactorUnitSize(tracks, GridSpan(0, tracks.size() - 1), direction, initialFreeSpace.value());
    456558    else {
    457559        for (const auto& trackIndex : flexibleSizedTracksIndex)
     
    480582        if (LayoutUnit increment = baseSize - oldBaseSize) {
    481583            track.setBaseSize(baseSize);
    482             availableLogicalSpace -= increment;
    483         }
    484     }
     584            freeSpace -= increment;
     585
     586            baseSizesWithoutMaximization += increment;
     587            growthLimitsWithoutMaximization += increment;
     588        }
     589    }
     590    sizingData.setFreeSpaceForDirection(direction, freeSpace);
    485591}
    486592
     
    9621068
    9631069template <RenderGrid::TrackSizeComputationPhase phase>
    964 void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vector<GridTrack*>* growBeyondGrowthLimitsTracks, LayoutUnit& availableLogicalSpace)
    965 {
    966     ASSERT(availableLogicalSpace >= 0);
     1070void RenderGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vector<GridTrack*>* growBeyondGrowthLimitsTracks, LayoutUnit& freeSpace)
     1071{
     1072    ASSERT(freeSpace >= 0);
    9671073
    9681074    for (auto* track : tracks)
    9691075        track->tempSize() = trackSizeForTrackSizeComputationPhase(phase, *track, ForbidInfinity);
    9701076
    971     if (availableLogicalSpace > 0) {
     1077    if (freeSpace > 0) {
    9721078        std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
    9731079
     
    9801086            // Let's avoid computing availableLogicalSpaceShare as much as possible as it's a hot spot in performance tests.
    9811087            if (trackGrowthPotential > 0 || infiniteGrowthPotential) {
    982                 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksSize - i);
     1088                LayoutUnit availableLogicalSpaceShare = freeSpace / (tracksSize - i);
    9831089                LayoutUnit growthShare = infiniteGrowthPotential ? availableLogicalSpaceShare : std::min(availableLogicalSpaceShare, trackGrowthPotential);
    984                 ASSERT_WITH_MESSAGE(growthShare >= 0, "We should never shrink any grid track or else we can't guarantee we abide by our min-sizing function. We can still have 0 as growthShare if the amount of tracks greatly exceeds the availableLogicalSpace.");
     1090                ASSERT_WITH_MESSAGE(growthShare >= 0, "We should never shrink any grid track or else we can't guarantee we abide by our min-sizing function. We can still have 0 as growthShare if the amount of tracks greatly exceeds the freeSpace.");
    9851091                track.tempSize() += growthShare;
    986                 availableLogicalSpace -= growthShare;
     1092                freeSpace -= growthShare;
    9871093            }
    9881094        }
    9891095    }
    9901096
    991     if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) {
     1097    if (freeSpace > 0 && growBeyondGrowthLimitsTracks) {
    9921098        unsigned tracksGrowingBeyondGrowthLimitsSize = growBeyondGrowthLimitsTracks->size();
    9931099        for (unsigned i = 0; i < tracksGrowingBeyondGrowthLimitsSize; ++i) {
    9941100            GridTrack* track = growBeyondGrowthLimitsTracks->at(i);
    995             LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingBeyondGrowthLimitsSize - i);
     1101            LayoutUnit growthShare = freeSpace / (tracksGrowingBeyondGrowthLimitsSize - i);
    9961102            track->tempSize() += growthShare;
    997             availableLogicalSpace -= growthShare;
     1103            freeSpace -= growthShare;
    9981104        }
    9991105    }
     
    10041110
    10051111#ifndef NDEBUG
    1006 bool RenderGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection direction, const Vector<GridTrack>& tracks)
    1007 {
    1008     const LayoutUnit maxSize = direction == ForColumns ? contentLogicalWidth() : computeContentLogicalHeight(MainOrPreferredSize, style().logicalHeight(), Nullopt).valueOr(0);
     1112bool RenderGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection direction, GridSizingData& sizingData)
     1113{
     1114    const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
     1115    const LayoutUnit maxSize = sizingData.freeSpaceForDirection(direction).valueOr(0);
    10091116    for (unsigned i = 0; i < tracks.size(); ++i) {
    10101117        const GridTrackSize& trackSize = gridTrackSize(direction, i);
     
    12451352void RenderGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData)
    12461353{
    1247     LayoutUnit& availableSpace = sizingData.freeSpaceForDirection(direction);
    1248     if (availableSpace <= 0
     1354    Optional<LayoutUnit> freeSpace = sizingData.freeSpaceForDirection(direction);
     1355    if (!freeSpace
     1356        || freeSpace.value() <= 0
    12491357        || (direction == ForColumns && style().resolvedJustifyContentDistribution() != ContentDistributionStretch)
    12501358        || (direction == ForRows && style().resolvedAlignContentDistribution() != ContentDistributionStretch))
     
    12641372        return;
    12651373
    1266     LayoutUnit sizeToIncrease = availableSpace / numberOfAutoSizedTracks;
     1374    LayoutUnit sizeToIncrease = freeSpace.value() / numberOfAutoSizedTracks;
    12671375    for (const auto& trackIndex : autoSizedTracksIndex) {
    12681376        auto& track = tracks[trackIndex];
    12691377        track.setBaseSize(track.baseSize() + sizeToIncrease);
    12701378    }
    1271     availableSpace = 0;
    1272 }
    1273 
    1274 void RenderGrid::layoutGridItems()
    1275 {
    1276     placeItemsOnGrid();
    1277 
    1278     LayoutUnit availableSpaceForColumns = availableLogicalWidth();
    1279     LayoutUnit availableSpaceForRows = availableLogicalHeight(IncludeMarginBorderPadding);
    1280 
    1281     // Remove space consumed by gutters from the available logical space.
    1282     availableSpaceForColumns -= guttersSize(ForColumns, gridColumnCount());
    1283     availableSpaceForRows -= guttersSize(ForRows, gridRowCount());
    1284 
    1285     GridSizingData sizingData(gridColumnCount(), gridRowCount(), availableSpaceForColumns, availableSpaceForRows);
    1286     computeUsedBreadthOfGridTracks(ForColumns, sizingData);
    1287     ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData.columnTracks));
    1288     computeUsedBreadthOfGridTracks(ForRows, sizingData);
    1289     ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData.rowTracks));
    1290 
    1291     applyStretchAlignmentToTracksIfNeeded(ForColumns, sizingData);
    1292     applyStretchAlignmentToTracksIfNeeded(ForRows, sizingData);
    1293 
     1379    sizingData.setFreeSpaceForDirection(direction, Optional<LayoutUnit>(0));
     1380}
     1381
     1382void RenderGrid::layoutGridItems(GridSizingData& sizingData)
     1383{
    12941384    populateGridPositions(sizingData);
    12951385
     
    13361426            child->repaintDuringLayoutIfMoved(oldChildRect);
    13371427    }
    1338 
    1339     LayoutUnit height = borderAndPaddingLogicalHeight() + scrollbarLogicalHeight();
    1340     for (auto& row : sizingData.rowTracks)
    1341         height += row.baseSize();
    1342 
    1343     height += guttersSize(ForRows, sizingData.rowTracks.size());
    1344     // min / max logical height is handled in updateLogicalHeight().
    1345     if (hasLineIfEmpty()) {
    1346         LayoutUnit minHeight = borderAndPaddingLogicalHeight()
    1347             + lineHeight(true, isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes)
    1348             + scrollbarLogicalHeight();
    1349         height = std::max(height, minHeight);
    1350     }
    1351     setLogicalHeight(height);
    13521428}
    13531429
     
    14891565    unsigned lastLine = numberOfLines - 1;
    14901566    unsigned nextToLastLine = numberOfLines - 2;
    1491     ContentAlignmentData offset = computeContentPositionAndDistributionOffset(ForColumns, sizingData.freeSpaceForDirection(ForColumns), numberOfTracks);
     1567    ContentAlignmentData offset = computeContentPositionAndDistributionOffset(ForColumns, sizingData.freeSpaceForDirection(ForColumns).value(), numberOfTracks);
    14921568    LayoutUnit trackGap = guttersSize(ForColumns, 2);
    14931569    m_columnPositions.resize(numberOfLines);
     
    15011577    lastLine = numberOfLines - 1;
    15021578    nextToLastLine = numberOfLines - 2;
    1503     offset = computeContentPositionAndDistributionOffset(ForRows, sizingData.freeSpaceForDirection(ForRows), numberOfTracks);
     1579    offset = computeContentPositionAndDistributionOffset(ForRows, sizingData.freeSpaceForDirection(ForRows).value(), numberOfTracks);
    15041580    trackGap = guttersSize(ForRows, 2);
    15051581    m_rowPositions.resize(numberOfLines);
  • trunk/Source/WebCore/rendering/RenderGrid.h

    r192054 r192154  
    6868    virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override;
    6969
     70    Optional<LayoutUnit> computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, Optional<LayoutUnit> intrinsicContentHeight, LayoutUnit borderAndPadding) const override;
     71
    7072    class GridIterator;
    7173    class GridSizingData;
    72     void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&);
    73     bool gridElementIsShrinkToFit();
     74    void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&, LayoutUnit& baseSizesWithoutMaximization, LayoutUnit& growthLimitsWithoutMaximization);
    7475    LayoutUnit computeUsedBreadthOfMinLength(const GridLength&, LayoutUnit maxSize) const;
    7576    LayoutUnit computeUsedBreadthOfMaxLength(const GridLength&, LayoutUnit usedBreadth, LayoutUnit maxSize) const;
     
    8889    GridTrackSizingDirection autoPlacementMinorAxisDirection() const;
    8990
    90     void layoutGridItems();
    9191    void prepareChildForPositionedLayout(RenderBox&);
    9292    void layoutPositionedObject(RenderBox&, bool relayoutChildren, bool fixedPositionObjectsOnly) override;
    9393    void offsetAndBreadthForPositionedChild(const RenderBox&, GridTrackSizingDirection, LayoutUnit& offset, LayoutUnit& breadth);
     94
     95    void computeIntrinsicLogicalHeight(GridSizingData&);
     96    LayoutUnit computeTrackBasedLogicalHeight(const GridSizingData&) const;
     97    void computeTrackSizesForDirection(GridTrackSizingDirection, GridSizingData&, LayoutUnit freeSpace);
     98
     99    void layoutGridItems(GridSizingData&);
    94100    void populateGridPositions(GridSizingData&);
    95101    void clearGrid();
     
    156162
    157163#ifndef NDEBUG
    158     bool tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection, const Vector<GridTrack>&);
     164    bool tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection, GridSizingData&);
    159165#endif
    160166
     
    181187    HashMap<const RenderBox*, GridCoordinate> m_gridItemCoordinate;
    182188    OrderIterator m_orderIterator;
     189
     190    Optional<LayoutUnit> m_minContentHeight;
     191    Optional<LayoutUnit> m_maxContentHeight;
    183192};
    184193
Note: See TracChangeset for help on using the changeset viewer.