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

Unified Diff: Source/core/css/parser/CSSSelectorParser.cpp

Issue 792763003: CSS Parser: Implement selector parsing (pseudo-classes/elements) [3/3] (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@selector2
Patch Set: Created 6 years 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
« no previous file with comments | « Source/core/css/parser/CSSSelectorParser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/parser/CSSSelectorParser.cpp
diff --git a/Source/core/css/parser/CSSSelectorParser.cpp b/Source/core/css/parser/CSSSelectorParser.cpp
index 8b735232bc03b72a064caf3d74e0e5cce0bddc4d..5e7e1cb4591a3465d65f837f81fc85a7a364bbb8 100644
--- a/Source/core/css/parser/CSSSelectorParser.cpp
+++ b/Source/core/css/parser/CSSSelectorParser.cpp
@@ -50,6 +50,25 @@ void CSSSelectorParser::consumeComplexSelectorList(CSSSelectorList& output)
output.adoptSelectorVector(selectorList);
}
+void CSSSelectorParser::consumeCompoundSelectorList(CSSSelectorList& output)
+{
+ Vector<OwnPtr<CSSParserSelector> > selectorList;
+ OwnPtr<CSSParserSelector> selector = consumeCompoundSelector();
+ if (!selector)
+ return;
+ selectorList.append(selector.release());
+ while (!m_tokenRange.atEnd() && m_tokenRange.peek().type() == CommaToken) {
+ m_tokenRange.consumeIncludingWhitespaceAndComments();
+ selector = consumeCompoundSelector();
+ if (!selector)
+ return;
+ selectorList.append(selector.release());
+ }
+
+ if (!m_failedParsing)
+ output.adoptSelectorVector(selectorList);
+}
+
PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumeComplexSelector()
{
OwnPtr<CSSParserSelector> selector = consumeCompoundSelector();
@@ -240,7 +259,62 @@ PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumeAttribute()
PassOwnPtr<CSSParserSelector> CSSSelectorParser::consumePseudo()
{
- // FIXME: Implement pseudo-element and pseudo-class parsing
+ ASSERT(m_tokenRange.peek().type() == ColonToken);
+ m_tokenRange.consumeIncludingComments();
+
+ int colons = 1;
+ if (m_tokenRange.peek().type() == ColonToken) {
+ m_tokenRange.consumeIncludingComments();
+ colons++;
+ }
+
+ const CSSParserToken& token = m_tokenRange.consumeIncludingComments();
+ if (token.type() != IdentToken && token.type() != FunctionToken)
+ return nullptr;
+ m_tokenRange.consumeWhitespaceAndComments();
+
+ OwnPtr<CSSParserSelector> selector = CSSParserSelector::create();
+ selector->setMatch(colons == 1 ? CSSSelector::PseudoClass : CSSSelector::PseudoElement);
+ selector->setValue(AtomicString(token.value().lower()));
+
+ if (token.type() == IdentToken) {
+ if (selector->pseudoType() == CSSSelector::PseudoUnknown)
+ return nullptr;
+ return selector.release();
+ }
+
+ if ((colons == 1
+ && (equalIgnoringCase(token.value(), "host")
+ || equalIgnoringCase(token.value(), "host-context")
+ || equalIgnoringCase(token.value(), "-webkit-any")))
+ || (colons == 2 && equalIgnoringCase(token.value(), "cue"))) {
+
+ CSSSelectorList* selectorList = new CSSSelectorList();
+ consumeCompoundSelectorList(*selectorList);
+ if (!selectorList->isValid() || (!m_tokenRange.atEnd() && m_tokenRange.consumeIncludingComments().type() != RightParenthesisToken))
alancutter (OOO until 2018) 2014/12/29 02:53:01 consumeCompoundSelectorList does not consume trail
Timothy Loh 2015/01/05 05:24:51 Updated consumeCompoundSelectorList to consume tra
+ return nullptr;
+
+ selector->setSelectorList(adoptPtr(selectorList));
+ selector->pseudoType(); // FIXME: Do we need to force the pseudo type to be cached?
+ ASSERT(selector->pseudoType() != CSSSelector::PseudoUnknown);
+ return selector.release();
+ }
+
+ if (colons == 1 && equalIgnoringCase(token.value(), "not")) {
+ OwnPtr<CSSParserSelector> innerSelector = consumeCompoundSelector();
+ if (!innerSelector || !innerSelector->isSimple())
+ return nullptr;
+ Vector<OwnPtr<CSSParserSelector> > selectorVector;
+ selectorVector.append(innerSelector.release());
+ selector->adoptSelectorVector(selectorVector);
+ if (!m_tokenRange.atEnd() && m_tokenRange.consumeIncludingComments().type() != RightParenthesisToken)
alancutter (OOO until 2018) 2014/12/29 02:53:01 consumeCompoundSelector does not consume trailing
+ return nullptr;
+ return selector.release();
+ }
+
+ // FIXME: Support :nth-*(<an+b>)
+ // FIXME: Support :lang(<ident>)
+
return nullptr;
}
« no previous file with comments | « Source/core/css/parser/CSSSelectorParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698