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

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: rebase/address comments Created 5 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
« no previous file with comments | « Source/core/css/parser/CSSParserImpl.h ('k') | Source/core/css/parser/CSSParserTokenRange.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/css/parser/CSSParserImpl.cpp
diff --git a/Source/core/css/parser/CSSParserImpl.cpp b/Source/core/css/parser/CSSParserImpl.cpp
index a94df2f714a99b72201937ba3601025049b9b181..f17a9d01750685429aa195a11f6a853ae81eb503 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,61 @@ 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; // Parse error, empty rule
+ RefPtrWillBeRawPtr<StyleRuleBase> rule;
+ if (range.peek().type() == AtKeywordToken)
+ rule = parser.consumeAtRule(range);
+ else
+ rule = parser.consumeQualifiedRule(range);
+ if (!rule)
+ return nullptr; // Parse error, failed to consume rule
+ range.consumeWhitespaceAndComments();
+ if (!rule || !range.atEnd())
+ return nullptr; // Parse 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() && range.peek().type() != LeftBraceToken)
+ range.consumeComponentValue();
+
+ if (range.atEnd())
+ return nullptr; // Parse error, EOF instead of qualified rule block
+
+ CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek());
+ CSSParserTokenRange block = range.consumeBlock();
+ return consumeStyleRule(prelude, block);
+}
+
+PassRefPtrWillBeRawPtr<StyleRule> CSSParserImpl::consumeStyleRule(CSSParserTokenRange prelude, CSSParserTokenRange block)
+{
+ CSSSelectorList selectorList;
+ CSSSelectorParser::parseSelector(prelude, m_context, selectorList);
+ if (!selectorList.isValid())
+ return nullptr; // Parse 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();
+ return rule.release();
+}
+
void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, CSSRuleSourceData::Type ruleType)
{
while (!range.atEnd()) {
« no previous file with comments | « Source/core/css/parser/CSSParserImpl.h ('k') | Source/core/css/parser/CSSParserTokenRange.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698