Changeset 274933 in webkit


Ignore:
Timestamp:
Mar 24, 2021 12:44:20 AM (16 months ago)
Author:
commit-queue@webkit.org
Message:

[css-grid] Do not allow negative heights
https://bugs.webkit.org/show_bug.cgi?id=221439

Patch by Rob Buis <rbuis@igalia.com> on 2021-03-24
Reviewed by Javier Fernandez.

Source/WebCore:

Do not allow negative heights in calculations.

Test: fast/css-grid-layout/zero-height-crash.html

  • rendering/GridTrackSizingAlgorithm.cpp:

(WebCore::GridTrackSizingAlgorithm::setup):

  • rendering/GridTrackSizingAlgorithm.h:
  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::computeTrackSizesForDefiniteSize):
(WebCore::RenderGrid::gridGap const):
(WebCore::RenderGrid::computeTrackSizesForIndefiniteSize const):
(WebCore::RenderGrid::availableAlignmentSpaceForChildBeforeStretching const):

LayoutTests:

Add test for this.

  • fast/css-grid-layout/zero-height-crash-expected.txt: Added.
  • fast/css-grid-layout/zero-height-crash.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r274932 r274933  
     12021-03-24  Rob Buis  <rbuis@igalia.com>
     2
     3        [css-grid] Do not allow negative heights
     4        https://bugs.webkit.org/show_bug.cgi?id=221439
     5
     6        Reviewed by Javier Fernandez.
     7
     8        Add test for this.
     9
     10        * fast/css-grid-layout/zero-height-crash-expected.txt: Added.
     11        * fast/css-grid-layout/zero-height-crash.html: Added.
     12
    1132021-03-23  Lauro Moura  <lmoura@igalia.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r274931 r274933  
     12021-03-24  Rob Buis  <rbuis@igalia.com>
     2
     3        [css-grid] Do not allow negative heights
     4        https://bugs.webkit.org/show_bug.cgi?id=221439
     5
     6        Reviewed by Javier Fernandez.
     7
     8        Do not allow negative heights in calculations.
     9
     10        Test: fast/css-grid-layout/zero-height-crash.html
     11
     12        * rendering/GridTrackSizingAlgorithm.cpp:
     13        (WebCore::GridTrackSizingAlgorithm::setup):
     14        * rendering/GridTrackSizingAlgorithm.h:
     15        * rendering/RenderGrid.cpp:
     16        (WebCore::RenderGrid::computeTrackSizesForDefiniteSize):
     17        (WebCore::RenderGrid::gridGap const):
     18        (WebCore::RenderGrid::computeTrackSizesForIndefiniteSize const):
     19        (WebCore::RenderGrid::availableAlignmentSpaceForChildBeforeStretching const):
     20
    1212021-03-23  Tim Horton  <timothy_horton@apple.com>
    222
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp

    r274477 r274933  
    12691269// GridTrackSizingAlgorithm API.
    12701270
    1271 void GridTrackSizingAlgorithm::setup(GridTrackSizingDirection direction, unsigned numTracks, SizingOperation sizingOperation, Optional<LayoutUnit> availableSpace, Optional<LayoutUnit> freeSpace)
     1271void GridTrackSizingAlgorithm::setup(GridTrackSizingDirection direction, unsigned numTracks, SizingOperation sizingOperation, Optional<LayoutUnit> availableSpace)
    12721272{
    12731273    ASSERT(m_needsSetup);
    12741274    m_direction = direction;
    1275     setAvailableSpace(direction, availableSpace);
     1275    setAvailableSpace(direction, availableSpace ? std::max(0_lu, *availableSpace) : availableSpace);
    12761276
    12771277    m_sizingOperation = sizingOperation;
     
    12891289    m_autoSizedTracksForStretchIndex.shrink(0);
    12901290
    1291     setFreeSpace(direction, freeSpace);
     1291    if (availableSpace) {
     1292        LayoutUnit guttersSize = m_renderGrid->guttersSize(m_grid, direction, 0, m_grid.numTracks(direction), this->availableSpace(direction));
     1293        setFreeSpace(direction, *availableSpace - guttersSize);
     1294    } else
     1295        setFreeSpace(direction, WTF::nullopt);
    12921296    tracks(direction).resize(numTracks);
    12931297
  • trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h

    r274477 r274933  
    106106    }
    107107
    108     void setup(GridTrackSizingDirection, unsigned numTracks, SizingOperation, Optional<LayoutUnit> availableSpace, Optional<LayoutUnit> freeSpace);
     108    void setup(GridTrackSizingDirection, unsigned numTracks, SizingOperation, Optional<LayoutUnit> availableSpace);
    109109    void run();
    110110    void reset();
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r274818 r274933  
    146146void RenderGrid::computeTrackSizesForDefiniteSize(GridTrackSizingDirection direction, LayoutUnit availableSpace)
    147147{
    148     LayoutUnit totalGuttersSize = guttersSize(m_grid, direction, 0, m_grid.numTracks(direction), availableSpace);
    149     LayoutUnit freeSpace = availableSpace - totalGuttersSize;
    150 
    151     m_trackSizingAlgorithm.setup(direction, numTracks(direction, m_grid), TrackSizing, availableSpace, freeSpace);
     148    m_trackSizingAlgorithm.setup(direction, numTracks(direction, m_grid), TrackSizing, availableSpace);
    152149    m_trackSizingAlgorithm.run();
    153150
     
    317314LayoutUnit RenderGrid::gridGap(GridTrackSizingDirection direction, Optional<LayoutUnit> availableSize) const
    318315{
     316    ASSERT(!availableSize || *availableSize >= 0);
    319317    const GapLength& gapLength = direction == ForColumns? style().columnGap() : style().rowGap();
    320318    if (gapLength.isNormal())
     
    440438{
    441439    const Grid& grid = algorithm.grid();
    442     algorithm.setup(direction, numTracks(direction, grid), IntrinsicSizeComputation, WTF::nullopt, WTF::nullopt);
     440    algorithm.setup(direction, numTracks(direction, grid), IntrinsicSizeComputation, WTF::nullopt);
    443441    algorithm.run();
    444442
     
    11121110    // compute margins in order to determine the available height before stretching.
    11131111    GridTrackSizingDirection childBlockFlowDirection = GridLayoutFunctions::flowAwareDirectionForChild(*this, child, ForRows);
    1114     return gridAreaBreadthForChild - GridLayoutFunctions::marginLogicalSizeForChild(*this, childBlockFlowDirection, child);
     1112    return std::max(0_lu, gridAreaBreadthForChild - GridLayoutFunctions::marginLogicalSizeForChild(*this, childBlockFlowDirection, child));
    11151113}
    11161114
Note: See TracChangeset for help on using the changeset viewer.