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 |