| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/css/parser/CSSTokenizer.h" | 5 #include "core/css/parser/CSSTokenizer.h" |
| 6 | 6 |
| 7 namespace blink { | 7 namespace blink { |
| 8 #include "core/CSSTokenizerCodepoints.cpp" | 8 #include "core/CSSTokenizerCodepoints.cpp" |
| 9 } | 9 } |
| 10 | 10 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 147 |
| 148 CSSParserToken CSSTokenizer::plusOrFullStop(UChar cc) { | 148 CSSParserToken CSSTokenizer::plusOrFullStop(UChar cc) { |
| 149 if (nextCharsAreNumber(cc)) { | 149 if (nextCharsAreNumber(cc)) { |
| 150 reconsume(cc); | 150 reconsume(cc); |
| 151 return consumeNumericToken(); | 151 return consumeNumericToken(); |
| 152 } | 152 } |
| 153 return CSSParserToken(DelimiterToken, cc); | 153 return CSSParserToken(DelimiterToken, cc); |
| 154 } | 154 } |
| 155 | 155 |
| 156 CSSParserToken CSSTokenizer::asterisk(UChar cc) { | 156 CSSParserToken CSSTokenizer::asterisk(UChar cc) { |
| 157 ASSERT(cc == '*'); | 157 DCHECK_EQ(cc, '*'); |
| 158 if (consumeIfNext('=')) | 158 if (consumeIfNext('=')) |
| 159 return CSSParserToken(SubstringMatchToken); | 159 return CSSParserToken(SubstringMatchToken); |
| 160 return CSSParserToken(DelimiterToken, '*'); | 160 return CSSParserToken(DelimiterToken, '*'); |
| 161 } | 161 } |
| 162 | 162 |
| 163 CSSParserToken CSSTokenizer::lessThan(UChar cc) { | 163 CSSParserToken CSSTokenizer::lessThan(UChar cc) { |
| 164 ASSERT(cc == '<'); | 164 DCHECK_EQ(cc, '<'); |
| 165 if (m_input.peekWithoutReplacement(0) == '!' && | 165 if (m_input.peekWithoutReplacement(0) == '!' && |
| 166 m_input.peekWithoutReplacement(1) == '-' && | 166 m_input.peekWithoutReplacement(1) == '-' && |
| 167 m_input.peekWithoutReplacement(2) == '-') { | 167 m_input.peekWithoutReplacement(2) == '-') { |
| 168 m_input.advance(3); | 168 m_input.advance(3); |
| 169 return CSSParserToken(CDOToken); | 169 return CSSParserToken(CDOToken); |
| 170 } | 170 } |
| 171 return CSSParserToken(DelimiterToken, '<'); | 171 return CSSParserToken(DelimiterToken, '<'); |
| 172 } | 172 } |
| 173 | 173 |
| 174 CSSParserToken CSSTokenizer::comma(UChar cc) { | 174 CSSParserToken CSSTokenizer::comma(UChar cc) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 twoCharsAreValidEscape(nextChar, m_input.peekWithoutReplacement(1))) { | 216 twoCharsAreValidEscape(nextChar, m_input.peekWithoutReplacement(1))) { |
| 217 HashTokenType type = | 217 HashTokenType type = |
| 218 nextCharsAreIdentifier() ? HashTokenId : HashTokenUnrestricted; | 218 nextCharsAreIdentifier() ? HashTokenId : HashTokenUnrestricted; |
| 219 return CSSParserToken(type, consumeName()); | 219 return CSSParserToken(type, consumeName()); |
| 220 } | 220 } |
| 221 | 221 |
| 222 return CSSParserToken(DelimiterToken, cc); | 222 return CSSParserToken(DelimiterToken, cc); |
| 223 } | 223 } |
| 224 | 224 |
| 225 CSSParserToken CSSTokenizer::circumflexAccent(UChar cc) { | 225 CSSParserToken CSSTokenizer::circumflexAccent(UChar cc) { |
| 226 ASSERT(cc == '^'); | 226 DCHECK_EQ(cc, '^'); |
| 227 if (consumeIfNext('=')) | 227 if (consumeIfNext('=')) |
| 228 return CSSParserToken(PrefixMatchToken); | 228 return CSSParserToken(PrefixMatchToken); |
| 229 return CSSParserToken(DelimiterToken, '^'); | 229 return CSSParserToken(DelimiterToken, '^'); |
| 230 } | 230 } |
| 231 | 231 |
| 232 CSSParserToken CSSTokenizer::dollarSign(UChar cc) { | 232 CSSParserToken CSSTokenizer::dollarSign(UChar cc) { |
| 233 ASSERT(cc == '$'); | 233 DCHECK_EQ(cc, '$'); |
| 234 if (consumeIfNext('=')) | 234 if (consumeIfNext('=')) |
| 235 return CSSParserToken(SuffixMatchToken); | 235 return CSSParserToken(SuffixMatchToken); |
| 236 return CSSParserToken(DelimiterToken, '$'); | 236 return CSSParserToken(DelimiterToken, '$'); |
| 237 } | 237 } |
| 238 | 238 |
| 239 CSSParserToken CSSTokenizer::verticalLine(UChar cc) { | 239 CSSParserToken CSSTokenizer::verticalLine(UChar cc) { |
| 240 ASSERT(cc == '|'); | 240 DCHECK_EQ(cc, '|'); |
| 241 if (consumeIfNext('=')) | 241 if (consumeIfNext('=')) |
| 242 return CSSParserToken(DashMatchToken); | 242 return CSSParserToken(DashMatchToken); |
| 243 if (consumeIfNext('|')) | 243 if (consumeIfNext('|')) |
| 244 return CSSParserToken(ColumnToken); | 244 return CSSParserToken(ColumnToken); |
| 245 return CSSParserToken(DelimiterToken, '|'); | 245 return CSSParserToken(DelimiterToken, '|'); |
| 246 } | 246 } |
| 247 | 247 |
| 248 CSSParserToken CSSTokenizer::tilde(UChar cc) { | 248 CSSParserToken CSSTokenizer::tilde(UChar cc) { |
| 249 ASSERT(cc == '~'); | 249 DCHECK_EQ(cc, '~'); |
| 250 if (consumeIfNext('=')) | 250 if (consumeIfNext('=')) |
| 251 return CSSParserToken(IncludeMatchToken); | 251 return CSSParserToken(IncludeMatchToken); |
| 252 return CSSParserToken(DelimiterToken, '~'); | 252 return CSSParserToken(DelimiterToken, '~'); |
| 253 } | 253 } |
| 254 | 254 |
| 255 CSSParserToken CSSTokenizer::commercialAt(UChar cc) { | 255 CSSParserToken CSSTokenizer::commercialAt(UChar cc) { |
| 256 ASSERT(cc == '@'); | 256 DCHECK_EQ(cc, '@'); |
| 257 if (nextCharsAreIdentifier()) | 257 if (nextCharsAreIdentifier()) |
| 258 return CSSParserToken(AtKeywordToken, consumeName()); | 258 return CSSParserToken(AtKeywordToken, consumeName()); |
| 259 return CSSParserToken(DelimiterToken, '@'); | 259 return CSSParserToken(DelimiterToken, '@'); |
| 260 } | 260 } |
| 261 | 261 |
| 262 CSSParserToken CSSTokenizer::reverseSolidus(UChar cc) { | 262 CSSParserToken CSSTokenizer::reverseSolidus(UChar cc) { |
| 263 if (twoCharsAreValidEscape(cc, m_input.peekWithoutReplacement(0))) { | 263 if (twoCharsAreValidEscape(cc, m_input.peekWithoutReplacement(0))) { |
| 264 reconsume(cc); | 264 reconsume(cc); |
| 265 return consumeIdentLikeToken(); | 265 return consumeIdentLikeToken(); |
| 266 } | 266 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 | 316 |
| 317 if (codePointFunc) | 317 if (codePointFunc) |
| 318 return ((this)->*(codePointFunc))(cc); | 318 return ((this)->*(codePointFunc))(cc); |
| 319 return CSSParserToken(DelimiterToken, cc); | 319 return CSSParserToken(DelimiterToken, cc); |
| 320 } | 320 } |
| 321 | 321 |
| 322 // This method merges the following spec sections for efficiency | 322 // This method merges the following spec sections for efficiency |
| 323 // http://www.w3.org/TR/css3-syntax/#consume-a-number | 323 // http://www.w3.org/TR/css3-syntax/#consume-a-number |
| 324 // http://www.w3.org/TR/css3-syntax/#convert-a-string-to-a-number | 324 // http://www.w3.org/TR/css3-syntax/#convert-a-string-to-a-number |
| 325 CSSParserToken CSSTokenizer::consumeNumber() { | 325 CSSParserToken CSSTokenizer::consumeNumber() { |
| 326 ASSERT(nextCharsAreNumber()); | 326 DCHECK(nextCharsAreNumber()); |
| 327 | 327 |
| 328 NumericValueType type = IntegerValueType; | 328 NumericValueType type = IntegerValueType; |
| 329 NumericSign sign = NoSign; | 329 NumericSign sign = NoSign; |
| 330 unsigned numberLength = 0; | 330 unsigned numberLength = 0; |
| 331 | 331 |
| 332 UChar next = m_input.peekWithoutReplacement(0); | 332 UChar next = m_input.peekWithoutReplacement(0); |
| 333 if (next == '+') { | 333 if (next == '+') { |
| 334 ++numberLength; | 334 ++numberLength; |
| 335 sign = PlusSign; | 335 sign = PlusSign; |
| 336 } else if (next == '-') { | 336 } else if (next == '-') { |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 continue; | 598 continue; |
| 599 } | 599 } |
| 600 reconsume(cc); | 600 reconsume(cc); |
| 601 return registerString(result.toString()); | 601 return registerString(result.toString()); |
| 602 } | 602 } |
| 603 } | 603 } |
| 604 | 604 |
| 605 // http://dev.w3.org/csswg/css-syntax/#consume-an-escaped-code-point | 605 // http://dev.w3.org/csswg/css-syntax/#consume-an-escaped-code-point |
| 606 UChar32 CSSTokenizer::consumeEscape() { | 606 UChar32 CSSTokenizer::consumeEscape() { |
| 607 UChar cc = consume(); | 607 UChar cc = consume(); |
| 608 ASSERT(!isNewLine(cc)); | 608 DCHECK(!isNewLine(cc)); |
| 609 if (isASCIIHexDigit(cc)) { | 609 if (isASCIIHexDigit(cc)) { |
| 610 unsigned consumedHexDigits = 1; | 610 unsigned consumedHexDigits = 1; |
| 611 StringBuilder hexChars; | 611 StringBuilder hexChars; |
| 612 hexChars.append(cc); | 612 hexChars.append(cc); |
| 613 while (consumedHexDigits < 6 && | 613 while (consumedHexDigits < 6 && |
| 614 isASCIIHexDigit(m_input.peekWithoutReplacement(0))) { | 614 isASCIIHexDigit(m_input.peekWithoutReplacement(0))) { |
| 615 cc = consume(); | 615 cc = consume(); |
| 616 hexChars.append(cc); | 616 hexChars.append(cc); |
| 617 consumedHexDigits++; | 617 consumedHexDigits++; |
| 618 }; | 618 }; |
| 619 consumeSingleWhitespaceIfNext(); | 619 consumeSingleWhitespaceIfNext(); |
| 620 bool ok = false; | 620 bool ok = false; |
| 621 UChar32 codePoint = hexChars.toString().toUIntStrict(&ok, 16); | 621 UChar32 codePoint = hexChars.toString().toUIntStrict(&ok, 16); |
| 622 ASSERT(ok); | 622 DCHECK(ok); |
| 623 if (codePoint == 0 || (0xD800 <= codePoint && codePoint <= 0xDFFF) || | 623 if (codePoint == 0 || (0xD800 <= codePoint && codePoint <= 0xDFFF) || |
| 624 codePoint > 0x10FFFF) | 624 codePoint > 0x10FFFF) |
| 625 return replacementCharacter; | 625 return replacementCharacter; |
| 626 return codePoint; | 626 return codePoint; |
| 627 } | 627 } |
| 628 | 628 |
| 629 if (cc == kEndOfFileMarker) | 629 if (cc == kEndOfFileMarker) |
| 630 return replacementCharacter; | 630 return replacementCharacter; |
| 631 return cc; | 631 return cc; |
| 632 } | 632 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 reconsume(first); | 675 reconsume(first); |
| 676 return areIdentifier; | 676 return areIdentifier; |
| 677 } | 677 } |
| 678 | 678 |
| 679 StringView CSSTokenizer::registerString(const String& string) { | 679 StringView CSSTokenizer::registerString(const String& string) { |
| 680 m_stringPool.push_back(string); | 680 m_stringPool.push_back(string); |
| 681 return string; | 681 return string; |
| 682 } | 682 } |
| 683 | 683 |
| 684 } // namespace blink | 684 } // namespace blink |
| OLD | NEW |