Chromium Code Reviews| 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 range.consumeWhitespace(); | 71 range.consumeWhitespace(); |
| 72 CSSSelectorList result = parser.consumeComplexSelectorList(range); | 72 CSSSelectorList result = parser.consumeComplexSelectorList(range); |
| 73 if (!range.atEnd()) | 73 if (!range.atEnd()) |
| 74 return CSSSelectorList(); | 74 return CSSSelectorList(); |
| 75 | 75 |
| 76 recordSelectorStats(context, result); | 76 recordSelectorStats(context, result); |
| 77 return result; | 77 return result; |
| 78 } | 78 } |
| 79 | 79 |
| 80 CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context, StyleSheet Contents* styleSheet) | 80 CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context, StyleSheet Contents* styleSheet) |
| 81 : m_context(context) | 81 : m_context(context) |
| 82 , m_styleSheet(styleSheet) | 82 , m_styleSheet(styleSheet) |
| 83 , m_failedParsing(false) | |
| 84 { | 83 { |
| 85 } | 84 } |
| 86 | 85 |
| 87 CSSSelectorList CSSSelectorParser::consumeComplexSelectorList(CSSParserTokenRang e& range) | 86 CSSSelectorList CSSSelectorParser::consumeComplexSelectorList(CSSParserTokenRang e& range) |
| 88 { | 87 { |
| 89 Vector<OwnPtr<CSSParserSelector>> selectorList; | 88 Vector<OwnPtr<CSSParserSelector>> selectorList; |
| 90 OwnPtr<CSSParserSelector> selector = consumeComplexSelector(range); | 89 OwnPtr<CSSParserSelector> selector = consumeComplexSelector(range); |
| 91 if (!selector) | 90 if (!selector) |
| 92 return CSSSelectorList(); | 91 return CSSSelectorList(); |
| 93 selectorList.append(selector.release()); | 92 selectorList.append(selector.release()); |
| 94 while (!range.atEnd() && range.peek().type() == CommaToken) { | 93 while (!range.atEnd() && range.peek().type() == CommaToken) { |
| 95 range.consumeIncludingWhitespace(); | 94 range.consumeIncludingWhitespace(); |
| 96 selector = consumeComplexSelector(range); | 95 selector = consumeComplexSelector(range); |
| 97 if (!selector) | 96 if (!selector) |
| 98 return CSSSelectorList(); | 97 return CSSSelectorList(); |
| 99 selectorList.append(selector.release()); | 98 selectorList.append(selector.release()); |
| 100 } | 99 } |
| 101 | 100 |
| 102 if (m_failedParsing) | 101 if (m_failedParsing) |
| 103 return CSSSelectorList(); | 102 return CSSSelectorList(); |
| 104 | 103 |
| 105 return CSSSelectorList::adoptSelectorVector(selectorList); | 104 return CSSSelectorList::adoptSelectorVector(selectorList); |
| 106 } | 105 } |
| 107 | 106 |
| 108 CSSSelectorList CSSSelectorParser::consumeCompoundSelectorList(CSSParserTokenRan ge& range) | 107 CSSSelectorList CSSSelectorParser::consumeCompoundSelectorList(CSSParserTokenRan ge& range) |
| 109 { | 108 { |
| 109 DisallowPseudoElementsScope scope(this); | |
|
Timothy Loh
2016/01/11 05:20:54
I think it would make more sense for this to be at
rune
2016/01/11 09:30:22
Done.
| |
| 110 | |
| 110 Vector<OwnPtr<CSSParserSelector>> selectorList; | 111 Vector<OwnPtr<CSSParserSelector>> selectorList; |
| 111 OwnPtr<CSSParserSelector> selector = consumeCompoundSelector(range); | 112 OwnPtr<CSSParserSelector> selector = consumeCompoundSelector(range); |
| 112 range.consumeWhitespace(); | 113 range.consumeWhitespace(); |
| 113 if (!selector) | 114 if (!selector) |
| 114 return CSSSelectorList(); | 115 return CSSSelectorList(); |
| 115 selectorList.append(selector.release()); | 116 selectorList.append(selector.release()); |
| 116 while (!range.atEnd() && range.peek().type() == CommaToken) { | 117 while (!range.atEnd() && range.peek().type() == CommaToken) { |
| 117 // FIXME: This differs from the spec grammar: | 118 // FIXME: This differs from the spec grammar: |
| 118 // Spec: compound_selector S* [ COMMA S* compound_selector ]* S* | 119 // Spec: compound_selector S* [ COMMA S* compound_selector ]* S* |
| 119 // Impl: compound_selector S* [ COMMA S* compound_selector S* ]* | 120 // Impl: compound_selector S* [ COMMA S* compound_selector S* ]* |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 327 if (token.type() != IdentToken && token.type() != FunctionToken) | 328 if (token.type() != IdentToken && token.type() != FunctionToken) |
| 328 return nullptr; | 329 return nullptr; |
| 329 | 330 |
| 330 OwnPtr<CSSParserSelector> selector = CSSParserSelector::create(); | 331 OwnPtr<CSSParserSelector> selector = CSSParserSelector::create(); |
| 331 selector->setMatch(colons == 1 ? CSSSelector::PseudoClass : CSSSelector::Pse udoElement); | 332 selector->setMatch(colons == 1 ? CSSSelector::PseudoClass : CSSSelector::Pse udoElement); |
| 332 | 333 |
| 333 String value = token.value(); | 334 String value = token.value(); |
| 334 bool hasArguments = token.type() == FunctionToken; | 335 bool hasArguments = token.type() == FunctionToken; |
| 335 selector->updatePseudoType(AtomicString(value.is8Bit() ? value.lower() : val ue), hasArguments); | 336 selector->updatePseudoType(AtomicString(value.is8Bit() ? value.lower() : val ue), hasArguments); |
| 336 | 337 |
| 338 if (selector->match() == CSSSelector::PseudoElement && m_disallowPseudoEleme nts) | |
| 339 return nullptr; | |
| 340 | |
| 337 if (token.type() == IdentToken) { | 341 if (token.type() == IdentToken) { |
| 338 range.consume(); | 342 range.consume(); |
| 339 if (selector->pseudoType() == CSSSelector::PseudoUnknown) | 343 if (selector->pseudoType() == CSSSelector::PseudoUnknown) |
| 340 return nullptr; | 344 return nullptr; |
| 341 return selector.release(); | 345 return selector.release(); |
| 342 } | 346 } |
| 343 | 347 |
| 344 CSSParserTokenRange block = range.consumeBlock(); | 348 CSSParserTokenRange block = range.consumeBlock(); |
| 345 block.consumeWhitespace(); | 349 block.consumeWhitespace(); |
| 346 if (selector->pseudoType() == CSSSelector::PseudoUnknown) | 350 if (selector->pseudoType() == CSSSelector::PseudoUnknown) |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 674 compoundSelector->insertTagHistory(CSSSelector::SubSelector, simpleSelec tor, relation); | 678 compoundSelector->insertTagHistory(CSSSelector::SubSelector, simpleSelec tor, relation); |
| 675 return compoundSelector; | 679 return compoundSelector; |
| 676 } | 680 } |
| 677 | 681 |
| 678 // All other simple selectors are added to the end of the compound. | 682 // All other simple selectors are added to the end of the compound. |
| 679 compoundSelector->appendTagHistory(CSSSelector::SubSelector, simpleSelector) ; | 683 compoundSelector->appendTagHistory(CSSSelector::SubSelector, simpleSelector) ; |
| 680 return compoundSelector; | 684 return compoundSelector; |
| 681 } | 685 } |
| 682 | 686 |
| 683 } // namespace blink | 687 } // namespace blink |
| OLD | NEW |