Changeset 197857 in webkit


Ignore:
Timestamp:
Mar 9, 2016 6:26:39 AM (8 years ago)
Author:
Manuel Rego Casasnovas
Message:

[css-grid] Allow to place positioned grid items on the padding
https://bugs.webkit.org/show_bug.cgi?id=155199

Reviewed by Sergio Villar Senin.

Source/WebCore:

According to the following discussion on the CSS WG mailing list,
we should be able to place positioned grid items on the padding directly:
https://lists.w3.org/Archives/Public/www-style/2015Nov/0070.html

This means that a positioned grid item can be placed on the padding itself.
The "auto" value resolves to the padding edges (0th and -0th lines).
So if a positioned item is placed with: grid-column: auto / 1;
it'd be placed on the padding, from line 0th to 1st line.

On top of that, we've to detect properly the first and last explicit
grid lines during the layout of positioned grid items.
We have to consider that the grid can have implicit tracks created
previously by regular grid items.

Tests: fast/css-grid-layout/grid-positioned-items-padding.html

fast/css-grid-layout/grid-positioned-items-within-grid-implicit-track.html

  • rendering/RenderGrid.cpp:

(WebCore::RenderGrid::offsetAndBreadthForPositionedChild):

LayoutTests:

Add new tests and updated results in a current one.

  • fast/css-grid-layout/grid-positioned-items-implicit-grid.html:
  • fast/css-grid-layout/grid-positioned-items-padding-expected.txt: Added.
  • fast/css-grid-layout/grid-positioned-items-padding.html: Added.
  • fast/css-grid-layout/grid-positioned-items-within-grid-implicit-track-expected.txt: Added.
  • fast/css-grid-layout/grid-positioned-items-within-grid-implicit-track.html: Added.
Location:
trunk
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r197856 r197857  
     12016-03-09  Manuel Rego Casasnovas  <rego@igalia.com>
     2
     3        [css-grid] Allow to place positioned grid items on the padding
     4        https://bugs.webkit.org/show_bug.cgi?id=155199
     5
     6        Reviewed by Sergio Villar Senin.
     7
     8        Add new tests and updated results in a current one.
     9
     10        * fast/css-grid-layout/grid-positioned-items-implicit-grid.html:
     11        * fast/css-grid-layout/grid-positioned-items-padding-expected.txt: Added.
     12        * fast/css-grid-layout/grid-positioned-items-padding.html: Added.
     13        * fast/css-grid-layout/grid-positioned-items-within-grid-implicit-track-expected.txt: Added.
     14        * fast/css-grid-layout/grid-positioned-items-within-grid-implicit-track.html: Added.
     15
    1162016-03-09  Andreas Kling  <akling@apple.com>
    217
  • trunk/LayoutTests/fast/css-grid-layout/grid-positioned-items-implicit-grid.html

    r192054 r197857  
    4343<div class="grid grid-columns-rows">
    4444    <div class="sizedToGridArea absolute secondRowSecondColumn"
    45         data-offset-x="15" data-offset-y="15" data-expected-width="230" data-expected-height="230">
     45        data-offset-x="115" data-offset-y="65" data-expected-width="115" data-expected-height="165">
    4646    </div>
    4747    <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
     
    4949    </div>
    5050    <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
    51         data-offset-x="15" data-offset-y="15" data-expected-width="230" data-expected-height="230">
     51        data-offset-x="115" data-offset-y="65" data-expected-width="115" data-expected-height="165">
    5252    </div>
    5353</div>
  • trunk/Source/WebCore/ChangeLog

    r197856 r197857  
     12016-03-09  Manuel Rego Casasnovas  <rego@igalia.com>
     2
     3        [css-grid] Allow to place positioned grid items on the padding
     4        https://bugs.webkit.org/show_bug.cgi?id=155199
     5
     6        Reviewed by Sergio Villar Senin.
     7
     8        According to the following discussion on the CSS WG mailing list,
     9        we should be able to place positioned grid items on the padding directly:
     10        https://lists.w3.org/Archives/Public/www-style/2015Nov/0070.html
     11
     12        This means that a positioned grid item can be placed on the padding itself.
     13        The "auto" value resolves to the padding edges (0th and -0th lines).
     14        So if a positioned item is placed with: grid-column: auto / 1;
     15        it'd be placed on the padding, from line 0th to 1st line.
     16
     17        On top of that, we've to detect properly the first and last explicit
     18        grid lines during the layout of positioned grid items.
     19        We have to consider that the grid can have implicit tracks created
     20        previously by regular grid items.
     21
     22        Tests: fast/css-grid-layout/grid-positioned-items-padding.html
     23               fast/css-grid-layout/grid-positioned-items-within-grid-implicit-track.html
     24
     25        * rendering/RenderGrid.cpp:
     26        (WebCore::RenderGrid::offsetAndBreadthForPositionedChild):
     27
    1282016-03-09  Andreas Kling  <akling@apple.com>
    229
  • trunk/Source/WebCore/rendering/RenderGrid.cpp

    r197854 r197857  
    14851485{
    14861486    ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode());
     1487    bool isRowAxis = direction == ForColumns;
    14871488
    14881489    GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(style(), child, direction);
    14891490    if (positions.isIndefinite()) {
    14901491        offset = LayoutUnit();
    1491         breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight();
     1492        breadth = isRowAxis ? clientLogicalWidth() : clientLogicalHeight();
    14921493        return;
    14931494    }
    1494     positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smallestRowStart);
    1495 
    1496     GridPosition startPosition = (direction == ForColumns) ? child.style().gridItemColumnStart() : child.style().gridItemRowStart();
    1497     GridPosition endPosition = (direction == ForColumns) ? child.style().gridItemColumnEnd() : child.style().gridItemRowEnd();
    1498     size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridRowCount()) - 1;
     1495
     1496    // For positioned items we cannot use GridSpan::translate() because we could end up with negative values, as the positioned items do not create implicit tracks per spec.
     1497    int smallestStart = std::abs(isRowAxis ? m_smallestColumnStart : m_smallestRowStart);
     1498    int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition() + smallestStart;
     1499    int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() + smallestStart;
     1500
     1501    GridPosition startPosition = isRowAxis ? child.style().gridItemColumnStart() : child.style().gridItemRowStart();
     1502    GridPosition endPosition = isRowAxis ? child.style().gridItemColumnEnd() : child.style().gridItemRowEnd();
     1503    int firstExplicitLine = smallestStart;
     1504    int lastExplicitLine = (isRowAxis ? GridResolvedPosition::explicitGridColumnCount(style()) : GridResolvedPosition::explicitGridRowCount(style())) + smallestStart;
    14991505
    15001506    bool startIsAuto = startPosition.isAuto()
    15011507        || (startPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(startPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnStartSide : RowStartSide))
    1502         || (positions.resolvedInitialPosition() > lastTrackIndex);
     1508        || (resolvedInitialPosition < firstExplicitLine)
     1509        || (resolvedInitialPosition > lastExplicitLine);
    15031510    bool endIsAuto = endPosition.isAuto()
    15041511        || (endPosition.isNamedGridArea() && GridResolvedPosition::isNonExistentNamedLineOrArea(endPosition.namedGridLine(), style(), (direction == ForColumns) ? ColumnEndSide : RowEndSide))
    1505         || (positions.resolvedFinalPosition() - 1 > lastTrackIndex);
    1506 
    1507     unsigned firstPosition = 0;
    1508     unsigned initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition();
    1509     unsigned lastPosition = lastTrackIndex;
    1510     unsigned finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition() - 1;
    1511 
    1512     // Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it.
    1513     initialPosition = std::min(initialPosition, lastPosition);
    1514     finalPosition = std::min(finalPosition, lastPosition);
    1515 
    1516     LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ?  m_columnPositions[initialPosition] : m_rowPositions[initialPosition];
    1517     LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : logicalHeight() : (direction == ForColumns) ?  m_columnPositions[finalPosition + 1] : m_rowPositions[finalPosition + 1];
     1512        || (resolvedFinalPosition < firstExplicitLine)
     1513        || (resolvedFinalPosition > lastExplicitLine);
     1514
     1515    unsigned initialPosition = startIsAuto ? 0 : resolvedInitialPosition;
     1516    unsigned finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition;
     1517
     1518    LayoutUnit start = startIsAuto ? LayoutUnit() : isRowAxis ?  m_columnPositions[initialPosition] : m_rowPositions[initialPosition];
     1519    LayoutUnit end = endIsAuto ? (isRowAxis ? logicalWidth() : logicalHeight()) : (isRowAxis ?  m_columnPositions[finalPosition] : m_rowPositions[finalPosition]);
    15181520
    15191521    breadth = end - start;
    15201522
    15211523    if (startIsAuto)
    1522         breadth -= (direction == ForColumns) ? borderStart() : borderBefore();
     1524        breadth -= isRowAxis ? borderStart() : borderBefore();
    15231525    else
    1524         start -= ((direction == ForColumns) ? borderStart() : borderBefore());
     1526        start -= isRowAxis ? borderStart() : borderBefore();
    15251527
    15261528    if (endIsAuto) {
    1527         breadth -= (direction == ForColumns) ? borderEnd() : borderAfter();
     1529        breadth -= isRowAxis ? borderEnd() : borderAfter();
    15281530        breadth -= scrollbarLogicalWidth();
    15291531    }
     
    15341536        // If column/row start is "auto" the static position has been already set in prepareChildForPositionedLayout().
    15351537        RenderLayer* childLayer = child.layer();
    1536         if (direction == ForColumns)
     1538        if (isRowAxis)
    15371539            childLayer->setStaticInlinePosition(borderStart() + offset);
    15381540        else
Note: See TracChangeset for help on using the changeset viewer.