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); |