Chromium Code Reviews| 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); |
|
alancutter (OOO until 2018)
2015/07/14 06:12:57
This looks very dangerous, see calls to tokenRange
|
| } |
| 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() |
| { |