Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(391)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 1607463004: [css-grid] Allow to place positioned grid items on the padding (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Forgot to remove <html> from test Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-positioned-items-padding.html ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
index 390a4410d79de9baacadd9c36c8bf90a5fd4460c..3fa6729bf8e321f8586f2c87bdac547cc06c1d28 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -1486,47 +1486,48 @@ void LayoutGrid::layoutPositionedObjects(bool relayoutChildren, PositionedLayout
void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, GridTrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth)
{
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode());
+ bool isForColumns = direction == ForColumns;
GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction);
if (positions.isIndefinite()) {
offset = LayoutUnit();
- breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight();
+ breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight();
return;
}
- positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smallestRowStart);
- GridPosition startPosition = (direction == ForColumns) ? child.style()->gridColumnStart() : child.style()->gridRowStart();
- GridPosition endPosition = (direction == ForColumns) ? child.style()->gridColumnEnd() : child.style()->gridRowEnd();
- size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridRowCount()) - 1;
+ // 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.
+ int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRowStart);
+ int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition() + smallestStart;
+ int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() + smallestStart;
+
+ GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart();
+ GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : child.style()->gridRowEnd();
+ int lastExplicitLine = isForColumns ? gridColumnCount() : gridRowCount();
bool startIsAuto = startPosition.isAuto()
|| (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::initialPositionSide(direction)))
- || (positions.resolvedInitialPosition() > lastTrackIndex);
+ || (resolvedInitialPosition < 0)
+ || (resolvedInitialPosition > lastExplicitLine);
bool endIsAuto = endPosition.isAuto()
|| (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalPositionSide(direction)))
- || (positions.resolvedFinalPosition() - 1 > lastTrackIndex);
-
- size_t firstPosition = 0;
- size_t initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition();
- size_t lastPosition = lastTrackIndex;
- size_t finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition() - 1;
+ || (resolvedFinalPosition < 0)
+ || (resolvedFinalPosition > lastExplicitLine);
- // Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it.
- initialPosition = std::min(initialPosition, lastPosition);
- finalPosition = std::min(finalPosition, lastPosition);
+ size_t initialPosition = startIsAuto ? 0 : resolvedInitialPosition;
+ size_t finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition;
- LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition] : m_rowPositions[initialPosition];
- LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : logicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition + 1] : m_rowPositions[finalPosition + 1];
+ LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPositions[initialPosition] : m_rowPositions[initialPosition];
+ LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight() : isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPosition];
breadth = end - start;
if (startIsAuto)
- breadth -= (direction == ForColumns) ? borderStart() : borderBefore();
+ breadth -= isForColumns ? borderStart() : borderBefore();
else
- start -= ((direction == ForColumns) ? borderStart() : borderBefore());
+ start -= isForColumns ? borderStart() : borderBefore();
if (endIsAuto) {
- breadth -= (direction == ForColumns) ? borderEnd() : borderAfter();
+ breadth -= isForColumns ? borderEnd() : borderAfter();
breadth -= scrollbarLogicalWidth();
}
@@ -1535,7 +1536,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid
if (child.parent() == this && !startIsAuto) {
// If column/row start is "auto" the static position has been already set in prepareChildForPositionedLayout().
PaintLayer* childLayer = child.layer();
- if (direction == ForColumns)
+ if (isForColumns)
childLayer->setStaticInlinePosition(borderStart() + offset);
else
childLayer->setStaticBlockPosition(borderBefore() + offset);
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-positioned-items-padding.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698