Changeset 141505 in webkit


Ignore:
Timestamp:
Jan 31, 2013 4:48:05 PM (11 years ago)
Author:
jchaffraix@webkit.org
Message:

[CSS Grid Layout] Support implicit rows and columns
https://bugs.webkit.org/show_bug.cgi?id=103573

Reviewed by Ojan Vafai.

Source/WebCore:

Tests: fast/css-grid-layout/implicit-columns-auto-resolution.html

fast/css-grid-layout/implicit-rows-auto-resolution.html

This change makes us properly initialize our GridTrack vectors's size
so that we can safely query any items during layout.

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::gridTrackSize):
Added this helper function to return the track size from the grid
element's columns' / rows' definitions or the default value.

(WebCore::RenderGrid::maximumIndexInDirection):
Added this helper function to get the maximum index in a direction
taking grid item's implicit indexes into account.

(WebCore::RenderGrid::computedUsedBreadthOfGridTracks):
Changed the funtion to not append the new tracks as we are properly
sized now.

(WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
(WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth):
Updated these functions to use the new helper functions.

(WebCore::RenderGrid::layoutGridItems):
Changed this function to size both vectors when initializing them.
Also removed an unneeded bounds check as it shouldn't be needed anymore.

  • rendering/RenderGrid.h:

Added the new helper functions.

  • rendering/style/GridTrackSize.h:

(WebCore::GridTrackSize::GridTrackSize):
Added a constructor taking a LengthType.

LayoutTests:

  • fast/css-grid-layout/implicit-columns-auto-resolution-expected.txt: Added.
  • fast/css-grid-layout/implicit-columns-auto-resolution.html: Added.
  • fast/css-grid-layout/implicit-rows-auto-resolution-expected.txt: Added.
  • fast/css-grid-layout/implicit-rows-auto-resolution.html: Added.
Location:
trunk
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r141503 r141505  
     12013-01-31  Julien Chaffraix  <jchaffraix@webkit.org>
     2
     3        [CSS Grid Layout] Support implicit rows and columns
     4        https://bugs.webkit.org/show_bug.cgi?id=103573
     5
     6        Reviewed by Ojan Vafai.
     7
     8        * fast/css-grid-layout/implicit-columns-auto-resolution-expected.txt: Added.
     9        * fast/css-grid-layout/implicit-columns-auto-resolution.html: Added.
     10        * fast/css-grid-layout/implicit-rows-auto-resolution-expected.txt: Added.
     11        * fast/css-grid-layout/implicit-rows-auto-resolution.html: Added.
     12
    1132013-01-31  Joanmarie Diggs  <jdiggs@igalia.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r141503 r141505  
     12013-01-31  Julien Chaffraix  <jchaffraix@webkit.org>
     2
     3        [CSS Grid Layout] Support implicit rows and columns
     4        https://bugs.webkit.org/show_bug.cgi?id=103573
     5
     6        Reviewed by Ojan Vafai.
     7
     8        Tests: fast/css-grid-layout/implicit-columns-auto-resolution.html
     9               fast/css-grid-layout/implicit-rows-auto-resolution.html
     10
     11        This change makes us properly initialize our GridTrack vectors's size
     12        so that we can safely query any items during layout.
     13
     14        * rendering/RenderGrid.cpp:
     15        (WebCore::RenderGrid::gridTrackSize):
     16        Added this helper function to return the track size from the grid
     17        element's columns' / rows' definitions or the default value.
     18
     19        (WebCore::RenderGrid::maximumIndexInDirection):
     20        Added this helper function to get the maximum index in a direction
     21        taking grid item's implicit indexes into account.
     22
     23        (WebCore::RenderGrid::computedUsedBreadthOfGridTracks):
     24        Changed the funtion to not append the new tracks as we are properly
     25        sized now.
     26
     27        (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions):
     28        (WebCore::RenderGrid::tracksAreWiderThanMinTrackBreadth):
     29        Updated these functions to use the new helper functions.
     30
     31        (WebCore::RenderGrid::layoutGridItems):
     32        Changed this function to size both vectors when initializing them.
     33        Also removed an unneeded bounds check as it shouldn't be needed anymore.
     34
     35        * rendering/RenderGrid.h:
     36        Added the new helper functions.
     37
     38        * rendering/style/GridTrackSize.h:
     39        (WebCore::GridTrackSize::GridTrackSize):
     40        Added a constructor taking a LengthType.
     41
    1422013-01-31  Joanmarie Diggs  <jdiggs@igalia.com>
    243
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r141163 r141505  
    177177    Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTracks;
    178178    for (size_t i = 0; i < trackStyles.size(); ++i) {
    179         GridTrack track;
     179        GridTrack& track = tracks[i];
    180180        const Length& minTrackBreadth = trackStyles[i].minTrackBreadth();
    181181        const Length& maxTrackBreadth = trackStyles[i].maxTrackBreadth();
     
    187187
    188188        availableLogicalSpace -= track.m_usedBreadth;
    189 
    190         tracks.append(track);
    191189    }
    192190
     
    239237}
    240238
     239const GridTrackSize& RenderGrid::gridTrackSize(TrackSizingDirection direction, size_t i)
     240{
     241    const Vector<GridTrackSize>& trackStyles = (direction == ForColumns) ? style()->gridColumns() : style()->gridRows();
     242    if (i >= trackStyles.size()) {
     243        // FIXME: This should match the default grid sizing (https://webkit.org/b/103333)
     244        DEFINE_STATIC_LOCAL(GridTrackSize, defaultAutoSize, (Auto));
     245        return defaultAutoSize;
     246    }
     247    return trackStyles[i];
     248}
     249
     250size_t RenderGrid::maximumIndexInDirection(TrackSizingDirection direction) const
     251{
     252    const Vector<GridTrackSize>& trackStyles = (direction == ForColumns) ? style()->gridColumns() : style()->gridRows();
     253
     254    size_t maximumIndex = trackStyles.size();
     255
     256    for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
     257        GridPosition position = (direction == ForColumns) ? child->style()->gridItemColumn() : child->style()->gridItemRow();
     258        maximumIndex = std::max(maximumIndex, resolveGridPosition(position) + 1);
     259    }
     260
     261    return maximumIndex;
     262}
     263
    241264LayoutUnit RenderGrid::minContentForChild(RenderBox* child, TrackSizingDirection direction, Vector<GridTrack>& columnTracks)
    242265{
     
    285308    // FIXME: Split the grid tracks once we support spanning or fractions (step 1 and 2 of the algorithm).
    286309
    287     const Vector<GridTrackSize>& trackStyles = (direction == ForColumns) ? style()->gridColumns() : style()->gridRows();
    288310    Vector<GridTrack>& tracks = (direction == ForColumns) ? columnTracks : rowTracks;
    289311
    290312    for (size_t i = 0; i < tracks.size(); ++i) {
     313        const GridTrackSize& trackSize = gridTrackSize(direction, i);
    291314        GridTrack& track = tracks[i];
    292         const Length& minTrackBreadth = trackStyles[i].minTrackBreadth();
     315        const Length& minTrackBreadth = trackSize.minTrackBreadth();
    293316        if (minTrackBreadth.isMinContent() || minTrackBreadth.isMaxContent()) {
    294317            LayoutUnit oldUsedBreadth = track.m_usedBreadth;
     
    303326        }
    304327
    305         const Length& maxTrackBreadth = trackStyles[i].maxTrackBreadth();
     328        const Length& maxTrackBreadth = trackSize.maxTrackBreadth();
    306329        if (maxTrackBreadth.isMinContent() || maxTrackBreadth.isMaxContent())
    307330            resolveContentBasedTrackSizingFunctionsForItems(direction, columnTracks, rowTracks, i, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
     
    365388bool RenderGrid::tracksAreWiderThanMinTrackBreadth(TrackSizingDirection direction, const Vector<GridTrack>& tracks)
    366389{
    367     const Vector<GridTrackSize>& trackStyles = (direction == ForColumns) ? style()->gridColumns() : style()->gridRows();
    368     for (size_t i = 0; i < trackStyles.size(); ++i) {
    369         const Length& minTrackBreadth = trackStyles[i].minTrackBreadth();
     390    for (size_t i = 0; i < tracks.size(); ++i) {
     391        const GridTrackSize& trackSize = gridTrackSize(direction, i);
     392        const Length& minTrackBreadth = trackSize.minTrackBreadth();
    370393        if (computeUsedBreadthOfMinLength(direction, minTrackBreadth) > tracks[i].m_usedBreadth)
    371394            return false;
     
    377400void RenderGrid::layoutGridItems()
    378401{
    379     Vector<GridTrack> columnTracks, rowTracks;
     402    Vector<GridTrack> columnTracks(maximumIndexInDirection(ForColumns));
     403    Vector<GridTrack> rowTracks(maximumIndexInDirection(ForRows));
    380404    computedUsedBreadthOfGridTracks(ForColumns, columnTracks, rowTracks);
    381405    ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, columnTracks));
     
    389413        size_t rowTrack = resolveGridPosition(child->style()->gridItemRow());
    390414
    391         // FIXME: Properly support implicit rows and columns (bug 103573).
    392         if (columnTrack < columnTracks.size() && rowTrack < rowTracks.size()) {
    393             // Because the grid area cannot be styled, we don't need to adjust
    394             // the grid breadth to account for 'box-sizing'.
    395             LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOverrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogicalWidth() : LayoutUnit();
    396             LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOverrideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogicalHeight() : LayoutUnit();
    397 
    398             if (oldOverrideContainingBlockContentLogicalWidth != columnTracks[columnTrack].m_usedBreadth || oldOverrideContainingBlockContentLogicalHeight != rowTracks[rowTrack].m_usedBreadth)
    399                 child->setNeedsLayout(true, MarkOnlyThis);
    400 
    401             child->setOverrideContainingBlockContentLogicalWidth(columnTracks[columnTrack].m_usedBreadth);
    402             child->setOverrideContainingBlockContentLogicalHeight(rowTracks[rowTrack].m_usedBreadth);
    403 
    404         }
     415        // Because the grid area cannot be styled, we don't need to adjust
     416        // the grid breadth to account for 'box-sizing'.
     417        LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child->hasOverrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogicalWidth() : LayoutUnit();
     418        LayoutUnit oldOverrideContainingBlockContentLogicalHeight = child->hasOverrideContainingBlockLogicalHeight() ? child->overrideContainingBlockContentLogicalHeight() : LayoutUnit();
     419
     420        if (oldOverrideContainingBlockContentLogicalWidth != columnTracks[columnTrack].m_usedBreadth || oldOverrideContainingBlockContentLogicalHeight != rowTracks[rowTrack].m_usedBreadth)
     421            child->setNeedsLayout(true, MarkOnlyThis);
     422
     423        child->setOverrideContainingBlockContentLogicalWidth(columnTracks[columnTrack].m_usedBreadth);
     424        child->setOverrideContainingBlockContentLogicalHeight(rowTracks[rowTrack].m_usedBreadth);
    405425
    406426        // FIXME: Grid items should stretch to fill their cells. Once we
  • trunk/Source/WebCore/rendering/RenderGrid.h

    r141163 r141505  
    6363    void distributeSpaceToTracks(Vector<GridTrack*>&, Vector<GridTrack*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter, AccumulatorGrowFunction, LayoutUnit& availableLogicalSpace);
    6464
     65    const GridTrackSize& gridTrackSize(TrackSizingDirection, size_t);
     66    size_t maximumIndexInDirection(TrackSizingDirection) const;
     67
    6568    LayoutUnit minContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
    6669    LayoutUnit maxContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
  • trunk/Source/WebCore/rendering/style/GridTrackSize.h

    r141317 r141505  
    4343class GridTrackSize {
    4444public:
    45     GridTrackSize()
     45    GridTrackSize(LengthType type = Undefined)
    4646        : m_type(LengthTrackSizing)
    47         , m_minTrackBreadth(Undefined)
    48         , m_maxTrackBreadth(Undefined)
     47        , m_minTrackBreadth(type)
     48        , m_maxTrackBreadth(type)
    4949    {
    5050    }
Note: See TracChangeset for help on using the changeset viewer.