Chromium Code Reviews| Index: Source/core/css/parser/CSSParserValues.cpp |
| diff --git a/Source/core/css/parser/CSSParserValues.cpp b/Source/core/css/parser/CSSParserValues.cpp |
| index c8b86885528fb5d8665d7b2857ca975c3ae2b4b2..05d53f2a1eab7bbc6fee110d79128b5d80845131 100644 |
| --- a/Source/core/css/parser/CSSParserValues.cpp |
| +++ b/Source/core/css/parser/CSSParserValues.cpp |
| @@ -23,10 +23,14 @@ |
| #include "core/css/CSSFunctionValue.h" |
| #include "core/css/CSSSelectorList.h" |
| +#include "core/css/CSSVariableData.h" |
| #include "core/css/parser/CSSParserToken.h" |
| #include "core/css/parser/CSSParserTokenRange.h" |
| #include "core/css/parser/CSSPropertyParser.h" |
| +#include "core/css/parser/CSSTokenizer.h" |
|
Timothy Loh
2015/08/25 09:21:10
not used?
|
| +#include "core/css/parser/CSSVariableParser.h" |
| #include "core/html/parser/HTMLParserIdioms.h" |
| +#include "wtf/text/StringBuilder.h" |
|
Timothy Loh
2015/08/25 09:21:10
not used?
|
| namespace blink { |
| @@ -35,6 +39,8 @@ using namespace WTF; |
| CSSParserValueList::CSSParserValueList(CSSParserTokenRange range) |
| : m_current(0) |
| { |
| + CSSParserTokenRange originalRangeForVariables = range; |
|
Timothy Loh
2015/08/25 09:21:10
Maybe better to check for variables in the CSSProp
|
| + |
| Vector<CSSParserValueList*> stack; |
| Vector<int> bracketCounts; |
| stack.append(this); |
| @@ -52,7 +58,7 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range) |
| range.consume(); |
| const CSSParserToken& next = range.consumeIncludingWhitespace(); |
| if (next.type() == BadStringToken || range.consume().type() != RightParenthesisToken) { |
| - destroyAndClear(); |
| + checkForVariableReferencesOrDestroyAndClear(originalRangeForVariables); |
| return; |
| } |
| ASSERT(next.type() == StringToken); |
| @@ -61,6 +67,9 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range) |
| value.setUnit(CSSPrimitiveValue::UnitType::URI); |
| value.string = next.value(); |
| break; |
| + } else if (token.valueEqualsIgnoringCase("var")) { |
| + checkForVariableReferencesOrDestroyAndClear(originalRangeForVariables); |
| + return; |
| } |
| value.id = CSSValueInvalid; |
| @@ -99,7 +108,7 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range) |
| stack.removeLast(); |
| bracketCounts.removeLast(); |
| if (bracketCounts.isEmpty()) { |
| - destroyAndClear(); |
| + checkForVariableReferencesOrDestroyAndClear(originalRangeForVariables); |
| return; |
| } |
| continue; |
| @@ -203,10 +212,12 @@ CSSParserValueList::CSSParserValueList(CSSParserTokenRange range) |
| case SuffixMatchToken: |
| case SubstringMatchToken: |
| case ColumnToken: |
| - case BadStringToken: |
| - case BadUrlToken: |
| case ColonToken: |
| case SemicolonToken: |
| + checkForVariableReferencesOrDestroyAndClear(originalRangeForVariables); |
| + return; |
| + case BadStringToken: |
| + case BadUrlToken: |
| destroyAndClear(); |
| return; |
| } |
| @@ -236,9 +247,31 @@ static void destroy(Vector<CSSParserValue, 4>& values) |
| else if (values[i].m_unit == CSSParserValue::ValueList |
| || values[i].m_unit == CSSParserValue::DimensionList) |
| delete values[i].valueList; |
| + else if (values[i].unit() == CSSPrimitiveValue::UnitType::VariableReference) |
| + values[i].variableData->deref(); |
| } |
| } |
| +void CSSParserValueList::checkForVariableReferencesOrDestroyAndClear(const CSSParserTokenRange& originalRange) |
| +{ |
| + // We have to clear any state that may have been previously loaded |
| + destroyAndClear(); |
| + if (RuntimeEnabledFeatures::cssVariablesEnabled() && CSSVariableParser::containsValidVariableReferences(originalRange)) |
| + consumeVariableValue(originalRange); |
| +} |
| + |
| +void CSSParserValueList::consumeVariableValue(const CSSParserTokenRange& originalRange) |
| +{ |
| + ASSERT(m_values.isEmpty()); |
| + CSSParserValue variableValue; |
| + variableValue.id = CSSValueInternalVariableValue; |
| + variableValue.isInt = false; |
| + variableValue.setUnit(CSSPrimitiveValue::UnitType::VariableReference); |
| + variableValue.variableData = CSSVariableData::create(originalRange).leakRef(); |
| + addValue(variableValue); |
| +} |
| + |
| + |
| void CSSParserValueList::destroyAndClear() |
| { |
| destroy(m_values); |