⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 267503 in webkit


Ignore:
Timestamp:
Sep 23, 2020, 3:31:47 PM (6 years ago)
Author:
Oriol Brufau
Message:

[css-grid] Clear the override width for computing percent margins
https://bugs.webkit.org/show_bug.cgi?id=209461

Reviewed by Manuel Rego Casasnovas.

LayoutTests/imported/w3c:

Update test expectations.

The 2 grid-items-percentage-paddings tests are now expected to have some
failures because of bug 191964. In fact they were already failing before
this patch, as can be seen in wpt.fyi:
https://wpt.fyi/results/css/css-grid/grid-items?q=grid-items-percentage-paddings-vertical-%20-002.html
It's just that the bug that is being fixed made the test runner think
that the tests were passing, probably some racy condition or such.

  • web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt:
  • web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt:
  • web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt:
  • web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt:
  • web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt:

Source/WebCore:

When calculating the min-content contribution of a grid item of an auto
sized grid track we must consider the grid item's margin. When the grid
item's area is indefinite, a percent margin is resolved to zero.
However, when performing a relayout, the percent margin may be solved
against the previously computed grid area, since the grid item has
already an OverrideContainingBlockLogicalWidth value.

In order to re-compute the percent margin properly, we need to clear
the previously override value. It's important to be careful of not
clearing the override value set during intrinsic size, since we need
it for the actual layout phase. Hence, we only reset the 'override'
value when we are executing a definite strategy.

This is a reland of r261841, which was reverted because it broke spotify.
This problem is now avoided thanks to bug 210089.

Tests: imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages.html

imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-003.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-004.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-005.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-006.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-007.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-008.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-009.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-010.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-005.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-006.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-009.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-010.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002.html
imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002.html

  • rendering/GridTrackSizingAlgorithm.cpp:

(WebCore::hasRelativeMarginOrPaddingForChild):
(WebCore::hasRelativeOrIntrinsicSizeForChild):
(WebCore::shouldClearOverrideContainingBlockContentSizeForChild):
(WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
(WebCore::GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild const):
(WebCore::DefiniteSizeStrategy::minLogicalSizeForChild const):
(WebCore::DefiniteSizeStrategy::minContentForChild const):

  • rendering/GridTrackSizingAlgorithm.h:

LayoutTests:

Update test expectations.

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r267495 r267503  
     12020-09-23  obrufau@igalia.com  <obrufau@igalia.com>
     2
     3        [css-grid] Clear the override width for computing percent margins
     4        https://bugs.webkit.org/show_bug.cgi?id=209461
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        Update test expectations.
     9
     10        * TestExpectations:
     11
    1122020-09-23  Tadeu Zagallo  <tzagallo@apple.com>
    213
  • trunk/LayoutTests/TestExpectations

    r267486 r267503  
    11651165webkit.org/b/216145 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-9.html [ ImageOnlyFailure ]
    11661166webkit.org/b/216145 imported/w3c/web-platform-tests/css/css-grid/alignment/grid-item-no-aspect-ratio-stretch-10.html [ ImageOnlyFailure ]
    1167 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-003.html [ ImageOnlyFailure ]
    1168 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-004.html [ ImageOnlyFailure ]
    1169 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-005.html [ ImageOnlyFailure ]
    1170 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-006.html [ ImageOnlyFailure ]
    1171 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-007.html [ ImageOnlyFailure ]
    1172 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-008.html [ ImageOnlyFailure ]
    1173 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-009.html [ ImageOnlyFailure ]
    1174 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-010.html [ ImageOnlyFailure ]
    1175 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-005.html [ ImageOnlyFailure ]
    1176 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-006.html [ ImageOnlyFailure ]
    1177 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-009.html [ ImageOnlyFailure ]
    1178 webkit.org/b/209461 imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-010.html [ ImageOnlyFailure ]
    11791167webkit.org/b/191461 imported/w3c/web-platform-tests/css/css-grid/grid-items/percentage-size-subitems-001.html [ ImageOnlyFailure ]
    11801168webkit.org/b/191462 imported/w3c/web-platform-tests/css/css-grid/grid-items/percentage-size-replaced-subitems-001.html [ ImageOnlyFailure ]
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r267472 r267503  
     12020-09-23  obrufau@igalia.com  <obrufau@igalia.com>
     2
     3        [css-grid] Clear the override width for computing percent margins
     4        https://bugs.webkit.org/show_bug.cgi?id=209461
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        Update test expectations.
     9
     10        The 2 grid-items-percentage-paddings tests are now expected to have some
     11        failures because of bug 191964. In fact they were already failing before
     12        this patch, as can be seen in wpt.fyi:
     13        https://wpt.fyi/results/css/css-grid/grid-items?q=grid-items-percentage-paddings-vertical-%20-002.html
     14        It's just that the bug that is being fixed made the test runner think
     15        that the tests were passing, probably some racy condition or such.
     16
     17        * web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt:
     18        * web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt:
     19        * web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt:
     20        * web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt:
     21        * web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt:
     22
    1232020-09-23  Youenn Fablet  <youenn@apple.com>
    224
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages-expected.txt

    r262809 r267503  
    33PASS auto - rows
    44PASS min - columns
    5 FAIL min - rows assert_equals: grid-template-rows expected "50px" but got "150px"
     5PASS min - rows
    66PASS max - columns
    77PASS max - rows
     
    99PASS size - rows
    1010PASS min max - columns
    11 FAIL min max - rows assert_equals: grid-template-rows expected "50px" but got "150px"
     11PASS min max - rows
    1212PASS min size - columns
    13 FAIL min size - rows assert_equals: grid-template-rows expected "50px" but got "200px"
     13PASS min size - rows
    1414PASS max size - columns
    1515PASS max size - rows
    1616PASS min max size - columns
    17 FAIL min max size - rows assert_equals: grid-template-rows expected "50px" but got "150px"
     17PASS min max size - rows
    1818
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001-expected.txt

    r264456 r267503  
    33PASS Minimum size: 0%
    44PASS Minimum size: 100%
    5 FAIL Minimum size: 200% assert_equals: height expected "200px" but got "400px"
    6 FAIL Minimum size: 300% assert_equals: height expected "300px" but got "5400px"
     5PASS Minimum size: 200%
     6PASS Minimum size: 300%
    77PASS Minimum size: 400px
    88PASS Minimum size: 500px
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001-expected.txt

    r262852 r267503  
    33PASS .grid 2
    44PASS .grid 3
    5 FAIL .grid 4 assert_equals:
    6 <div class="grid">
    7   <div class="minHeight60 marginTop5" data-expected-height="60"></div>
    8   <div data-expected-height="65"></div>
    9 </div>
    10 height expected 65 but got 60
    11 FAIL .grid 5 assert_equals:
    12 <div class="grid">
    13   <div class="minHeight60 marginTop5 marginLeftAuto" data-expected-height="60"></div>
    14   <div data-expected-height="65"></div>
    15 </div>
    16 height expected 65 but got 60
     5PASS .grid 4
     6PASS .grid 5
    177PASS .grid 6
    18 FAIL .grid 7 assert_equals:
    19 <div class="grid">
    20   <div class="minHeight60 marginBottom10" data-expected-height="60"></div>
    21   <div data-expected-height="70"></div>
    22 </div>
    23 height expected 70 but got 60
     8PASS .grid 7
    249PASS .grid 8
    25 FAIL .grid 9 assert_equals:
    26 <div class="grid">
    27   <div class="minHeight60 marginTop5 marginBottom10" data-expected-height="60"></div>
    28   <div data-expected-height="75"></div>
    29 </div>
    30 height expected 75 but got 60
     10PASS .grid 9
    3111PASS .grid 10
    3212PASS .grid 11
     
    4222PASS .grid 21
    4323PASS .grid 22
    44 FAIL .grid 23 assert_equals:
    45 <div class="grid">
    46   <div class="minHeight60 marginTop5 marginBottom10 paddingTop6 paddingBottom3 borderTop2 borderBottom4" data-expected-height="75"></div>
    47   <div data-expected-height="90"></div>
    48 </div>
    49 height expected 90 but got 75
     24PASS .grid 23
    5025PASS .grid 24
    5126PASS .grid 25
    5227PASS .grid 26
    53 FAIL .grid 27 assert_equals:
    54 <div class="grid directionRTL">
    55   <div class="minHeight60 marginTop5" data-expected-height="60"></div>
    56   <div data-expected-height="65"></div>
    57 </div>
    58 height expected 65 but got 60
    59 FAIL .grid 28 assert_equals:
    60 <div class="grid directionRTL">
    61   <div class="minHeight60 marginTop5 marginLeftAuto" data-expected-height="60"></div>
    62   <div data-expected-height="65"></div>
    63 </div>
    64 height expected 65 but got 60
     28PASS .grid 27
     29PASS .grid 28
    6530PASS .grid 29
    66 FAIL .grid 30 assert_equals:
    67 <div class="grid directionRTL">
    68   <div class="minHeight60 marginBottom10" data-expected-height="60"></div>
    69   <div data-expected-height="70"></div>
    70 </div>
    71 height expected 70 but got 60
     31PASS .grid 30
    7232PASS .grid 31
    73 FAIL .grid 32 assert_equals:
    74 <div class="grid directionRTL">
    75   <div class="minHeight60 marginTop5 marginBottom10" data-expected-height="60"></div>
    76   <div data-expected-height="75"></div>
    77 </div>
    78 height expected 75 but got 60
     33PASS .grid 32
    7934PASS .grid 33
    8035PASS .grid 34
     
    9045PASS .grid 44
    9146PASS .grid 45
    92 FAIL .grid 46 assert_equals:
    93 <div class="grid directionRTL">
    94   <div class="minHeight60 marginTop5 marginBottom10 paddingTop6 paddingBottom3 borderTop2 borderBottom4" data-expected-height="75"></div>
    95   <div data-expected-height="90"></div>
    96 </div>
    97 height expected 90 but got 75
     47PASS .grid 46
    9848Direction LTR
    9949
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002-expected.txt

    r262901 r267503  
    22PASS .grid 1
    33PASS .grid 2
    4 PASS .grid 3
    5 PASS .grid 4
     4FAIL .grid 3 assert_equals:
     5<div class="grid">
     6  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
     7  <div data-offset-x="10" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
     8</div>
     9height expected 60 but got 50
     10FAIL .grid 4 assert_equals:
     11<div class="grid">
     12  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
     13  <div data-offset-x="10" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
     14</div>
     15height expected 60 but got 50
    616PASS .grid 5
    717PASS .grid 6
    8 PASS .grid 7
    9 PASS .grid 8
     18FAIL .grid 7 assert_equals:
     19<div class="grid directionRTL">
     20  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
     21  <div data-offset-x="10" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
     22</div>
     23height expected 60 but got 50
     24FAIL .grid 8 assert_equals:
     25<div class="grid directionRTL">
     26  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
     27  <div data-offset-x="10" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
     28</div>
     29height expected 60 but got 50
    1030Direction LTR
    1131
  • trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002-expected.txt

    r262901 r267503  
    22PASS .grid 1
    33PASS .grid 2
    4 PASS .grid 3
    5 PASS .grid 4
     4FAIL .grid 3 assert_equals:
     5<div class="grid">
     6  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
     7  <div data-offset-x="0" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
     8</div>
     9height expected 60 but got 50
     10FAIL .grid 4 assert_equals:
     11<div class="grid">
     12  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
     13  <div data-offset-x="0" data-offset-y="0" data-expected-width="10" data-expected-height="100"></div>
     14</div>
     15height expected 60 but got 50
    616PASS .grid 5
    717PASS .grid 6
    8 PASS .grid 7
    9 PASS .grid 8
     18FAIL .grid 7 assert_equals:
     19<div class="grid directionRTL">
     20  <div class="paddingTop50Percent" data-expected-padding-top="50" data-expected-width="10" data-expected-height="60">X</div>
     21  <div data-offset-x="0" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
     22</div>
     23height expected 60 but got 50
     24FAIL .grid 8 assert_equals:
     25<div class="grid directionRTL">
     26  <div class="paddingBottom50Percent" data-expected-padding-bottom="50" data-expected-width="10" data-expected-height="60">X</div>
     27  <div data-offset-x="0" data-offset-y="400" data-expected-width="10" data-expected-height="100"></div>
     28</div>
     29height expected 60 but got 50
    1030Direction LTR
    1131
  • trunk/Source/WebCore/ChangeLog

    r267502 r267503  
     12020-09-23  obrufau@igalia.com  <obrufau@igalia.com>
     2
     3        [css-grid] Clear the override width for computing percent margins
     4        https://bugs.webkit.org/show_bug.cgi?id=209461
     5
     6        Reviewed by Manuel Rego Casasnovas.
     7
     8        When calculating the min-content contribution of a grid item of an auto
     9        sized grid track we must consider the grid item's margin. When the grid
     10        item's area is indefinite, a percent margin is resolved to zero.
     11        However, when performing a relayout, the percent margin may be solved
     12        against the previously computed grid area, since the grid item has
     13        already an OverrideContainingBlockLogicalWidth value.
     14
     15        In order to re-compute the percent margin properly, we need to clear
     16        the previously override value. It's important to be careful of not
     17        clearing the override value set during intrinsic size, since we need
     18        it for the actual layout phase. Hence, we only reset the 'override'
     19        value when we are executing a definite strategy.
     20
     21        This is a reland of r261841, which was reverted because it broke spotify.
     22        This problem is now avoided thanks to bug 210089.
     23
     24        Tests: imported/w3c/web-platform-tests/css/css-grid/grid-definition/grid-minimum-contribution-with-percentages.html
     25               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-item-dynamic-min-contribution-001.html
     26               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-minimum-height-orthogonal-001.html
     27               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-003.html
     28               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-004.html
     29               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-005.html
     30               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-006.html
     31               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-007.html
     32               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-008.html
     33               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-009.html
     34               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-margins-010.html
     35               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-005.html
     36               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-006.html
     37               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-009.html
     38               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-010.html
     39               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-lr-002.html
     40               imported/w3c/web-platform-tests/css/css-grid/grid-items/grid-items-percentage-paddings-vertical-rl-002.html
     41
     42        * rendering/GridTrackSizingAlgorithm.cpp:
     43        (WebCore::hasRelativeMarginOrPaddingForChild):
     44        (WebCore::hasRelativeOrIntrinsicSizeForChild):
     45        (WebCore::shouldClearOverrideContainingBlockContentSizeForChild):
     46        (WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const):
     47        (WebCore::GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild const):
     48        (WebCore::DefiniteSizeStrategy::minLogicalSizeForChild const):
     49        (WebCore::DefiniteSizeStrategy::minContentForChild const):
     50        * rendering/GridTrackSizingAlgorithm.h:
     51
    1522020-09-23  Carlos Garcia Campos  <cgarcia@igalia.com>
    253
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp

    r266675 r267503  
    107107}
    108108
    109 static bool shouldClearOverrideContainingBlockContentSizeForChild(const RenderBox& child, GridTrackSizingDirection direction)
     109static bool hasRelativeMarginOrPaddingForChild(const RenderBox& child, GridTrackSizingDirection direction)
     110{
     111    if (direction == ForColumns)
     112        return child.style().marginStart().isPercentOrCalculated() || child.style().marginEnd().isPercentOrCalculated() || child.style().paddingStart().isPercentOrCalculated() || child.style().paddingEnd().isPercentOrCalculated();
     113    return child.style().marginBefore().isPercentOrCalculated() || child.style().marginAfter().isPercentOrCalculated() || child.style().paddingBefore().isPercentOrCalculated() || child.style().paddingAfter().isPercentOrCalculated();
     114}
     115
     116static bool hasRelativeOrIntrinsicSizeForChild(const RenderBox& child, GridTrackSizingDirection direction)
    110117{
    111118    if (direction == ForColumns)
    112119        return child.hasRelativeLogicalWidth() || child.style().logicalWidth().isIntrinsicOrAuto();
    113120    return child.hasRelativeLogicalHeight() || child.style().logicalHeight().isIntrinsicOrAuto();
     121}
     122
     123static bool shouldClearOverrideContainingBlockContentSizeForChild(const RenderBox& child, GridTrackSizingDirection direction)
     124{
     125    return hasRelativeOrIntrinsicSizeForChild(child, direction) || hasRelativeMarginOrPaddingForChild(child, direction);
    114126}
    115127
     
    120132    else
    121133        child.setOverrideContainingBlockContentLogicalHeight(size);
    122 }
    123 
    124 // FIXME: we borrowed this from RenderBlock. We cannot call it from here because it's protected for RenderObjects.
    125 static LayoutUnit marginIntrinsicLogicalWidthForChild(const RenderGrid* renderGrid, RenderBox& child)
    126 {
    127     // A margin has three types: fixed, percentage, and auto (variable).
    128     // Auto and percentage margins become 0 when computing min/max width.
    129     // Fixed margins can be added in as is.
    130     Length marginLeft = child.style().marginStartUsing(&renderGrid->style());
    131     Length marginRight = child.style().marginEndUsing(&renderGrid->style());
    132     LayoutUnit margin;
    133     if (marginLeft.isFixed())
    134         margin += marginLeft.value();
    135     if (marginRight.isFixed())
    136         margin += marginRight.value();
    137     return margin;
    138134}
    139135
     
    833829
    834830    LayoutUnit gridAreaSize = m_algorithm.gridAreaBreadthForChild(child, childInlineDirection);
    835     if (isRowAxis)
    836         return minLogicalWidthForChild(child, childMinSize, gridAreaSize) + baselineShim;
    837 
    838     bool overrideSizeHasChanged = updateOverrideContainingBlockContentSizeForChild(child, childInlineDirection, gridAreaSize);
    839     layoutGridItemForMinSizeComputation(child, overrideSizeHasChanged);
    840 
    841     return child.computeLogicalHeightUsing(MinSize, childMinSize, WTF::nullopt).valueOr(0) + child.marginLogicalHeight() + child.scrollbarLogicalHeight() + baselineShim;
     831    return minLogicalSizeForChild(child, childMinSize, gridAreaSize) + baselineShim;
    842832}
    843833
     
    921911}
    922912
     913LayoutUnit GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild(RenderBox& child, const Length& childMinSize, LayoutUnit availableSize) const
     914{
     915    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
     916    bool isRowAxis = direction() == childInlineDirection;
     917    if (isRowAxis)
     918        return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize, *renderGrid(), nullptr) + GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), childInlineDirection, child);
     919    bool overrideSizeHasChanged = updateOverrideContainingBlockContentSizeForChild(child, childInlineDirection, availableSize);
     920    layoutGridItemForMinSizeComputation(child, overrideSizeHasChanged);
     921    GridTrackSizingDirection childBlockDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForRows);
     922    return child.computeLogicalHeightUsing(MinSize, childMinSize, WTF::nullopt).valueOr(0) + GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), childBlockDirection, child);
     923}
     924
    923925class IndefiniteSizeStrategy final : public GridTrackSizingAlgorithmStrategy {
    924926public:
     
    927929
    928930private:
    929     LayoutUnit minLogicalWidthForChild(RenderBox&, Length childMinSize, LayoutUnit availableSize) const override;
    930931    void layoutGridItemForMinSizeComputation(RenderBox&, bool overrideSizeHasChanged) const override;
    931932    void maximizeTracks(Vector<GridTrack>&, Optional<LayoutUnit>& freeSpace) override;
     
    934935    LayoutUnit freeSpaceForStretchAutoTracksStep() const override;
    935936};
    936 
    937 LayoutUnit IndefiniteSizeStrategy::minLogicalWidthForChild(RenderBox& child, Length childMinSize, LayoutUnit availableSize) const
    938 {
    939     return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize, *renderGrid(), nullptr) + marginIntrinsicLogicalWidthForChild(renderGrid(), child);
    940 }
    941937
    942938void IndefiniteSizeStrategy::layoutGridItemForMinSizeComputation(RenderBox& child, bool overrideSizeHasChanged) const
     
    10281024
    10291025private:
    1030     LayoutUnit minLogicalWidthForChild(RenderBox&, Length childMinSize, LayoutUnit availableSize) const override;
    10311026    void layoutGridItemForMinSizeComputation(RenderBox&, bool overrideSizeHasChanged) const override;
    10321027    void maximizeTracks(Vector<GridTrack>&, Optional<LayoutUnit>& freeSpace) override;
     
    10341029    bool recomputeUsedFlexFractionIfNeeded(double& flexFraction, LayoutUnit& totalGrowth) const override;
    10351030    LayoutUnit freeSpaceForStretchAutoTracksStep() const override;
     1031    LayoutUnit minContentForChild(RenderBox&) const override;
     1032    LayoutUnit minLogicalSizeForChild(RenderBox&, const Length& childMinSize, LayoutUnit availableSize) const override;
    10361033};
    10371034
     
    10481045}
    10491046
    1050 LayoutUnit DefiniteSizeStrategy::minLogicalWidthForChild(RenderBox& child, Length childMinSize, LayoutUnit availableSize) const
    1051 {
    1052     LayoutUnit marginLogicalWidth =
    1053         GridLayoutFunctions::computeMarginLogicalSizeForChild(*renderGrid(), ForColumns, child);
    1054     return child.computeLogicalWidthInFragmentUsing(MinSize, childMinSize, availableSize, *renderGrid(), nullptr) + marginLogicalWidth;
     1047LayoutUnit DefiniteSizeStrategy::minLogicalSizeForChild(RenderBox& child, const Length& childMinSize, LayoutUnit availableSize) const
     1048{
     1049    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
     1050    LayoutUnit indefiniteSize = direction() == childInlineDirection ? LayoutUnit() : LayoutUnit(-1);
     1051    GridTrackSizingDirection flowAwareDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, direction());
     1052    if (hasRelativeMarginOrPaddingForChild(child, flowAwareDirection) || (direction() != childInlineDirection && hasRelativeOrIntrinsicSizeForChild(child, flowAwareDirection)))
     1053        setOverrideContainingBlockContentSizeForChild(child, direction(), indefiniteSize);
     1054    return GridTrackSizingAlgorithmStrategy::minLogicalSizeForChild(child, childMinSize, availableSize);
    10551055}
    10561056
     
    10891089{
    10901090    return m_algorithm.freeSpace(direction()).value();
     1091}
     1092
     1093LayoutUnit DefiniteSizeStrategy::minContentForChild(RenderBox& child) const
     1094{
     1095    GridTrackSizingDirection childInlineDirection = GridLayoutFunctions::flowAwareDirectionForChild(*renderGrid(), child, ForColumns);
     1096    if (direction() == childInlineDirection && child.needsLayout() && shouldClearOverrideContainingBlockContentSizeForChild(child, ForColumns))
     1097        setOverrideContainingBlockContentSizeForChild(child, childInlineDirection, LayoutUnit());
     1098    return GridTrackSizingAlgorithmStrategy::minContentForChild(child);
    10911099}
    10921100
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h

    r264488 r267503  
    253253    WTF_MAKE_FAST_ALLOCATED;
    254254public:
    255     LayoutUnit minContentForChild(RenderBox&) const;
     255    virtual LayoutUnit minContentForChild(RenderBox&) const;
    256256    LayoutUnit maxContentForChild(RenderBox&) const;
    257257    LayoutUnit minSizeForChild(RenderBox&) const;
     
    268268        : m_algorithm(algorithm) { }
    269269
    270     virtual LayoutUnit minLogicalWidthForChild(RenderBox&, Length childMinSize, LayoutUnit availableSize) const = 0;
     270    virtual LayoutUnit minLogicalSizeForChild(RenderBox&, const Length& childMinSize, LayoutUnit availableSize) const;
    271271    virtual void layoutGridItemForMinSizeComputation(RenderBox&, bool overrideSizeHasChanged) const = 0;
    272272
Note: See TracChangeset for help on using the changeset viewer.