| 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/CSSSelectorParser.h" | 5 #include "core/css/parser/CSSSelectorParser.h" |
| 6 | 6 |
| 7 #include "core/css/CSSSelectorList.h" | 7 #include "core/css/CSSSelectorList.h" |
| 8 #include "core/css/StyleSheetContents.h" | 8 #include "core/css/StyleSheetContents.h" |
| 9 #include "core/frame/UseCounter.h" | 9 #include "core/frame/UseCounter.h" |
| 10 #include "platform/RuntimeEnabledFeatures.h" | 10 #include "platform/RuntimeEnabledFeatures.h" |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 if (delimiter == '~') | 567 if (delimiter == '~') |
| 568 return CSSSelector::IndirectAdjacent; | 568 return CSSSelector::IndirectAdjacent; |
| 569 return CSSSelector::Child; | 569 return CSSSelector::Child; |
| 570 } | 570 } |
| 571 | 571 |
| 572 // Match /deep/ | 572 // Match /deep/ |
| 573 if (delimiter != '/') | 573 if (delimiter != '/') |
| 574 return fallbackResult; | 574 return fallbackResult; |
| 575 range.consume(); | 575 range.consume(); |
| 576 const CSSParserToken& ident = range.consume(); | 576 const CSSParserToken& ident = range.consume(); |
| 577 if (ident.type() != IdentToken || !ident.valueEqualsIgnoringCase("deep")) | 577 if (ident.type() != IdentToken || !ident.valueEqualsIgnoringASCIICase("deep"
)) |
| 578 m_failedParsing = true; | 578 m_failedParsing = true; |
| 579 const CSSParserToken& slash = range.consumeIncludingWhitespace(); | 579 const CSSParserToken& slash = range.consumeIncludingWhitespace(); |
| 580 if (slash.type() != DelimiterToken || slash.delimiter() != '/') | 580 if (slash.type() != DelimiterToken || slash.delimiter() != '/') |
| 581 m_failedParsing = true; | 581 m_failedParsing = true; |
| 582 return CSSSelector::ShadowDeep; | 582 return CSSSelector::ShadowDeep; |
| 583 } | 583 } |
| 584 | 584 |
| 585 CSSSelector::Match CSSSelectorParser::consumeAttributeMatch(CSSParserTokenRange&
range) | 585 CSSSelector::Match CSSSelectorParser::consumeAttributeMatch(CSSParserTokenRange&
range) |
| 586 { | 586 { |
| 587 const CSSParserToken& token = range.consumeIncludingWhitespace(); | 587 const CSSParserToken& token = range.consumeIncludingWhitespace(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 603 m_failedParsing = true; | 603 m_failedParsing = true; |
| 604 return CSSSelector::AttributeExact; | 604 return CSSSelector::AttributeExact; |
| 605 } | 605 } |
| 606 } | 606 } |
| 607 | 607 |
| 608 CSSSelector::AttributeMatchType CSSSelectorParser::consumeAttributeFlags(CSSPars
erTokenRange& range) | 608 CSSSelector::AttributeMatchType CSSSelectorParser::consumeAttributeFlags(CSSPars
erTokenRange& range) |
| 609 { | 609 { |
| 610 if (range.peek().type() != IdentToken) | 610 if (range.peek().type() != IdentToken) |
| 611 return CSSSelector::CaseSensitive; | 611 return CSSSelector::CaseSensitive; |
| 612 const CSSParserToken& flag = range.consumeIncludingWhitespace(); | 612 const CSSParserToken& flag = range.consumeIncludingWhitespace(); |
| 613 if (flag.valueEqualsIgnoringCase("i")) | 613 if (flag.valueEqualsIgnoringASCIICase("i")) |
| 614 return CSSSelector::CaseInsensitive; | 614 return CSSSelector::CaseInsensitive; |
| 615 m_failedParsing = true; | 615 m_failedParsing = true; |
| 616 return CSSSelector::CaseSensitive; | 616 return CSSSelector::CaseSensitive; |
| 617 } | 617 } |
| 618 | 618 |
| 619 bool CSSSelectorParser::consumeANPlusB(CSSParserTokenRange& range, std::pair<int
, int>& result) | 619 bool CSSSelectorParser::consumeANPlusB(CSSParserTokenRange& range, std::pair<int
, int>& result) |
| 620 { | 620 { |
| 621 const CSSParserToken& token = range.consume(); | 621 const CSSParserToken& token = range.consume(); |
| 622 if (token.type() == NumberToken && token.numericValueType() == IntegerValueT
ype) { | 622 if (token.type() == NumberToken && token.numericValueType() == IntegerValueT
ype) { |
| 623 result = std::make_pair(0, static_cast<int>(token.numericValue())); | 623 result = std::make_pair(0, static_cast<int>(token.numericValue())); |
| 624 return true; | 624 return true; |
| 625 } | 625 } |
| 626 if (token.type() == IdentToken) { | 626 if (token.type() == IdentToken) { |
| 627 if (token.valueEqualsIgnoringCase("odd")) { | 627 if (token.valueEqualsIgnoringASCIICase("odd")) { |
| 628 result = std::make_pair(2, 1); | 628 result = std::make_pair(2, 1); |
| 629 return true; | 629 return true; |
| 630 } | 630 } |
| 631 if (token.valueEqualsIgnoringCase("even")) { | 631 if (token.valueEqualsIgnoringASCIICase("even")) { |
| 632 result = std::make_pair(2, 0); | 632 result = std::make_pair(2, 0); |
| 633 return true; | 633 return true; |
| 634 } | 634 } |
| 635 } | 635 } |
| 636 | 636 |
| 637 // The 'n' will end up as part of an ident or dimension. For a valid <an+b>, | 637 // The 'n' will end up as part of an ident or dimension. For a valid <an+b>, |
| 638 // this will store a string of the form 'n', 'n-', or 'n-123'. | 638 // this will store a string of the form 'n', 'n-', or 'n-123'. |
| 639 String nString; | 639 String nString; |
| 640 | 640 |
| 641 if (token.type() == DelimiterToken && token.delimiter() == '+' && range.peek
().type() == IdentToken) { | 641 if (token.type() == DelimiterToken && token.delimiter() == '+' && range.peek
().type() == IdentToken) { |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 | 765 |
| 766 if (!splitAfter || !splitAfter->tagHistory()) | 766 if (!splitAfter || !splitAfter->tagHistory()) |
| 767 return compoundSelector; | 767 return compoundSelector; |
| 768 | 768 |
| 769 OwnPtr<CSSParserSelector> secondCompound = splitAfter->releaseTagHistory(); | 769 OwnPtr<CSSParserSelector> secondCompound = splitAfter->releaseTagHistory(); |
| 770 secondCompound->appendTagHistory(secondCompound->pseudoType() == CSSSelector
::PseudoSlotted ? CSSSelector::ShadowSlot : CSSSelector::ShadowPseudo, compoundS
elector); | 770 secondCompound->appendTagHistory(secondCompound->pseudoType() == CSSSelector
::PseudoSlotted ? CSSSelector::ShadowSlot : CSSSelector::ShadowPseudo, compoundS
elector); |
| 771 return secondCompound.release(); | 771 return secondCompound.release(); |
| 772 } | 772 } |
| 773 | 773 |
| 774 } // namespace blink | 774 } // namespace blink |
| OLD | NEW |