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

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

Issue 799003003: CSS Parser: Implement parseRule (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@attoken
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
Index: Source/core/css/parser/CSSParserImpl.cpp
diff --git a/Source/core/css/parser/CSSParserImpl.cpp b/Source/core/css/parser/CSSParserImpl.cpp
index 955a2b64f27e4477b221f5b69899aa8067744144..094913d71f4b3bbe294c76644e8e8f7311e36868 100644
--- a/Source/core/css/parser/CSSParserImpl.cpp
+++ b/Source/core/css/parser/CSSParserImpl.cpp
@@ -10,6 +10,7 @@
#include "core/css/StyleSheetContents.h"
#include "core/css/parser/CSSParserValues.h"
#include "core/css/parser/CSSPropertyParser.h"
+#include "core/css/parser/CSSSelectorParser.h"
#include "core/css/parser/CSSTokenizer.h"
#include "core/dom/Document.h"
#include "core/dom/Element.h"
@@ -88,6 +89,57 @@ bool CSSParserImpl::parseDeclaration(MutableStylePropertySet* declaration, const
return true;
}
+PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::parseRule(const String& string, const CSSParserContext& context)
+{
+ CSSParserImpl parser(context, string);
+ CSSParserTokenRange range(parser.m_tokens);
+ range.consumeWhitespaceAndComments();
+ if (range.atEnd())
+ return nullptr; // Parser error, empty rule
+ RefPtrWillBeRawPtr<StyleRuleBase> rule;
+ if (range.peek().type() == AtKeywordToken)
+ rule = parser.consumeAtRule(range);
+ else
+ rule = parser.consumeQualifiedRule(range);
+ if (!rule)
+ return nullptr; // Parser error, failed to consume rule
+ range.consumeWhitespaceAndComments();
+ if (!rule || !range.atEnd())
+ return nullptr; // Parser error, trailing garbage
+ return rule;
+}
+
+PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::consumeAtRule(CSSParserTokenRange& range)
+{
+ // FIXME: Implement at-rule parsing
+ return nullptr;
+}
+
+PassRefPtrWillBeRawPtr<StyleRuleBase> CSSParserImpl::consumeQualifiedRule(CSSParserTokenRange& range)
+{
+ const CSSParserToken* preludeStart = &range.peek();
+ while (!range.atEnd()) {
+ if (range.peek().type() == LeftBraceToken) {
+ CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek());
+ CSSParserTokenRange block = range.consumeBlock();
+
+ CSSSelectorList selectorList;
+ CSSSelectorParser::parseSelector(prelude, m_context, selectorList);
+ if (!selectorList.isValid())
+ return nullptr; // Parser error, invalid selector list
+ consumeDeclarationList(block, CSSRuleSourceData::STYLE_RULE);
+
+ RefPtrWillBeRawPtr<StyleRule> rule = StyleRule::create();
+ rule->wrapperAdoptSelectorList(selectorList);
+ rule->setProperties(createStylePropertySet(m_parsedProperties, m_context.mode()));
+ m_parsedProperties.clear();
Timothy Loh 2014/12/16 00:01:20 This doesn't make a difference right now, but when
+ return rule.release();
+ }
+ range.consumeComponentValue();
+ }
+ return nullptr;
+}
+
void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, CSSRuleSourceData::Type ruleType)
{
while (!range.atEnd()) {

Powered by Google App Engine
This is Rietveld 408576698