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

Unified 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, 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
diff --git a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
index 47300c6a897999dfec368d8391fce2fce1ef1305..1d61ee53cd61039cb6a6c4c370dc8c9e31077df1 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp
@@ -173,6 +173,48 @@ void CSSParserImpl::parseStyleSheet(const String& string, const CSSParserContext
"length", string.length());
}
+CSSSelectorList CSSParserImpl::parsePageSelector(CSSParserTokenRange prelude, StyleSheetContents* 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
+{
+ prelude.consumeWhitespace();
+ AtomicString typeSelector;
+ if (prelude.peek().type() == IdentToken)
+ typeSelector = prelude.consume().value();
+
+ AtomicString pseudo;
+ if (prelude.peek().type() == ColonToken) {
+ prelude.consume();
+ if (prelude.peek().type() != IdentToken)
+ return CSSSelectorList();
+ pseudo = prelude.consume().value();
+ }
+
+ prelude.consumeWhitespace();
+ if (!prelude.atEnd())
+ 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
+
+ OwnPtr<CSSParserSelector> selector;
+ if (!typeSelector.isNull() && pseudo.isNull()) {
+ selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelector, 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.
+ } else {
+ selector = CSSParserSelector::create();
+ if (!pseudo.isNull()) {
+ selector->setMatch(CSSSelector::PagePseudoClass);
+ selector->updatePseudoType(pseudo.lower());
+ if (selector->pseudoType() == CSSSelector::PseudoUnknown)
+ return CSSSelectorList();
+ }
+ if (!typeSelector.isNull()) {
+ selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, styleSheet->defaultNamespace()));
+ }
+ }
+
+ selector->setForPage();
+ Vector<OwnPtr<CSSParserSelector>> selectorVector;
+ selectorVector.append(selector.release());
+ CSSSelectorList selectorList = CSSSelectorList::adoptSelectorVector(selectorVector);
+ return selectorList;
+}
+
PassOwnPtr<Vector<double>> CSSParserImpl::parseKeyframeKeyList(const String& keyList)
{
return consumeKeyframeKeyList(CSSTokenizer::Scope(keyList).tokenRange());
@@ -537,37 +579,9 @@ PassRefPtrWillBeRawPtr<StyleRuleKeyframes> CSSParserImpl::consumeKeyframesRule(b
PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
{
// 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
- prelude.consumeWhitespace();
- AtomicString typeSelector;
- if (prelude.peek().type() == IdentToken)
- typeSelector = prelude.consume().value();
-
- AtomicString pseudo;
- if (prelude.peek().type() == ColonToken) {
- prelude.consume();
- if (prelude.peek().type() != IdentToken)
- return nullptr; // Parse error; expected ident token following colon in @page header
- pseudo = prelude.consume().value();
- }
-
- prelude.consumeWhitespace();
- if (!prelude.atEnd())
- return nullptr; // Parse error; extra tokens in @page header
-
- OwnPtr<CSSParserSelector> selector;
- if (!typeSelector.isNull() && pseudo.isNull()) {
- selector = CSSParserSelector::create(QualifiedName(nullAtom, typeSelector, m_styleSheet->defaultNamespace()));
- } else {
- selector = CSSParserSelector::create();
- if (!pseudo.isNull()) {
- selector->setMatch(CSSSelector::PagePseudoClass);
- selector->updatePseudoType(pseudo.lower());
- if (selector->pseudoType() == CSSSelector::PseudoUnknown)
- return nullptr; // Parse error; unknown page pseudo-class
- }
- if (!typeSelector.isNull())
- selector->prependTagSelector(QualifiedName(nullAtom, typeSelector, m_styleSheet->defaultNamespace()));
- }
+ CSSSelectorList selectorList = parsePageSelector(prelude, m_styleSheet);
+ if (!selectorList.isValid())
+ 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
if (m_observerWrapper) {
unsigned endOffset = m_observerWrapper->endOffset(prelude);
@@ -575,11 +589,6 @@ PassRefPtrWillBeRawPtr<StyleRulePage> CSSParserImpl::consumePageRule(CSSParserTo
m_observerWrapper->observer().endRuleHeader(endOffset);
}
- selector->setForPage();
- Vector<OwnPtr<CSSParserSelector>> selectorVector;
- selectorVector.append(selector.release());
- CSSSelectorList selectorList = CSSSelectorList::adoptSelectorVector(selectorVector);
-
consumeDeclarationList(block, StyleRule::Style);
return StyleRulePage::create(std::move(selectorList), createStylePropertySet(m_parsedProperties, m_context.mode()));

Powered by Google App Engine
This is Rietveld 408576698