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 |