Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp

Issue 1576553002: Pseudo element selectors in compound selector lists are invalid. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698