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

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

Issue 1650473002: Setting selectorText of PageRule accepts invalid selectors (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated as per review comments Created 4 years, 10 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/CSSParserImpl.h" 5 #include "core/css/parser/CSSParserImpl.h"
6 6
7 #include "core/css/CSSCustomPropertyDeclaration.h" 7 #include "core/css/CSSCustomPropertyDeclaration.h"
8 #include "core/css/CSSKeyframesRule.h" 8 #include "core/css/CSSKeyframesRule.h"
9 #include "core/css/CSSStyleSheet.h" 9 #include "core/css/CSSStyleSheet.h"
10 #include "core/css/StylePropertySet.h" 10 #include "core/css/StylePropertySet.h"
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 }); 166 });
167 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); 167 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid);
168 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse" ); 168 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse" );
169 169
170 TRACE_EVENT_END2( 170 TRACE_EVENT_END2(
171 "blink,blink_style", "CSSParserImpl::parseStyleSheet", 171 "blink,blink_style", "CSSParserImpl::parseStyleSheet",
172 "tokenCount", scope.tokenCount(), 172 "tokenCount", scope.tokenCount(),
173 "length", string.length()); 173 "length", string.length());
174 } 174 }
175 175
176 CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange prelude, St yleSheetContents* styleSheet)
Timothy Loh 2016/02/01 21:55:16 prelude -> range? This isn't really a prelude when
ramya.v 2016/02/02 05:43:24 Done in https://codereview.chromium.org/1653303002
177 {
178 prelude.consumeWhitespace();
179 AtomicString typeSelector;
180 if (prelude.peek().type() == IdentToken)
181 typeSelector = prelude.consume().value();
182
183 AtomicString pseudo;
184 if (prelude.peek().type() == ColonToken) {
185 prelude.consume();
186 if (prelude.peek().type() != IdentToken)
187 return CSSSelectorList();
188 pseudo = prelude.consume().value();
189 }
190
191 prelude.consumeWhitespace();
192 if (!prelude.atEnd())
193 return CSSSelectorList(); // Parse error; extra tokens in @page header
Timothy Loh 2016/02/01 21:55:15 @page header -> @page selector (actually I don't t
ramya.v 2016/02/02 05:43:24 Done in https://codereview.chromium.org/1653303002
194
195 OwnPtr<CSSParserSelector> selector;
196 if (!typeSelector.isNull() && pseudo.isNull()) {
197 selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelecto r, styleSheet->defaultNamespace()));
rune 2016/02/01 14:09:34 Namespaces for page names doesn't make sense, and
ramya.v 2016/02/01 15:50:05 Sure will take care in subsequent patch.
198 } else {
199 selector = CSSParserSelector::create();
200 if (!pseudo.isNull()) {
201 selector->setMatch(CSSSelector::PagePseudoClass);
202 selector->updatePseudoType(pseudo.lower());
203 if (selector->pseudoType() == CSSSelector::PseudoUnknown)
204 return CSSSelectorList();
205 }
206 if (!typeSelector.isNull()) {
207 selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, s tyleSheet->defaultNamespace()));
208 }
209 }
210
211 selector->setForPage();
212 Vector<OwnPtr<CSSParserSelector>> selectorVector;
213 selectorVector.append(selector.release());
214 CSSSelectorList selectorList = CSSSelectorList::adoptSelectorVector(selector Vector);
215 return selectorList;
216 }
217
176 PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& key List) 218 PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& key List)
177 { 219 {
178 return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange()); 220 return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange());
179 } 221 }
180 222
181 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range) 223 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range)
182 { 224 {
183 ASSERT(m_parsedProperties.isEmpty()); 225 ASSERT(m_parsedProperties.isEmpty());
184 consumeDeclaration(range, StyleRule::Style); 226 consumeDeclaration(range, StyleRule::Style);
185 bool result = !m_parsedProperties.isEmpty(); 227 bool result = !m_parsedProperties.isEmpty();
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 consumeRuleList(block, KeyframesRuleList, [keyframeRule](PassRefPtrWillBeRaw Ptr<StyleRuleBase> keyframe) { 571 consumeRuleList(block, KeyframesRuleList, [keyframeRule](PassRefPtrWillBeRaw Ptr<StyleRuleBase> keyframe) {
530 keyframeRule->parserAppendKeyframe(toStyleRuleKeyframe(keyframe.get())); 572 keyframeRule->parserAppendKeyframe(toStyleRuleKeyframe(keyframe.get()));
531 }); 573 });
532 keyframeRule->setName(name); 574 keyframeRule->setName(name);
533 keyframeRule->setVendorPrefixed(webkitPrefixed); 575 keyframeRule->setVendorPrefixed(webkitPrefixed);
534 return keyframeRule.release(); 576 return keyframeRule.release();
535 } 577 }
536 578
537 PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTo kenRange prelude, CSSParserTokenRange block) 579 PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTo kenRange prelude, CSSParserTokenRange block)
538 { 580 {
539 // We only support a small subset of the css-page spec. 581 // We only support a small subset of the css-page spec.
Timothy Loh 2016/02/01 21:55:16 This comment should be moved to parsePageSelector.
ramya.v 2016/02/02 05:43:24 Done in https://codereview.chromium.org/1653303002
540 prelude.consumeWhitespace(); 582 CSSSelectorList selectorList = parsePageSelector(prelude, m_styleSheet);
541 AtomicString typeSelector; 583 if (!selectorList.isValid())
542 if (prelude.peek().type() == IdentToken) 584 return nullptr;
Timothy Loh 2016/02/01 21:55:16 FYI I was fairly deliberate with commenting on par
ramya.v 2016/02/02 05:43:24 Done in https://codereview.chromium.org/1653303002
543 typeSelector = prelude.consume().value();
544
545 AtomicString pseudo;
546 if (prelude.peek().type() == ColonToken) {
547 prelude.consume();
548 if (prelude.peek().type() != IdentToken)
549 return nullptr; // Parse error; expected ident token following colon in @page header
550 pseudo = prelude.consume().value();
551 }
552
553 prelude.consumeWhitespace();
554 if (!prelude.atEnd())
555 return nullptr; // Parse error; extra tokens in @page header
556
557 OwnPtr<CSSParserSelector> selector;
558 if (!typeSelector.isNull() && pseudo.isNull()) {
559 selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelecto r, m_styleSheet->defaultNamespace()));
560 } else {
561 selector = CSSParserSelector::create();
562 if (!pseudo.isNull()) {
563 selector->setMatch(CSSSelector::PagePseudoClass);
564 selector->updatePseudoType(pseudo.lower());
565 if (selector->pseudoType() == CSSSelector::PseudoUnknown)
566 return nullptr; // Parse error; unknown page pseudo-class
567 }
568 if (!typeSelector.isNull())
569 selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, m _styleSheet->defaultNamespace()));
570 }
571 585
572 if (m_observerWrapper) { 586 if (m_observerWrapper) {
573 unsigned endOffset = m_observerWrapper->endOffset(prelude); 587 unsigned endOffset = m_observerWrapper->endOffset(prelude);
574 m_observerWrapper->observer().startRuleHeader(StyleRule::Page, m_observe rWrapper->startOffset(prelude)); 588 m_observerWrapper->observer().startRuleHeader(StyleRule::Page, m_observe rWrapper->startOffset(prelude));
575 m_observerWrapper->observer().endRuleHeader(endOffset); 589 m_observerWrapper->observer().endRuleHeader(endOffset);
576 } 590 }
577 591
578 selector->setForPage();
579 Vector<OwnPtr<CSSParserSelector>> selectorVector;
580 selectorVector.append(selector.release());
581 CSSSelectorList selectorList = CSSSelectorList::adoptSelectorVector(selector Vector);
582
583 consumeDeclarationList(block, StyleRule::Style); 592 consumeDeclarationList(block, StyleRule::Style);
584 593
585 return StyleRulePage::create(std::move(selectorList), createStylePropertySet (m_parsedProperties, m_context.mode())); 594 return StyleRulePage::create(std::move(selectorList), createStylePropertySet (m_parsedProperties, m_context.mode()));
586 } 595 }
587 596
588 PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRul e(CSSParserTokenRange prelude, CSSParserTokenRange block) 597 PassRefPtrWillBeRawPtr<StyleRuleKeyframe> CSSParserImpl::consumeKeyframeStyleRul e(CSSParserTokenRange prelude, CSSParserTokenRange block)
589 { 598 {
590 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude); 599 OwnPtr<Vector<double>> keyList = consumeKeyframeKeyList(prelude);
591 if (!keyList) 600 if (!keyList)
592 return nullptr; 601 return nullptr;
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 else 764 else
756 return nullptr; // Parser error, invalid value in keyframe selector 765 return nullptr; // Parser error, invalid value in keyframe selector
757 if (range.atEnd()) 766 if (range.atEnd())
758 return result.release(); 767 return result.release();
759 if (range.consume().type() != CommaToken) 768 if (range.consume().type() != CommaToken)
760 return nullptr; // Parser error 769 return nullptr; // Parser error
761 } 770 }
762 } 771 }
763 772
764 } // namespace blink 773 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698