| Index: Source/core/css/parser/CSSTokenizer.cpp
|
| diff --git a/Source/core/css/parser/CSSTokenizer.cpp b/Source/core/css/parser/CSSTokenizer.cpp
|
| index 1ace8004edc3e1bd3f51247363e2b4e851a941f0..e03a931944969bbc9840b0cb2a303e19a1390fc8 100644
|
| --- a/Source/core/css/parser/CSSTokenizer.cpp
|
| +++ b/Source/core/css/parser/CSSTokenizer.cpp
|
| @@ -18,7 +18,8 @@ namespace blink {
|
| namespace blink {
|
|
|
| CSSTokenizer::Scope::Scope(const String& string)
|
| -: m_string(string)
|
| + : m_string(string)
|
| + , m_hasVariableReference(false)
|
| {
|
| // According to the spec, we should perform preprocessing here.
|
| // See: http://dev.w3.org/csswg/css-syntax/#input-preprocessing
|
| @@ -48,7 +49,8 @@ CSSTokenizer::Scope::Scope(const String& string)
|
| }
|
|
|
| CSSTokenizer::Scope::Scope(const String& string, CSSParserObserverWrapper& wrapper)
|
| -: m_string(string)
|
| + : m_string(string)
|
| + , m_hasVariableReference(false)
|
| {
|
| if (string.isEmpty())
|
| return;
|
| @@ -76,7 +78,7 @@ CSSTokenizer::Scope::Scope(const String& string, CSSParserObserverWrapper& wrapp
|
|
|
| CSSParserTokenRange CSSTokenizer::Scope::tokenRange()
|
| {
|
| - return m_tokens;
|
| + return CSSParserTokenRange(m_tokens, this);
|
| }
|
|
|
| unsigned CSSTokenizer::Scope::tokenCount()
|
| @@ -137,8 +139,9 @@ void CSSTokenizer::consume(unsigned offset)
|
|
|
| CSSParserToken CSSTokenizer::whiteSpace(UChar cc)
|
| {
|
| - consumeUntilNonWhitespace();
|
| - return CSSParserToken(WhitespaceToken);
|
| + unsigned start = m_input.offset();
|
| + unsigned length = consumeUntilNonWhitespace();
|
| + return CSSParserToken(WhitespaceToken, m_input.rangeAsCSSParserString(start, length));
|
| }
|
|
|
| static bool popIfBlockMatches(Vector<CSSParserTokenType>& blockStack, CSSParserTokenType type)
|
| @@ -261,12 +264,12 @@ CSSParserToken CSSTokenizer::solidus(UChar cc)
|
|
|
| CSSParserToken CSSTokenizer::colon(UChar cc)
|
| {
|
| - return CSSParserToken(ColonToken);
|
| + return CSSParserToken(ColonToken, lastConsumedCharacter());
|
| }
|
|
|
| CSSParserToken CSSTokenizer::semiColon(UChar cc)
|
| {
|
| - return CSSParserToken(SemicolonToken);
|
| + return CSSParserToken(SemicolonToken, lastConsumedCharacter());
|
| }
|
|
|
| CSSParserToken CSSTokenizer::hash(UChar cc)
|
| @@ -491,6 +494,8 @@ CSSParserToken CSSTokenizer::consumeIdentLikeToken()
|
| UChar next = m_input.nextInputChar();
|
| if (next != '"' && next != '\'')
|
| return consumeUrlToken();
|
| + } else if (equalIgnoringCase(name, "var")) {
|
| + m_scope.m_hasVariableReference = true;
|
| }
|
| return blockStart(LeftParenthesisToken, FunctionToken, name);
|
| }
|
| @@ -635,11 +640,15 @@ void CSSTokenizer::consumeBadUrlRemnants()
|
| }
|
| }
|
|
|
| -void CSSTokenizer::consumeUntilNonWhitespace()
|
| +unsigned CSSTokenizer::consumeUntilNonWhitespace()
|
| {
|
| + unsigned count = 0;
|
| // Using HTML space here rather than CSS space since we don't do preprocessing
|
| - while (isHTMLSpace<UChar>(m_input.nextInputChar()))
|
| + while (isHTMLSpace<UChar>(m_input.nextInputChar())) {
|
| + ++count;
|
| consume();
|
| + }
|
| + return count;
|
| }
|
|
|
| void CSSTokenizer::consumeSingleWhitespaceIfNext()
|
| @@ -708,6 +717,11 @@ CSSParserString CSSTokenizer::consumeName()
|
| }
|
| }
|
|
|
| +CSSParserString CSSTokenizer::lastConsumedCharacter()
|
| +{
|
| + return m_input.rangeAsCSSParserString(m_input.offset() - 1, 1);
|
| +}
|
| +
|
| // http://dev.w3.org/csswg/css-syntax/#consume-an-escaped-code-point
|
| UChar32 CSSTokenizer::consumeEscape()
|
| {
|
|
|