Changeset 174006 in webkit


Ignore:
Timestamp:
Sep 26, 2014 6:41:57 AM (10 years ago)
Author:
svillar@igalia.com
Message:

[CSS Grid Layout] Fix the handling of infinity in track growth limits
https://bugs.webkit.org/show_bug.cgi?id=137019

Reviewed by Darin Adler.

Source/WebCore:

The growth limit of content sized tracks is initialized to
infinity which is internally represented as -1. We were not
specialcasing this situation, and thus, -1 was used in the
computations as any other value. This change makes the code aware
of the existence of infinites (like when sorting tracks by growth
potential or when initializing the track growth limits).

There was another bug related to infinities. The code that was
replacing a infinite growth limit by a finite one was not using
the proper indexes so the tracks that were being updated were the
wrong ones.

Test: fast/css-grid-layout/grid-content-sized-columns-resolution.html

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
(WebCore::sortByGridTrackGrowthPotential):
(WebCore::RenderGrid::distributeSpaceToTracks):

LayoutTests:

  • fast/css-grid-layout/grid-content-sized-columns-resolution-expected.txt: Added.
  • fast/css-grid-layout/grid-content-sized-columns-resolution.html: Added.
  • fast/css-grid-layout/grid-item-order-in-content-sized-columns-resolution-expected.txt:
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r174002 r174006  
     12014-09-23  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [CSS Grid Layout] Fix the handling of infinity in track growth limits
     4        https://bugs.webkit.org/show_bug.cgi?id=137019
     5
     6        Reviewed by Darin Adler.
     7
     8        * fast/css-grid-layout/grid-content-sized-columns-resolution-expected.txt: Added.
     9        * fast/css-grid-layout/grid-content-sized-columns-resolution.html: Added.
     10        * fast/css-grid-layout/grid-item-order-in-content-sized-columns-resolution-expected.txt:
     11
    1122014-09-26  Lorenzo Tilve  <ltilve@igalia.com>
    213
  • trunk/LayoutTests/fast/css-grid-layout/grid-item-order-in-content-sized-columns-resolution-expected.txt

    r173620 r174006  
    22PASS grid-template-columns is 76px 50px after grid row swap.
    33PASS grid-template-columns is 60px 16px after grid row swap.
    4 PASS grid-template-columns is 68px 16px after grid row swap.
    5 PASS grid-template-columns is 76px 8px after grid row swap.
    6 PASS grid-template-columns is 68px 16px after grid row swap.
     4PASS grid-template-columns is 60px 16px after grid row swap.
     5PASS grid-template-columns is 76px 0px after grid row swap.
     6PASS grid-template-columns is 60px 16px after grid row swap.
    77PASS grid-template-columns is 60px 16px after grid row swap.
    88PASS grid-template-columns is 60px 16px after grid row swap.
  • trunk/Source/WebCore/ChangeLog

    r174002 r174006  
     12014-09-23  Sergio Villar Senin  <svillar@igalia.com>
     2
     3        [CSS Grid Layout] Fix the handling of infinity in track growth limits
     4        https://bugs.webkit.org/show_bug.cgi?id=137019
     5
     6        Reviewed by Darin Adler.
     7
     8        The growth limit of content sized tracks is initialized to
     9        infinity which is internally represented as -1. We were not
     10        specialcasing this situation, and thus, -1 was used in the
     11        computations as any other value. This change makes the code aware
     12        of the existence of infinites (like when sorting tracks by growth
     13        potential or when initializing the track growth limits).
     14
     15        There was another bug related to infinities. The code that was
     16        replacing a infinite growth limit by a finite one was not using
     17        the proper indexes so the tracks that were being updated were the
     18        wrong ones.
     19
     20        Test: fast/css-grid-layout/grid-content-sized-columns-resolution.html
     21
     22        * rendering/RenderGrid.cpp:
     23        (WebCore::RenderGrid::computeUsedBreadthOfGridTracks):
     24        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
     25        (WebCore::sortByGridTrackGrowthPotential):
     26        (WebCore::RenderGrid::distributeSpaceToTracks):
     27
    1282014-09-26  Lorenzo Tilve  <ltilve@igalia.com>
    229
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r173868 r174006  
    308308        track.m_maxBreadth = computeUsedBreadthOfMaxLength(direction, maxTrackBreadth, track.m_usedBreadth);
    309309
    310         track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth);
     310        if (track.m_maxBreadth != infinity)
     311            track.m_maxBreadth = std::max(track.m_maxBreadth, track.m_usedBreadth);
    311312
    312313        if (trackSize.isContentSized())
     
    560561    // FIXME: Split the grid tracks into groups that doesn't overlap a <flex> grid track.
    561562
    562     for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) {
    563         GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIndex[i]);
     563    for (auto trackIndex : sizingData.contentSizedTracksIndex) {
     564        GridIterator iterator(m_grid, direction, trackIndex);
    564565        HashSet<RenderBox*> itemsSet;
    565566        Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
     
    578579        }
    579580
    580         GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[i] : sizingData.rowTracks[i];
     581        GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex];
    581582        if (track.m_maxBreadth == infinity)
    582583            track.m_maxBreadth = track.m_usedBreadth;
     
    618619static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTrack* track2)
    619620{
     621    // This check ensures that we respect the irreflexivity property of the strict weak ordering required by std::sort
     622    // (forall x: NOT x < x).
     623    if (track1->m_maxBreadth == infinity && track2->m_maxBreadth == infinity)
     624        return false;
     625
     626    if (track1->m_maxBreadth == infinity || track2->m_maxBreadth == infinity)
     627        return track2->m_maxBreadth == infinity;
     628
    620629    return (track1->m_maxBreadth - track1->m_usedBreadth) < (track2->m_maxBreadth - track2->m_usedBreadth);
    621630}
     
    632641        GridTrack& track = *tracks[i];
    633642        LayoutUnit trackBreadth = (tracks[i]->*trackGetter)();
    634         LayoutUnit trackGrowthPotential = track.m_maxBreadth - trackBreadth;
     643        bool infiniteGrowthPotential = track.m_maxBreadth == infinity;
     644        LayoutUnit trackGrowthPotential = infiniteGrowthPotential ? track.m_maxBreadth : track.m_maxBreadth - trackBreadth;
    635645        sizingData.distributeTrackVector[i] = trackBreadth;
    636         if (trackGrowthPotential > 0) {
     646        // Let's avoid computing availableLogicalSpaceShare as much as possible as it's a hot spot in performance tests.
     647        if (trackGrowthPotential > 0 || infiniteGrowthPotential) {
    637648            LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tracksSize - i);
    638             LayoutUnit growthShare = std::min(availableLogicalSpaceShare, trackGrowthPotential);
     649            LayoutUnit growthShare = infiniteGrowthPotential ? availableLogicalSpaceShare : std::min(availableLogicalSpaceShare, trackGrowthPotential);
     650            ASSERT(growthShare > 0);
    639651            // We should never shrink any grid track or else we can't guarantee we abide by our min-sizing function.
    640652            sizingData.distributeTrackVector[i] += growthShare;
Note: See TracChangeset for help on using the changeset viewer.