Changeset 202974 in webkit


Ignore:
Timestamp:
Jul 8, 2016 3:11:10 AM (8 years ago)
Author:
Manuel Rego Casasnovas
Message:

[css-grid] Inline size is never indefinite during layout
https://bugs.webkit.org/show_bug.cgi?id=159253

Reviewed by Sergio Villar Senin.

Source/WebCore:

The issue is that the inline size of the grid container
is only indefinite while we're computing the intrinsic sizes.
During layout we should be able to resolve the percentage tracks
against that size. This makes Grid Layout compatible with regular blocks
regarding how inline percentages are resolved.

The patch passes the SizingOperation enum to RenderGrid::gridTrackSize().
That way we can know if we're computing the intrinsic sizes or not.

Test: fast/css-grid-layout/grid-container-percentage-columns.html

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::computeTrackSizesForDirection):
(WebCore::RenderGrid::computeIntrinsicLogicalWidths):
(WebCore::RenderGrid::computeIntrinsicLogicalHeight):
(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::gridTrackSize):
(WebCore::RenderGrid::minSizeForChild):
(WebCore::RenderGrid::spanningItemCrossesFlexibleSizedTracks):
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems):
(WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth):
(WebCore::RenderGrid::rawGridTrackSize): Deleted.

  • rendering/RenderGrid.h:

LayoutTests:

Created a new test verifying the expected behavior. Updated the results
in a few tests too.

  • fast/css-grid-layout/grid-columns-rows-get-set-expected.txt:
  • fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt:
  • fast/css-grid-layout/grid-columns-rows-get-set-multiple.html:
  • fast/css-grid-layout/grid-columns-rows-get-set.html:
  • fast/css-grid-layout/grid-container-percentage-columns-expected.txt: Added.
  • fast/css-grid-layout/grid-container-percentage-columns.html: Added.
  • fast/css-grid-layout/named-grid-line-get-set-expected.txt:
  • fast/css-grid-layout/named-grid-line-get-set.html:
  • fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt:
  • fast/css-grid-layout/percent-track-breadths-regarding-container-size.html:

The results of this test now show some FAIL messages becase of a bug in
RenderBox::hasDefiniteLogicalHeight() (http://webkit.org/b/159251).

  • fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js:
  • fast/css-grid-layout/resources/grid-columns-rows-get-set.js:
Location:
trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r202973 r202974  
     12016-07-08  Manuel Rego Casasnovas  <rego@igalia.com>
     2
     3        [css-grid] Inline size is never indefinite during layout
     4        https://bugs.webkit.org/show_bug.cgi?id=159253
     5
     6        Reviewed by Sergio Villar Senin.
     7
     8        Created a new test verifying the expected behavior. Updated the results
     9        in a few tests too.
     10
     11        * fast/css-grid-layout/grid-columns-rows-get-set-expected.txt:
     12        * fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt:
     13        * fast/css-grid-layout/grid-columns-rows-get-set-multiple.html:
     14        * fast/css-grid-layout/grid-columns-rows-get-set.html:
     15        * fast/css-grid-layout/grid-container-percentage-columns-expected.txt: Added.
     16        * fast/css-grid-layout/grid-container-percentage-columns.html: Added.
     17        * fast/css-grid-layout/named-grid-line-get-set-expected.txt:
     18        * fast/css-grid-layout/named-grid-line-get-set.html:
     19        * fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt:
     20        * fast/css-grid-layout/percent-track-breadths-regarding-container-size.html:
     21        The results of this test now show some FAIL messages becase of a bug in
     22        RenderBox::hasDefiniteLogicalHeight() (http://webkit.org/b/159251).
     23        * fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js:
     24        * fast/css-grid-layout/resources/grid-columns-rows-get-set.js:
     25
    1262016-07-08  Frederic Wang  <fwang@igalia.com>
    227
  • trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt

    r201325 r202974  
    99PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-columns') is "10px"
    1010PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-rows') is "15px"
    11 PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "424px"
     11PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "400px"
    1212PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "162px"
    1313PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "0px"
    1414PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "0px"
    15 PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-columns') is "7px"
     15PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-columns') is "3.5px"
    1616PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-rows') is "11px"
    1717PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-columns') is "0px"
  • trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt

    r200510 r202974  
    77PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-columns') is "7px 11px"
    88PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-rows') is "17px 2px"
    9 PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "424px 792px"
     9PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "400px 800px"
    1010PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "162px 312px"
    11 PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "7px 0px"
     11PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "3.5px 7px"
    1212PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "11px 0px"
    1313PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-columns') is "0px 17px"
  • trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple.html

    r200510 r202974  
    2828}
    2929.gridWithPercent {
    30     grid-template-columns: 53% 99%;
     30    grid-template-columns: 50% 100%;
    3131    grid-template-rows: 27% 52%;
    3232}
  • trunk/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html

    r200510 r202974  
    3232}
    3333.gridWithPercent {
    34     grid-template-columns: 53%;
     34    grid-template-columns: 50%;
    3535    grid-template-rows: 27%;
    3636}
  • trunk/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt

    r200510 r202974  
    77PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-columns') is "[first] 10px"
    88PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-rows') is "[first] 15px"
    9 PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "424px [last]"
     9PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "400px [last]"
    1010PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "162px [last]"
    1111PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "0px [last]"
    1212PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "0px [last]"
    13 PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-columns') is "77px [last]"
     13PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-columns') is "38.5px [last]"
    1414PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-rows') is "22px [last]"
    1515PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-columns') is "[first] 0px"
  • trunk/LayoutTests/fast/css-grid-layout/named-grid-line-get-set.html

    r200510 r202974  
    2222}
    2323.gridWithPercent {
    24     grid-template-columns: 53% [last];
     24    grid-template-columns: 50% [last];
    2525    grid-template-rows: 27% [last];
    2626}
     
    100100    debug("Test getting grid-template-columns and grid-template-rows set through CSS");
    101101    testGridTemplatesValues(document.getElementById("gridWithFixedElement"), "[first] 10px", "[first] 15px");
    102     testGridTemplatesValues(document.getElementById("gridWithPercentElement"), "424px [last]", "162px [last]");
     102    testGridTemplatesValues(document.getElementById("gridWithPercentElement"), "400px [last]", "162px [last]");
    103103    testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSize"), "0px [last]", "0px [last]");
    104     testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "77px [last]", "22px [last]");
     104    testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "38.5px [last]", "22px [last]");
    105105    testGridTemplatesValues(document.getElementById("gridWithAutoElement"), "[first] 0px", "0px [last]");
    106106    testGridTemplatesValues(document.getElementById("gridWithAutoWithChildrenElement"), "[first] 77px", "22px [last]");
  • trunk/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size-expected.txt

    r183385 r202974  
    3636XXXXX
    3737XXX
    38 PASS
     38FAIL:
     39Expected 10 for height, but got 4.
     40Expected 10 for height, but got 4.
     41Expected 10 for height, but got 4.
     42
     43<div class="grid absolutelyPositioned">
     44            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
     45            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
     46            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
     47        </div>
     48XX
     49XXXXX
     50XXX
     51FAIL:
     52Expected 10 for height, but got 4.
     53Expected 10 for height, but got 4.
     54Expected 10 for height, but got 4.
     55
     56<div class="grid absolutelyPositioned">
     57            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
     58            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
     59            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
     60        </div>
    3961XX
    4062XXXXX
     
    4567XXX
    4668PASS
    47 XX
    48 XXXXX
    49 XXX
    50 PASS
  • trunk/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size.html

    r200510 r202974  
    9090    <div class="fit-content indefiniteHeight">
    9191        <div class="grid calculatedSize justifyContentStart">
    92             <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
    93             <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
    94             <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
     92            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="44" data-expected-height="10">XX</div>
     93            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="110" data-expected-height="10">XXXXX</div>
     94            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="66" data-expected-height="10">XXX</div>
    9595        </div>
    9696    </div>
     
    106106    <div class="fit-content indefiniteHeight">
    107107        <div class="grid percentageSize">
    108             <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
    109             <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
    110             <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
     108            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="10" data-expected-height="10">XX</div>
     109            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="25" data-expected-height="10">XXXXX</div>
     110            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="15" data-expected-height="10">XXX</div>
    111111        </div>
    112112    </div>
     
    120120    </div>
    121121
     122    <!-- FIXME: The height of the row is wrong calculated in the following 2 examples because of a bug in
     123         RenderBox::hasDefiniteLogicalHeight() that considers that any positioned element has a definite height.
     124         See: https://bugs.webkit.org/show_bug.cgi?id=159251 -->
    122125    <div class="fit-content indefiniteHeight">
    123126        <div class="grid absolutelyPositioned">
    124             <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="0" data-expected-height="0">XX</div>
    125             <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="0" data-expected-height="0">XXXXX</div>
    126             <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="0" data-expected-height="0">XXX</div>
     127            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
     128            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
     129            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
    127130        </div>
    128131    </div>
     
    130133    <div class="unconstrainedContainer">
    131134        <div class="grid absolutelyPositioned">
    132             <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="0" data-expected-height="0">XX</div>
    133             <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="0" data-expected-height="0">XXXXX</div>
    134             <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="0" data-expected-height="0">XXX</div>
     135            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
     136            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
     137            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
    135138        </div>
    136139    </div>
  • trunk/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js

    r200510 r202974  
    33debug("Test getting |grid-template-columns| and |grid-template-rows| set through CSS");
    44testGridTemplatesValues(document.getElementById("gridWithFixedElement"), "7px 11px", "17px 2px");
    5 testGridTemplatesValues(document.getElementById("gridWithPercentElement"), "53% 99%", "27% 52%", "424px 792px", "162px 312px");
    6 testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSize"), "53% 99%", "27% 52%", "7px 0px", "11px 0px");
     5testGridTemplatesValues(document.getElementById("gridWithPercentElement"), "50% 100%", "27% 52%", "400px 800px", "162px 312px");
     6testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSize"), "50% 100%", "27% 52%", "3.5px 7px", "11px 0px");
    77testGridTemplatesValues(document.getElementById("gridWithAutoElement"), "auto auto", "auto auto", "0px 17px", "0px 3px");
    88testGridTemplatesValues(document.getElementById("gridWithEMElement"), "100px 120px", "150px 170px");
  • trunk/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js

    r201325 r202974  
    44testGridTemplatesValues(document.getElementById("gridWithNoneElement"), "none", "none");
    55testGridTemplatesValues(document.getElementById("gridWithFixedElement"), "10px", "15px");
    6 testGridTemplatesValues(document.getElementById("gridWithPercentElement"), "424px", "162px");
     6testGridTemplatesValues(document.getElementById("gridWithPercentElement"), "400px", "162px");
    77testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSize"), "0px", "0px");
    8 testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "7px", "11px");
     8testGridTemplatesValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "3.5px", "11px");
    99testGridTemplatesValues(document.getElementById("gridWithAutoElement"), "0px", "0px");
    1010testGridTemplatesValues(document.getElementById("gridWithAutoWithChildrenElement"), "7px", "11px");
  • trunk/Source/WebCore/ChangeLog

    r202973 r202974  
     12016-07-08  Manuel Rego Casasnovas  <rego@igalia.com>
     2
     3        [css-grid] Inline size is never indefinite during layout
     4        https://bugs.webkit.org/show_bug.cgi?id=159253
     5
     6        Reviewed by Sergio Villar Senin.
     7
     8        The issue is that the inline size of the grid container
     9        is only indefinite while we're computing the intrinsic sizes.
     10        During layout we should be able to resolve the percentage tracks
     11        against that size. This makes Grid Layout compatible with regular blocks
     12        regarding how inline percentages are resolved.
     13
     14        The patch passes the SizingOperation enum to RenderGrid::gridTrackSize().
     15        That way we can know if we're computing the intrinsic sizes or not.
     16
     17        Test: fast/css-grid-layout/grid-container-percentage-columns.html
     18
     19        * rendering/RenderGrid.cpp:
     20        (WebCore::RenderGrid::computeTrackSizesForDirection):
     21        (WebCore::RenderGrid::computeIntrinsicLogicalWidths):
     22        (WebCore::RenderGrid::computeIntrinsicLogicalHeight):
     23        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
     24        (WebCore::RenderGrid::gridTrackSize):
     25        (WebCore::RenderGrid::minSizeForChild):
     26        (WebCore::RenderGrid::spanningItemCrossesFlexibleSizedTracks):
     27        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
     28        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems):
     29        (WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth):
     30        (WebCore::RenderGrid::rawGridTrackSize): Deleted.
     31        * rendering/RenderGrid.h:
     32
    1332016-07-08  Frederic Wang  <fwang@igalia.com>
    234
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r201709 r202974  
    239239    void setFreeSpaceForDirection(GridTrackSizingDirection, Optional<LayoutUnit> freeSpace);
    240240
    241     enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
    242241    SizingOperation sizingOperation { TrackSizing };
    243242
     
    361360    LayoutUnit totalGuttersSize = guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
    362361    sizingData.setFreeSpaceForDirection(direction, freeSpace - totalGuttersSize);
    363     sizingData.sizingOperation = GridSizingData::TrackSizing;
     362    sizingData.sizingOperation = TrackSizing;
    364363
    365364    LayoutUnit baseSizes, growthLimits;
     
    466465    GridSizingData sizingData(gridColumnCount(), gridRowCount());
    467466    sizingData.setFreeSpaceForDirection(ForColumns, Nullopt);
    468     sizingData.sizingOperation = GridSizingData::IntrinsicSizeComputation;
     467    sizingData.sizingOperation = IntrinsicSizeComputation;
    469468    const_cast<RenderGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
    470469
     
    485484    ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
    486485    sizingData.setFreeSpaceForDirection(ForRows, Nullopt);
    487     sizingData.sizingOperation = GridSizingData::IntrinsicSizeComputation;
     486    sizingData.sizingOperation = IntrinsicSizeComputation;
    488487    LayoutUnit minHeight, maxHeight;
    489488    computeUsedBreadthOfGridTracks(ForRows, sizingData, minHeight, maxHeight);
     
    548547    for (unsigned i = 0; i < tracks.size(); ++i) {
    549548        GridTrack& track = tracks[i];
    550         const GridTrackSize& trackSize = gridTrackSize(direction, i);
     549        const GridTrackSize& trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
    551550        const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
    552551        const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth();
     
    608607    double flexFraction = 0;
    609608    if (hasDefiniteFreeSpace)
    610         flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()), direction, initialFreeSpace.value());
     609        flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()), direction, sizingData.sizingOperation, initialFreeSpace.value());
    611610    else {
    612611        for (const auto& trackIndex : flexibleSizedTracksIndex)
    613             flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex()));
     612            flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex, sizingData.sizingOperation).maxTrackBreadth().flex()));
    614613
    615614        if (!m_gridItemArea.isEmpty()) {
     
    623622                        continue;
    624623
    625                     flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tracks, span, direction, maxContentForChild(*gridItem, direction, sizingData)));
     624                    flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tracks, span, direction, sizingData.sizingOperation, maxContentForChild(*gridItem, direction, sizingData)));
    626625                }
    627626            }
     
    630629
    631630    for (auto trackIndex : flexibleSizedTracksIndex) {
    632         const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex);
     631        const GridTrackSize& trackSize = gridTrackSize(direction, trackIndex, sizingData.sizingOperation);
    633632        GridTrack& track = tracks[trackIndex];
    634633        LayoutUnit oldBaseSize = track.baseSize();
     
    671670}
    672671
    673 double RenderGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, GridTrackSizingDirection direction, double flexFactorSum, LayoutUnit leftOverSpace, const Vector<unsigned, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const
     672double RenderGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, GridTrackSizingDirection direction, SizingOperation sizingOperation, double flexFactorSum, LayoutUnit leftOverSpace, const Vector<unsigned, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const
    674673{
    675674    // We want to avoid the effect of flex factors sum below 1 making the factor unit size to grow exponentially.
     
    682681            continue;
    683682        LayoutUnit baseSize = tracks[index].baseSize();
    684         double flexFactor = gridTrackSize(direction, index).maxTrackBreadth().flex();
     683        double flexFactor = gridTrackSize(direction, index, sizingOperation).maxTrackBreadth().flex();
    685684        // treating all such tracks as inflexible.
    686685        if (baseSize > hypotheticalFactorUnitSize * flexFactor) {
     
    694693    }
    695694    if (!validFlexFactorUnit)
    696         return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverSpace, flexibleTracksIndexes, WTFMove(tracksToTreatAsInflexible));
     695        return computeFlexFactorUnitSize(tracks, direction, sizingOperation, flexFactorSum, leftOverSpace, flexibleTracksIndexes, WTFMove(tracksToTreatAsInflexible));
    697696    return hypotheticalFactorUnitSize;
    698697}
    699698
    700 double RenderGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const GridSpan& tracksSpan, GridTrackSizingDirection direction, LayoutUnit leftOverSpace) const
     699double RenderGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const GridSpan& tracksSpan, GridTrackSizingDirection direction, SizingOperation sizingOperation, LayoutUnit leftOverSpace) const
    701700{
    702701    if (leftOverSpace <= 0)
     
    706705    Vector<unsigned, 8> flexibleTracksIndexes;
    707706    for (auto trackIndex : tracksSpan) {
    708         GridTrackSize trackSize = gridTrackSize(direction, trackIndex);
     707        GridTrackSize trackSize = gridTrackSize(direction, trackIndex, sizingOperation);
    709708        if (!trackSize.maxTrackBreadth().isFlex())
    710709            leftOverSpace -= tracks[trackIndex].baseSize();
     
    719718    ASSERT(!flexibleTracksIndexes.isEmpty());
    720719
    721     return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverSpace, flexibleTracksIndexes);
    722 }
    723 
    724 bool RenderGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) const
    725 {
    726     return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogicalWidth();
     720    return computeFlexFactorUnitSize(tracks, direction, sizingOperation, flexFactorSum, leftOverSpace, flexibleTracksIndexes);
    727721}
    728722
     
    758752}
    759753
    760 GridTrackSize RenderGrid::gridTrackSize(GridTrackSizingDirection direction, unsigned translatedIndex) const
     754GridTrackSize RenderGrid::gridTrackSize(GridTrackSizingDirection direction, unsigned translatedIndex, SizingOperation sizingOperation) const
    761755{
    762756    auto& trackSize = rawGridTrackSize(direction, translatedIndex);
     
    766760
    767761    if (minTrackBreadth.isPercentage() || maxTrackBreadth.isPercentage()) {
    768         if (!hasDefiniteLogicalSize(direction)) {
     762        // If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>.
     763        // For the inline axis this only happens when we're computing the intrinsic sizes (IntrinsicSizeComputation).
     764        if (sizingOperation == IntrinsicSizeComputation || (direction == ForRows && !hasDefiniteLogicalHeight())) {
    769765            if (minTrackBreadth.isPercentage())
    770766                minTrackBreadth = Length(Auto);
     
    817813    bool overrideLogicalWidthHasChanged = updateOverrideContainingBlockContentLogicalWidthForChild(child, sizingData);
    818814    if (isRowAxis) {
    819         LayoutUnit marginLogicalWidth = sizingData.sizingOperation == GridSizingData::TrackSizing ? computeMarginLogicalSizeForChild(ForColumns, child) : marginIntrinsicLogicalWidthForChild(child);
     815        LayoutUnit marginLogicalWidth = sizingData.sizingOperation == TrackSizing ? computeMarginLogicalSizeForChild(ForColumns, child) : marginIntrinsicLogicalWidthForChild(child);
    820816        return child.computeLogicalWidthInRegionUsing(MinSize, childMinSize, child.overrideContainingBlockContentLogicalWidth().valueOr(0), *this, nullptr) + marginLogicalWidth;
    821817    }
     
    904900};
    905901
    906 bool RenderGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& itemSpan, GridTrackSizingDirection direction) const
     902bool RenderGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& itemSpan, GridTrackSizingDirection direction, SizingOperation sizingOperation) const
    907903{
    908904    for (auto trackPosition : itemSpan) {
    909         const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition);
     905        const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition, sizingOperation);
    910906        if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex())
    911907            return true;
     
    934930                    if (span.integerSpan() == 1)
    935931                        resolveContentBasedTrackSizingFunctionsForNonSpanningItems(direction, span, *gridItem, track, sizingData);
    936                     else if (!spanningItemCrossesFlexibleSizedTracks(span, direction))
     932                    else if (!spanningItemCrossesFlexibleSizedTracks(span, direction, sizingData.sizingOperation))
    937933                        sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
    938934                }
     
    964960{
    965961    unsigned trackPosition = span.startLine();
    966     GridTrackSize trackSize = gridTrackSize(direction, trackPosition);
     962    GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData.sizingOperation);
    967963
    968964    if (trackSize.hasMinContentMinTrackBreadth())
     
    11191115        LayoutUnit spanningTracksSize;
    11201116        for (auto trackPosition : itemSpan) {
    1121             const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition);
     1117            const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition, sizingData.sizingOperation);
    11221118            GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition] : sizingData.rowTracks[trackPosition];
    11231119            spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity);
     
    12101206    const LayoutUnit maxSize = sizingData.freeSpaceForDirection(direction).valueOr(0);
    12111207    for (unsigned i = 0; i < tracks.size(); ++i) {
    1212         const GridTrackSize& trackSize = gridTrackSize(direction, i);
     1208        const GridTrackSize& trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
    12131209        const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
    12141210        if (computeUsedBreadthOfMinLength(minTrackBreadth, maxSize) > tracks[i].baseSize())
     
    15611557    Vector<unsigned> autoSizedTracksIndex;
    15621558    for (unsigned i = 0; i < tracks.size(); ++i) {
    1563         const GridTrackSize& trackSize = gridTrackSize(direction, i);
     1559        const GridTrackSize& trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
    15641560        if (trackSize.hasAutoMaxTrackBreadth())
    15651561            autoSizedTracksIndex.append(i);
  • trunk/Source/WebCore/rendering/RenderGrid.h

    r201510 r202974  
    7575    class GridIterator;
    7676    class GridSizingData;
     77    enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
    7778    void computeUsedBreadthOfGridTracks(GridTrackSizingDirection, GridSizingData&, LayoutUnit& baseSizesWithoutMaximization, LayoutUnit& growthLimitsWithoutMaximization);
    7879    LayoutUnit computeUsedBreadthOfMinLength(const GridLength&, LayoutUnit maxSize) const;
     
    132133
    133134    typedef HashSet<unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> TrackIndexSet;
    134     double computeFlexFactorUnitSize(const Vector<GridTrack>&, GridTrackSizingDirection, double flexFactorSum, LayoutUnit leftOverSpace, const Vector<unsigned, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const;
    135     double findFlexFactorUnitSize(const Vector<GridTrack>&, const GridSpan&, GridTrackSizingDirection, LayoutUnit spaceToFill) const;
     135    double computeFlexFactorUnitSize(const Vector<GridTrack>&, GridTrackSizingDirection, SizingOperation, double flexFactorSum, LayoutUnit leftOverSpace, const Vector<unsigned, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const;
     136    double findFlexFactorUnitSize(const Vector<GridTrack>&, const GridSpan&, GridTrackSizingDirection, SizingOperation, LayoutUnit spaceToFill) const;
    136137
    137138    const GridTrackSize& rawGridTrackSize(GridTrackSizingDirection, unsigned) const;
    138     GridTrackSize gridTrackSize(GridTrackSizingDirection, unsigned) const;
     139    GridTrackSize gridTrackSize(GridTrackSizingDirection, unsigned, SizingOperation) const;
    139140
    140141    bool updateOverrideContainingBlockContentLogicalWidthForChild(RenderBox&, GridSizingData&);
     
    174175#endif
    175176
    176     bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&, GridTrackSizingDirection) const;
     177    bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&, GridTrackSizingDirection, SizingOperation) const;
    177178
    178179    unsigned gridColumnCount() const;
    179180    unsigned gridRowCount() const;
    180181
    181     bool hasDefiniteLogicalSize(GridTrackSizingDirection) const;
    182182    LayoutUnit translateRTLCoordinate(LayoutUnit) const;
    183183
Note: See TracChangeset for help on using the changeset viewer.