| Index: third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| diff --git a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| index 04699821fd86048d37303e5eaafed4ebdaafd0fe..abb7cd7d838bc88b271b0412ff42f5119fd481f6 100644
|
| --- a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| +++ b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
|
| @@ -1498,7 +1498,20 @@ bool CSSPropertyParser::parseGridGapShorthand(bool important)
|
| return true;
|
| }
|
|
|
| -bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSSValue> templateColumns, bool important)
|
| +PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTemplateColumns(bool important)
|
| +{
|
| + if (!(m_valueList->current() && isForwardSlashOperator(m_valueList->current()) && m_valueList->next()))
|
| + return nullptr;
|
| + if (RefPtrWillBeRawPtr<CSSValue> columnsValue = parseGridTrackList()) {
|
| + if (m_valueList->current())
|
| + return nullptr;
|
| + return columnsValue;
|
| + }
|
| +
|
| + return nullptr;
|
| +}
|
| +
|
| +bool CSSPropertyParser::parseGridTemplateRowsAndAreasAndColumns(bool important)
|
| {
|
| NamedGridAreaMap gridAreaMap;
|
| size_t rowCount = 0;
|
| @@ -1507,10 +1520,10 @@ bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSS
|
| RefPtrWillBeRawPtr<CSSValueList> templateRows = CSSValueList::createSpaceSeparated();
|
|
|
| // At least template-areas strings must be defined.
|
| - if (!m_valueList->current())
|
| + if (!m_valueList->current() || isForwardSlashOperator(m_valueList->current()))
|
| return false;
|
|
|
| - while (m_valueList->current()) {
|
| + while (m_valueList->current() && !isForwardSlashOperator(m_valueList->current())) {
|
| // Handle leading <custom-ident>*.
|
| if (!parseGridLineNames(*m_valueList, *templateRows, trailingIdentWasAdded ? toCSSGridLineNamesValue(templateRows->item(templateRows->length() - 1)) : nullptr))
|
| return false;
|
| @@ -1521,7 +1534,7 @@ bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSS
|
| ++rowCount;
|
|
|
| // Handle template-rows's track-size.
|
| - if (m_valueList->current() && m_valueList->current()->m_unit != CSSParserValue::String) {
|
| + if (m_valueList->current() && !isForwardSlashOperator(m_valueList->current()) && m_valueList->current()->m_unit != CSSParserValue::String) {
|
| RefPtrWillBeRawPtr<CSSValue> value = parseGridTrackSize(*m_valueList);
|
| if (!value)
|
| return false;
|
| @@ -1536,16 +1549,22 @@ bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSS
|
| trailingIdentWasAdded = templateRows->item(templateRows->length() - 1)->isGridLineNamesValue();
|
| }
|
|
|
| - // [<track-list> /]?
|
| - if (templateColumns)
|
| - addProperty(CSSPropertyGridTemplateColumns, templateColumns, important);
|
| - else
|
| - addProperty(CSSPropertyGridTemplateColumns, cssValuePool().createIdentifierValue(CSSValueNone), important);
|
| + RefPtrWillBeRawPtr<CSSValue> columnsValue = nullptr;
|
| + if (m_valueList->current()) {
|
| + ASSERT(isForwardSlashOperator(m_valueList->current()));
|
| + columnsValue = parseGridTemplateColumns(important);
|
| + if (!columnsValue)
|
| + return false;
|
| + // The template-columns <track-list> can't be 'none'.
|
| + if (columnsValue->isPrimitiveValue() && toCSSPrimitiveValue(*columnsValue).getValueID() == CSSValueNone)
|
| + return false;
|
| + }
|
| +
|
| + addProperty(CSSPropertyGridTemplateRows, templateRows.release(), important);
|
| + addProperty(CSSPropertyGridTemplateColumns, columnsValue ? columnsValue.release() : cssValuePool().createIdentifierValue(CSSValueNone), important);
|
|
|
| - // [<line-names>? <string> [<track-size> <line-names>]? ]+
|
| RefPtrWillBeRawPtr<CSSValue> templateAreas = CSSGridTemplateAreasValue::create(gridAreaMap, rowCount, columnCount);
|
| addProperty(CSSPropertyGridTemplateAreas, templateAreas.release(), important);
|
| - addProperty(CSSPropertyGridTemplateRows, templateRows.release(), important);
|
|
|
| return true;
|
| }
|
| @@ -1572,37 +1591,29 @@ bool CSSPropertyParser::parseGridTemplateShorthand(bool important)
|
| return true;
|
| }
|
|
|
| - unsigned index = 0;
|
| - RefPtrWillBeRawPtr<CSSValue> columnsValue = nullptr;
|
| + // 2- <grid-template-rows> / <grid-template-columns>
|
| + RefPtrWillBeRawPtr<CSSValue> rowsValue = nullptr;
|
| if (firstValueIsNone) {
|
| - columnsValue = cssValuePool().createIdentifierValue(CSSValueNone);
|
| + rowsValue = cssValuePool().createIdentifierValue(CSSValueNone);
|
| } else {
|
| - columnsValue = parseGridTrackList();
|
| + rowsValue = parseGridTrackList();
|
| }
|
|
|
| - // 2- <grid-template-columns> / <grid-template-columns> syntax.
|
| - if (columnsValue) {
|
| - if (!(m_valueList->current() && isForwardSlashOperator(m_valueList->current()) && m_valueList->next()))
|
| + if (rowsValue) {
|
| + RefPtrWillBeRawPtr<CSSValue> columnsValue = parseGridTemplateColumns(important);
|
| + if (!columnsValue)
|
| return false;
|
| - index = m_valueList->currentIndex();
|
| - if (RefPtrWillBeRawPtr<CSSValue> rowsValue = parseGridTrackList()) {
|
| - if (m_valueList->current())
|
| - return false;
|
| - addProperty(CSSPropertyGridTemplateColumns, columnsValue, important);
|
| - addProperty(CSSPropertyGridTemplateRows, rowsValue, important);
|
| - addProperty(CSSPropertyGridTemplateAreas, cssValuePool().createIdentifierValue(CSSValueNone), important);
|
| - return true;
|
| - }
|
| - }
|
|
|
| + addProperty(CSSPropertyGridTemplateRows, rowsValue.release(), important);
|
| + addProperty(CSSPropertyGridTemplateColumns, columnsValue.release(), important);
|
| + addProperty(CSSPropertyGridTemplateAreas, cssValuePool().createIdentifierValue(CSSValueNone), important);
|
| + return true;
|
| + }
|
|
|
| - // 3- [<track-list> /]? [<line-names>? <string> [<track-size> <line-names>]? ]+ syntax.
|
| - // The template-columns <track-list> can't be 'none'.
|
| - if (firstValueIsNone)
|
| - return false;
|
| + // 3- [<line-names>? <string> [<track-size> <line-names>]? ]+ syntax.
|
| // It requires to rewind parsing due to previous syntax failures.
|
| - m_valueList->setCurrentIndex(index);
|
| - return parseGridTemplateRowsAndAreas(columnsValue, important);
|
| + m_valueList->setCurrentIndex(0);
|
| + return parseGridTemplateRowsAndAreasAndColumns(important);
|
| }
|
|
|
| bool CSSPropertyParser::parseGridShorthand(bool important)
|
|
|