Chromium Code Reviews| Index: Source/core/css/parser/CSSPropertyParser.cpp |
| diff --git a/Source/core/css/parser/CSSPropertyParser.cpp b/Source/core/css/parser/CSSPropertyParser.cpp |
| index 5c88c54ae81208312709032cb2c521cefb9ec113..bad0867e2638997131556c8ff4ff1e33e1ecc7ff 100644 |
| --- a/Source/core/css/parser/CSSPropertyParser.cpp |
| +++ b/Source/core/css/parser/CSSPropertyParser.cpp |
| @@ -79,6 +79,7 @@ CSSPropertyParser::CSSPropertyParser(CSSParserValueList* valueList, |
| const CSSParserContext& context, WillBeHeapVector<CSSProperty, 256>& parsedProperties, |
| StyleRule::Type ruleType) |
| : m_valueList(valueList) |
| + , m_range(nullptr) |
| , m_context(context) |
| , m_parsedProperties(parsedProperties) |
| , m_ruleType(ruleType) |
| @@ -89,12 +90,13 @@ CSSPropertyParser::CSSPropertyParser(CSSParserValueList* valueList, |
| } |
| bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool important, |
| - CSSParserValueList* valueList, const CSSParserContext& context, |
| + CSSParserValueList* valueList, CSSParserTokenRange* range, const CSSParserContext& context, |
|
Timothy Loh
2015/09/03 02:05:53
Having the token range as a pointer is odd, I'd ju
rwlbuis
2015/09/03 22:27:54
Done.
|
| WillBeHeapVector<CSSProperty, 256>& parsedProperties, StyleRule::Type ruleType) |
| { |
| int parsedPropertiesSize = parsedProperties.size(); |
| CSSPropertyParser parser(valueList, context, parsedProperties, ruleType); |
| + parser.m_range = range; |
| CSSPropertyID resolvedProperty = resolveCSSPropertyID(unresolvedProperty); |
| bool parseSuccess; |
| @@ -336,6 +338,15 @@ static bool consumeComma(CSSParserValueList* valueList) |
| return true; |
| } |
| +static bool consumeCommaIncludingWhitespace(CSSParserTokenRange& valueList) |
| +{ |
| + CSSParserToken value = valueList.peek(); |
| + if (value.type() != CommaToken) |
| + return false; |
| + valueList.consumeIncludingWhitespace(); |
| + return true; |
| +} |
| + |
| static inline bool isForwardSlashOperator(CSSParserValue* value) |
| { |
| ASSERT(value); |
| @@ -432,6 +443,18 @@ void CSSPropertyParser::addExpandedPropertyForValue(CSSPropertyID propId, PassRe |
| addProperty(longhands[i], value, important); |
| } |
| +PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID propId) |
| +{ |
| + m_range->consumeWhitespace(); |
| + switch (propId) { |
| + case CSSPropertyWillChange: |
| + return parseWillChange(); |
| + default: |
| + ASSERT_NOT_REACHED(); |
| + } |
| + return nullptr; |
| +} |
| + |
| bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool important) |
| { |
| CSSPropertyID propId = resolveCSSPropertyID(unresolvedProperty); |
| @@ -470,9 +493,17 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import |
| return true; |
| } |
| + RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; |
| + if (propId == CSSPropertyWillChange) { |
| + parsedValue = parseSingleValue(propId); |
| + if (!parsedValue || !m_range->atEnd()) |
| + return false; |
| + addProperty(propId, parsedValue.release(), important); |
| + return true; |
| + } |
| + |
| bool validPrimitive = false; |
| Units unitless = FUnknown; |
| - RefPtrWillBeRawPtr<CSSValue> parsedValue = nullptr; |
| switch (propId) { |
| case CSSPropertySize: // <length>{1,2} | auto | [ <page-size> || [ portrait | landscape] ] |
| @@ -1317,9 +1348,6 @@ bool CSSPropertyParser::parseValue(CSSPropertyID unresolvedProperty, bool import |
| case CSSPropertyWebkitColumnWidth: // auto | <length> |
| parsedValue = parseColumnWidth(); |
| break; |
| - case CSSPropertyWillChange: |
| - parsedValue = parseWillChange(); |
| - break; |
| // End of CSS3 properties |
| // Apple specific properties. These will never be standardized and are purely to |
| @@ -6839,7 +6867,8 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseImageSet(CSSParserValue |
| PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseWillChange() |
| { |
| RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createCommaSeparated(); |
| - if (m_valueList->current()->id == CSSValueAuto) { |
| + CSSParserToken currentToken = m_range->consumeIncludingWhitespace(); |
| + if (currentToken.id() == CSSValueAuto) { |
| // FIXME: This will be read back as an empty string instead of auto |
| return values.release(); |
| } |
| @@ -6847,11 +6876,10 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseWillChange() |
| // Every comma-separated list of identifiers is a valid will-change value, |
|
Timothy Loh
2015/09/03 02:05:53
Heh, the function doesn't actually do this...
Timothy Loh
2015/09/03 02:06:58
That said, let's try and keep behaviour changes se
rwlbuis
2015/09/03 22:27:54
I agree. Sadly I don't think this is the only case
|
| // unless the list includes an explicitly disallowed identifier. |
| while (true) { |
| - CSSParserValue* currentValue = m_valueList->current(); |
| - if (!currentValue || currentValue->m_unit != CSSParserValue::Identifier) |
| + if (currentToken.type() != IdentToken) |
| return nullptr; |
| - CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(currentValue->string); |
| + CSSPropertyID unresolvedProperty = unresolvedCSSPropertyID(currentToken.value()); |
| if (unresolvedProperty) { |
| ASSERT(CSSPropertyMetadata::isEnabledProperty(unresolvedProperty)); |
| // Now "all" is used by both CSSValue and CSSPropertyValue. |
| @@ -6860,7 +6888,7 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseWillChange() |
| return nullptr; |
| values->append(cssValuePool().createIdentifierValue(unresolvedProperty)); |
| } else { |
| - switch (currentValue->id) { |
| + switch (currentToken.id()) { |
| case CSSValueNone: |
| case CSSValueAll: |
| case CSSValueAuto: |
| @@ -6870,17 +6898,18 @@ PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseWillChange() |
| return nullptr; |
| case CSSValueContents: |
| case CSSValueScrollPosition: |
| - values->append(cssValuePool().createIdentifierValue(currentValue->id)); |
| + values->append(cssValuePool().createIdentifierValue(currentToken.id())); |
|
Timothy Loh
2015/09/03 02:05:53
Maybe we should have something like:
static consu
rwlbuis
2015/09/03 22:27:54
Sounds good, I did that. A bit sad that we need co
Timothy Loh
2015/09/04 01:24:40
Yeah, although I think it's more indicative that t
|
| break; |
| default: |
| break; |
| } |
| } |
| - if (!m_valueList->next()) |
| + if (m_range->atEnd()) |
| break; |
| - if (!consumeComma(m_valueList)) |
| + if (!consumeCommaIncludingWhitespace(*m_range)) |
| return nullptr; |
| + currentToken = m_range->consumeIncludingWhitespace(); |
| } |
| return values.release(); |