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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 } | 133 } |
134 return false; | 134 return false; |
135 } | 135 } |
136 | 136 |
137 CSSParserToken CSSTokenizer::blockStart(CSSParserTokenType type) | 137 CSSParserToken CSSTokenizer::blockStart(CSSParserTokenType type) |
138 { | 138 { |
139 m_blockStack.append(type); | 139 m_blockStack.append(type); |
140 return CSSParserToken(type, CSSParserToken::BlockStart); | 140 return CSSParserToken(type, CSSParserToken::BlockStart); |
141 } | 141 } |
142 | 142 |
143 CSSParserToken CSSTokenizer::blockStart(CSSParserTokenType blockType, CSSParserT
okenType type, CSSParserString name) | 143 CSSParserToken CSSTokenizer::blockStart(CSSParserTokenType blockType, CSSParserT
okenType type, StringView name) |
144 { | 144 { |
145 m_blockStack.append(blockType); | 145 m_blockStack.append(blockType); |
146 return CSSParserToken(type, name, CSSParserToken::BlockStart); | 146 return CSSParserToken(type, name, CSSParserToken::BlockStart); |
147 } | 147 } |
148 | 148 |
149 CSSParserToken CSSTokenizer::blockEnd(CSSParserTokenType type, CSSParserTokenTyp
e startType) | 149 CSSParserToken CSSTokenizer::blockEnd(CSSParserTokenType type, CSSParserTokenTyp
e startType) |
150 { | 150 { |
151 if (popIfBlockMatches(m_blockStack, startType)) | 151 if (popIfBlockMatches(m_blockStack, startType)) |
152 return CSSParserToken(type, CSSParserToken::BlockEnd); | 152 return CSSParserToken(type, CSSParserToken::BlockEnd); |
153 return CSSParserToken(type); | 153 return CSSParserToken(type); |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 if (nextCharsAreIdentifier()) | 459 if (nextCharsAreIdentifier()) |
460 token.convertToDimensionWithUnit(consumeName()); | 460 token.convertToDimensionWithUnit(consumeName()); |
461 else if (consumeIfNext('%')) | 461 else if (consumeIfNext('%')) |
462 token.convertToPercentage(); | 462 token.convertToPercentage(); |
463 return token; | 463 return token; |
464 } | 464 } |
465 | 465 |
466 // http://dev.w3.org/csswg/css-syntax/#consume-ident-like-token | 466 // http://dev.w3.org/csswg/css-syntax/#consume-ident-like-token |
467 CSSParserToken CSSTokenizer::consumeIdentLikeToken() | 467 CSSParserToken CSSTokenizer::consumeIdentLikeToken() |
468 { | 468 { |
469 CSSParserString name = consumeName(); | 469 StringView name = consumeName(); |
470 if (consumeIfNext('(')) { | 470 if (consumeIfNext('(')) { |
471 if (name.equalIgnoringASCIICase("url")) { | 471 if (equalIgnoringASCIICase(name, "url")) { |
472 // The spec is slightly different so as to avoid dropping whitespace | 472 // The spec is slightly different so as to avoid dropping whitespace |
473 // tokens, but they wouldn't be used and this is easier. | 473 // tokens, but they wouldn't be used and this is easier. |
474 consumeUntilNonWhitespace(); | 474 consumeUntilNonWhitespace(); |
475 UChar next = m_input.nextInputChar(); | 475 UChar next = m_input.nextInputChar(); |
476 if (next != '"' && next != '\'') | 476 if (next != '"' && next != '\'') |
477 return consumeUrlToken(); | 477 return consumeUrlToken(); |
478 } | 478 } |
479 return blockStart(LeftParenthesisToken, FunctionToken, name); | 479 return blockStart(LeftParenthesisToken, FunctionToken, name); |
480 } | 480 } |
481 return CSSParserToken(IdentToken, name); | 481 return CSSParserToken(IdentToken, name); |
482 } | 482 } |
483 | 483 |
484 // http://dev.w3.org/csswg/css-syntax/#consume-a-string-token | 484 // http://dev.w3.org/csswg/css-syntax/#consume-a-string-token |
485 CSSParserToken CSSTokenizer::consumeStringTokenUntil(UChar endingCodePoint) | 485 CSSParserToken CSSTokenizer::consumeStringTokenUntil(UChar endingCodePoint) |
486 { | 486 { |
487 // Strings without escapes get handled without allocations | 487 // Strings without escapes get handled without allocations |
488 for (unsigned size = 0; ; size++) { | 488 for (unsigned size = 0; ; size++) { |
489 UChar cc = m_input.peekWithoutReplacement(size); | 489 UChar cc = m_input.peekWithoutReplacement(size); |
490 if (cc == endingCodePoint) { | 490 if (cc == endingCodePoint) { |
491 unsigned startOffset = m_input.offset(); | 491 unsigned startOffset = m_input.offset(); |
492 m_input.advance(size + 1); | 492 m_input.advance(size + 1); |
493 return CSSParserToken(StringToken, m_input.rangeAsCSSParserString(st
artOffset, size)); | 493 return CSSParserToken(StringToken, m_input.rangeAt(startOffset, size
)); |
494 } | 494 } |
495 if (isNewLine(cc)) { | 495 if (isNewLine(cc)) { |
496 m_input.advance(size); | 496 m_input.advance(size); |
497 return CSSParserToken(BadStringToken); | 497 return CSSParserToken(BadStringToken); |
498 } | 498 } |
499 if (cc == '\0' || cc == '\\') | 499 if (cc == '\0' || cc == '\\') |
500 break; | 500 break; |
501 } | 501 } |
502 | 502 |
503 StringBuilder output; | 503 StringBuilder output; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 CSSParserToken CSSTokenizer::consumeUrlToken() | 563 CSSParserToken CSSTokenizer::consumeUrlToken() |
564 { | 564 { |
565 consumeUntilNonWhitespace(); | 565 consumeUntilNonWhitespace(); |
566 | 566 |
567 // URL tokens without escapes get handled without allocations | 567 // URL tokens without escapes get handled without allocations |
568 for (unsigned size = 0; ; size++) { | 568 for (unsigned size = 0; ; size++) { |
569 UChar cc = m_input.peekWithoutReplacement(size); | 569 UChar cc = m_input.peekWithoutReplacement(size); |
570 if (cc == ')') { | 570 if (cc == ')') { |
571 unsigned startOffset = m_input.offset(); | 571 unsigned startOffset = m_input.offset(); |
572 m_input.advance(size + 1); | 572 m_input.advance(size + 1); |
573 return CSSParserToken(UrlToken, m_input.rangeAsCSSParserString(start
Offset, size)); | 573 return CSSParserToken(UrlToken, m_input.rangeAt(startOffset, size)); |
574 } | 574 } |
575 if (cc <= ' ' || cc == '\\' || cc == '"' || cc == '\'' || cc == '(' || c
c == '\x7f') | 575 if (cc <= ' ' || cc == '\\' || cc == '"' || cc == '\'' || cc == '(' || c
c == '\x7f') |
576 break; | 576 break; |
577 } | 577 } |
578 | 578 |
579 StringBuilder result; | 579 StringBuilder result; |
580 while (true) { | 580 while (true) { |
581 UChar cc = consume(); | 581 UChar cc = consume(); |
582 if (cc == ')' || cc == kEndOfFileMarker) | 582 if (cc == ')' || cc == kEndOfFileMarker) |
583 return CSSParserToken(UrlToken, registerString(result.toString())); | 583 return CSSParserToken(UrlToken, registerString(result.toString())); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 bool CSSTokenizer::consumeIfNext(UChar character) | 655 bool CSSTokenizer::consumeIfNext(UChar character) |
656 { | 656 { |
657 if (m_input.nextInputChar() == character) { | 657 if (m_input.nextInputChar() == character) { |
658 consume(); | 658 consume(); |
659 return true; | 659 return true; |
660 } | 660 } |
661 return false; | 661 return false; |
662 } | 662 } |
663 | 663 |
664 // http://www.w3.org/TR/css3-syntax/#consume-a-name | 664 // http://www.w3.org/TR/css3-syntax/#consume-a-name |
665 CSSParserString CSSTokenizer::consumeName() | 665 StringView CSSTokenizer::consumeName() |
666 { | 666 { |
667 // Names without escapes get handled without allocations | 667 // Names without escapes get handled without allocations |
668 for (unsigned size = 0; ; ++size) { | 668 for (unsigned size = 0; ; ++size) { |
669 UChar cc = m_input.peekWithoutReplacement(size); | 669 UChar cc = m_input.peekWithoutReplacement(size); |
670 if (cc == '\0' || cc == '\\') | 670 if (cc == '\0' || cc == '\\') |
671 break; | 671 break; |
672 if (!isNameCodePoint(cc)) { | 672 if (!isNameCodePoint(cc)) { |
673 unsigned startOffset = m_input.offset(); | 673 unsigned startOffset = m_input.offset(); |
674 m_input.advance(size); | 674 m_input.advance(size); |
675 return m_input.rangeAsCSSParserString(startOffset, size); | 675 return m_input.rangeAt(startOffset, size); |
676 } | 676 } |
677 } | 677 } |
678 | 678 |
679 StringBuilder result; | 679 StringBuilder result; |
680 while (true) { | 680 while (true) { |
681 UChar cc = consume(); | 681 UChar cc = consume(); |
682 if (isNameCodePoint(cc)) { | 682 if (isNameCodePoint(cc)) { |
683 result.append(cc); | 683 result.append(cc); |
684 continue; | 684 continue; |
685 } | 685 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 } | 760 } |
761 | 761 |
762 bool CSSTokenizer::nextCharsAreIdentifier() | 762 bool CSSTokenizer::nextCharsAreIdentifier() |
763 { | 763 { |
764 UChar first = consume(); | 764 UChar first = consume(); |
765 bool areIdentifier = nextCharsAreIdentifier(first); | 765 bool areIdentifier = nextCharsAreIdentifier(first); |
766 reconsume(first); | 766 reconsume(first); |
767 return areIdentifier; | 767 return areIdentifier; |
768 } | 768 } |
769 | 769 |
770 CSSParserString CSSTokenizer::registerString(const String& string) | 770 StringView CSSTokenizer::registerString(const String& string) |
771 { | 771 { |
772 m_scope.storeString(string); | 772 m_scope.storeString(string); |
773 CSSParserString result; | 773 return string; |
774 result.init(string); | |
775 return result; | |
776 } | 774 } |
777 | 775 |
778 } // namespace blink | 776 } // namespace blink |
OLD | NEW |