void GridResolvedPosition::adjustGridPositionsFromStyle(const RenderStyle& gridContainerStyle, GridPosition& initialPosition, GridPosition& finalPosition, GridPositionSide initialPositionSide, GridPositionSide finalPositionSide) { ASSERT(isColumnSide(initialPositionSide) == isColumnSide(finalPositionSide)); // We must handle the placement error handling code here instead of in the StyleAdjuster because we don't want to // overwrite the specified values. if (initialPosition.isSpan() && finalPosition.isSpan()) finalPosition.setAutoPosition(); // Try to early detect the case of non existing named grid lines. This way we could assume later that // GridResolvedPosition::resolveGrisPositionFromStyle() won't require the autoplacement to run, i.e., it'll always return a // valid resolved position. if (initialPosition.isNamedGridArea() && isNonExistentNamedLineOrArea(initialPosition.namedGridLine(), gridContainerStyle, initialPositionSide)) initialPosition.setAutoPosition(); if (finalPosition.isNamedGridArea() && isNonExistentNamedLineOrArea(finalPosition.namedGridLine(), gridContainerStyle, finalPositionSide)) finalPosition.setAutoPosition(); // If the grid item has an automatic position and a grid span for a named line in a given dimension, instead treat the grid span as one. if (initialPosition.isAuto() && finalPosition.isSpan() && !finalPosition.namedGridLine().isNull()) finalPosition.setSpanPosition(1, String()); if (finalPosition.isAuto() && initialPosition.isSpan() && !initialPosition.namedGridLine().isNull()) initialPosition.setSpanPosition(1, String()); }
std::unique_ptr<GridSpan> GridResolvedPosition::resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle& gridContainerStyle, const GridResolvedPosition& resolvedOppositePosition, const GridPosition& position, GridPositionSide side) { ASSERT(position.isSpan()); ASSERT(!position.namedGridLine().isNull()); // Negative positions are not allowed per the specification and should have been handled during parsing. ASSERT(position.spanPosition() > 0); const NamedGridLinesMap& gridLinesNames = isColumnSide(side) ? gridContainerStyle.namedGridColumnLines() : gridContainerStyle.namedGridRowLines(); NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine()); // If there is no named grid line of that name, we resolve the position to 'auto' (which is equivalent to 'span 1' in this case). // See http://lists.w3.org/Archives/Public/www-style/2013Jun/0394.html. if (it == gridLinesNames.end()) return std::make_unique<GridSpan>(resolvedOppositePosition, resolvedOppositePosition); if (side == RowStartSide || side == ColumnStartSide) return resolveRowStartColumnStartNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, it->value); return resolveRowEndColumnEndNamedGridLinePositionAgainstOppositePosition(resolvedOppositePosition, position, it->value); }
GridResolvedPosition GridResolvedPosition::resolveNamedGridLinePositionFromStyle(const RenderStyle& gridContainerStyle, const GridPosition& position, GridPositionSide side) { ASSERT(!position.namedGridLine().isNull()); const NamedGridLinesMap& gridLinesNames = isColumnSide(side) ? gridContainerStyle.namedGridColumnLines() : gridContainerStyle.namedGridRowLines(); NamedGridLinesMap::const_iterator it = gridLinesNames.find(position.namedGridLine()); if (it == gridLinesNames.end()) { if (position.isPositive()) return 0; const size_t lastLine = explicitGridSizeForSide(gridContainerStyle, side); return GridResolvedPosition::adjustGridPositionForSide(lastLine, side); } size_t namedGridLineIndex; if (position.isPositive()) namedGridLineIndex = std::min<size_t>(position.integerPosition(), it->value.size()) - 1; else namedGridLineIndex = std::max<int>(it->value.size() - abs(position.integerPosition()), 0); return GridResolvedPosition::adjustGridPositionForSide(it->value[namedGridLineIndex], side); }
static unsigned explicitGridSizeForSide(const RenderStyle& gridContainerStyle, GridPositionSide side, unsigned autoRepeatTracksCount) { return isColumnSide(side) ? GridPositionsResolver::explicitGridColumnCount(gridContainerStyle, autoRepeatTracksCount) : GridPositionsResolver::explicitGridRowCount(gridContainerStyle, autoRepeatTracksCount); }
static inline const NamedGridLinesMap& gridLinesForSide(const RenderStyle& style, GridPositionSide side) { return isColumnSide(side) ? style.namedGridColumnLines() : style.namedGridRowLines(); }
static size_t explicitGridSizeForSide(const RenderStyle& gridContainerStyle, GridPositionSide side) { return isColumnSide(side) ? gridContainerStyle.gridColumns().size() : gridContainerStyle.gridRows().size(); }