Index: Source/core/css/parser/CSSPropertyParser.cpp |
diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp |
index 119ea6bf959ffa64c81bf48d7c10d1bf913d9a73..77a81ee80bbf4bea5da7536d771fe489c1be426d 100644 |
--- a/Source/core/css/parser/CSSPropertyParser.cpp |
+++ b/Source/core/css/parser/CSSPropertyParser.cpp |
@@ -3082,12 +3082,12 @@ PassRefPtrWillBeRawPtr<CSSValueList> CSSPropertyParser::parseAnimationPropertyLi |
return list.release(); |
} |
-static inline bool isCSSWideKeyword(CSSParserValue& value) |
+static inline bool isCSSWideKeyword(const CSSParserValue& value) |
{ |
return value.id == CSSValueInitial || value.id == CSSValueInherit || value.id == CSSValueUnset || value.id == CSSValueDefault; |
} |
-static inline bool isValidCustomIdentForGridPositions(CSSParserValue& value) |
+static inline bool isValidCustomIdentForGridPositions(const CSSParserValue& value) |
{ |
// FIXME: we need a more general solution for <custom-ident> in all properties. |
return value.unit == CSSPrimitiveValue::CSS_IDENT && value.id != CSSValueSpan && value.id != CSSValueAuto && !isCSSWideKeyword(value); |
@@ -3228,12 +3228,8 @@ bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSS |
while (m_valueList->current()) { |
// Handle leading <custom-ident>*. |
- if (trailingIdentWasAdded) { |
- // A row's trailing ident must be concatenated with the next row's leading one. |
- maybeParseGridLineNames(*m_valueList, *templateRows, toCSSGridLineNamesValue(templateRows->item(templateRows->length() - 1))); |
- } else { |
- maybeParseGridLineNames(*m_valueList, *templateRows); |
- } |
+ if (!parseGridLineNames(*m_valueList, *templateRows, trailingIdentWasAdded ? toCSSGridLineNamesValue(templateRows->item(templateRows->length() - 1)) : nullptr)) |
+ return false; |
// Handle a template-area's row. |
if (!parseGridTemplateAreasRow(gridAreaMap, rowCount, columnCount)) |
@@ -3253,7 +3249,8 @@ bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSS |
// This will handle the trailing/leading <custom-ident>* in the grammar. |
const CSSParserValue* current = m_valueList->current(); |
trailingIdentWasAdded = current && current->unit == CSSParserValue::ValueList && current->valueList->size() > 0; |
- maybeParseGridLineNames(*m_valueList, *templateRows); |
+ if (!parseGridLineNames(*m_valueList, *templateRows)) |
+ return false; |
} |
// [<track-list> /]? |
@@ -3267,7 +3264,6 @@ bool CSSPropertyParser::parseGridTemplateRowsAndAreas(PassRefPtrWillBeRawPtr<CSS |
addProperty(CSSPropertyGridTemplateAreas, templateAreas.release(), important); |
addProperty(CSSPropertyGridTemplateRows, templateRows.release(), important); |
- |
return true; |
} |
@@ -3441,34 +3437,44 @@ bool CSSPropertyParser::parseSingleGridAreaLonghand(RefPtrWillBeRawPtr<CSSValue> |
return true; |
} |
-void CSSPropertyParser::maybeParseGridLineNames(CSSParserValueList& inputList, CSSValueList& valueList, CSSGridLineNamesValue* previousNamedAreaTrailingLineNames) |
+static inline bool isClosingBracket(const CSSParserValue& value) |
{ |
- if (!inputList.current() || inputList.current()->unit != CSSParserValue::ValueList) |
- return; |
+ return value.unit == CSSParserValue::Operator && value.iValue == ']'; |
+} |
- CSSParserValueList* identList = inputList.current()->valueList; |
- if (!identList->size()) { |
- inputList.next(); |
- return; |
- } |
+bool CSSPropertyParser::parseGridLineNames(CSSParserValueList& inputList, CSSValueList& valueList, CSSGridLineNamesValue* previousNamedAreaTrailingLineNames) |
+{ |
+ if (!inputList.current() || inputList.current()->unit != CSSParserValue::Operator || inputList.current()->iValue != '[') |
+ return true; |
- // Need to ensure the identList is at the heading index, since the parserList might have been rewound. |
- identList->setCurrentIndex(0); |
+ // Skip '[' |
+ inputList.next(); |
RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = previousNamedAreaTrailingLineNames; |
if (!lineNames) |
lineNames = CSSGridLineNamesValue::create(); |
- while (CSSParserValue* identValue = identList->current()) { |
- if (identValue->unit != CSSPrimitiveValue::CSS_IDENT) |
- return; |
+ |
+ while (CSSParserValue* identValue = inputList.current()) { |
+ if (isClosingBracket(*identValue)) |
+ break; |
+ |
+ if (!isValidCustomIdentForGridPositions(*identValue)) |
+ return false; |
+ |
RefPtrWillBeRawPtr<CSSPrimitiveValue> lineName = createPrimitiveCustomIdentValue(identValue); |
lineNames->append(lineName.release()); |
- identList->next(); |
+ inputList.next(); |
} |
+ |
+ if (!inputList.current() || !isClosingBracket(*inputList.current())) |
+ return false; |
+ |
if (!previousNamedAreaTrailingLineNames) |
valueList.append(lineNames.release()); |
+ // Consume ']' |
inputList.next(); |
+ return true; |
} |
PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList() |
@@ -3482,8 +3488,9 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList() |
} |
RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); |
- // Handle leading <ident>*. |
- maybeParseGridLineNames(*m_valueList, *values); |
+ // Handle leading <custom-ident>*. |
+ if (!parseGridLineNames(*m_valueList, *values)) |
+ return nullptr; |
bool seenTrackSizeOrRepeatFunction = false; |
while (CSSParserValue* currentValue = m_valueList->current()) { |
@@ -3500,8 +3507,9 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseGridTrackList() |
values->append(value); |
seenTrackSizeOrRepeatFunction = true; |
} |
- // This will handle the trailing <ident>* in the grammar. |
- maybeParseGridLineNames(*m_valueList, *values); |
+ // This will handle the trailing <custom-ident>* in the grammar. |
+ if (!parseGridLineNames(*m_valueList, *values)) |
+ return nullptr; |
} |
// We should have found a <track-size> or else it is not a valid <track-list> |
@@ -3524,8 +3532,9 @@ bool CSSPropertyParser::parseGridTrackRepeatFunction(CSSValueList& list) |
arguments->next(); // Skip the repetition count. |
arguments->next(); // Skip the comma. |
- // Handle leading <ident>*. |
- maybeParseGridLineNames(*arguments, *repeatedValues); |
+ // Handle leading <custom-ident>*. |
+ if (!parseGridLineNames(*arguments, *repeatedValues)) |
+ return false; |
size_t numberOfTracks = 0; |
while (arguments->current()) { |
@@ -3536,8 +3545,9 @@ bool CSSPropertyParser::parseGridTrackRepeatFunction(CSSValueList& list) |
repeatedValues->append(trackSize); |
++numberOfTracks; |
- // This takes care of any trailing <ident>* in the grammar. |
- maybeParseGridLineNames(*arguments, *repeatedValues); |
+ // This takes care of any trailing <custom-ident>* in the grammar. |
+ if (!parseGridLineNames(*arguments, *repeatedValues)) |
+ return false; |
} |
// We should have found at least one <track-size> or else it is not a valid <track-list>. |