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()) { |