| 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 |