| Index: Source/core/rendering/style/GridResolvedPosition.cpp
|
| diff --git a/Source/core/rendering/style/GridResolvedPosition.cpp b/Source/core/rendering/style/GridResolvedPosition.cpp
|
| index 5c7adcd2f492ee5cc6483f5eb4c89af53fbd377e..7888168dbd7919d47ea83a8774445019aac466c7 100644
|
| --- a/Source/core/rendering/style/GridResolvedPosition.cpp
|
| +++ b/Source/core/rendering/style/GridResolvedPosition.cpp
|
| @@ -15,9 +15,16 @@ static const NamedGridLinesMap& gridLinesForSide(const RenderStyle& style, GridP
|
| return (side == ColumnStartSide || side == ColumnEndSide) ? style.namedGridColumnLines() : style.namedGridRowLines();
|
| }
|
|
|
| -static inline bool isNonExistentNamedLineOrArea(const String& lineName, const RenderStyle& style, GridPositionSide side)
|
| +static inline String implicitNamedGridLineForSide(const String& lineName, GridPositionSide side)
|
| {
|
| - return !style.namedGridArea().contains(lineName) && !gridLinesForSide(style, side).contains(lineName);
|
| + return lineName + ((side == ColumnStartSide || side == RowStartSide) ? "-start" : "-end");
|
| +}
|
| +
|
| +static bool isValidNamedLineOrArea(const String& lineName, const RenderStyle& style, GridPositionSide side)
|
| +{
|
| + const NamedGridLinesMap& gridLineNames = gridLinesForSide(style, side);
|
| +
|
| + return gridLineNames.contains(implicitNamedGridLineForSide(lineName, side)) || gridLineNames.contains(lineName);
|
| }
|
|
|
| static GridPositionSide calculateInitialPositionSide(GridTrackSizingDirection direction)
|
| @@ -42,10 +49,12 @@ void GridResolvedPosition::initialAndFinalPositionsFromStyle(const RenderStyle&
|
| if (initialPosition.isSpan() && finalPosition.isSpan())
|
| finalPosition.setAutoPosition();
|
|
|
| - if (initialPosition.isNamedGridArea() && isNonExistentNamedLineOrArea(initialPosition.namedGridLine(), gridContainerStyle, initialPositionSide))
|
| + // Try to early detect the case of non existing named grid lines. This way we could assume later that
|
| + // GridResolvedPosition::resolveGrisPositionFromStyle() always return a valid resolved position.
|
| + if (initialPosition.isNamedGridArea() && !isValidNamedLineOrArea(initialPosition.namedGridLine(), gridContainerStyle, initialPositionSide))
|
| initialPosition.setAutoPosition();
|
|
|
| - if (finalPosition.isNamedGridArea() && isNonExistentNamedLineOrArea(finalPosition.namedGridLine(), gridContainerStyle, finalPositionSide))
|
| + if (finalPosition.isNamedGridArea() && !isValidNamedLineOrArea(finalPosition.namedGridLine(), gridContainerStyle, finalPositionSide))
|
| finalPosition.setAutoPosition();
|
| }
|
|
|
| @@ -172,9 +181,10 @@ GridResolvedPosition GridResolvedPosition::resolveGridPositionFromStyle(const Re
|
| // ''<custom-ident>-start (for grid-*-start) / <custom-ident>-end'' (for grid-*-end), contributes the first such
|
| // line to the grid item’s placement.
|
| String namedGridLine = position.namedGridLine();
|
| - String implicitNamedGridLine = namedGridLine + ((side == ColumnStartSide || side == RowStartSide) ? "-start" : "-end");
|
| + ASSERT(isValidNamedLineOrArea(namedGridLine, gridContainerStyle, side));
|
| +
|
| const NamedGridLinesMap& gridLineNames = gridLinesForSide(gridContainerStyle, side);
|
| - NamedGridLinesMap::const_iterator implicitLineIter = gridLineNames.find(implicitNamedGridLine);
|
| + NamedGridLinesMap::const_iterator implicitLineIter = gridLineNames.find(implicitNamedGridLineForSide(namedGridLine, side));
|
| if (implicitLineIter != gridLineNames.end())
|
| return adjustGridPositionForSide(implicitLineIter->value[0], side);
|
|
|
| @@ -184,8 +194,10 @@ GridResolvedPosition GridResolvedPosition::resolveGridPositionFromStyle(const Re
|
| if (explicitLineIter != gridLineNames.end())
|
| return adjustGridPositionForSide(explicitLineIter->value[0], side);
|
|
|
| - // FIXME: if none of the above works specs mandate us to treat it as auto. We cannot return auto right here
|
| - // right now because callers expect a resolved position. We need deeper changes to support this use case.
|
| + // If none of the above works specs mandate us to treat it as auto BUT we should have detected it before calling
|
| + // this function in GridResolvedPosition::resolveGridPositionsFromStyle(). We should be also covered by the
|
| + // ASSERT at the beginning of this block.
|
| + ASSERT_NOT_REACHED();
|
| return GridResolvedPosition(0);
|
| }
|
| case AutoPosition:
|
|
|