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..4001a45d1f3d8910c244d3ff6febf80032193d6b 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; // Parser error, empty rule |
alancutter (OOO until 2018)
2014/12/29 05:10:21
s/Parser error/Parse error/g
Timothy Loh
2015/01/05 05:56:18
Done. There's a bunch of other places I wrote "Par
|
+ 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() && range.peek().type() != LeftBraceToken) |
+ range.consumeComponentValue(); |
+ |
+ if (range.atEnd()) |
+ return nullptr; // Parser 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; // 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(); |
+ return rule.release(); |
+} |
+ |
void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, CSSRuleSourceData::Type ruleType) |
{ |
while (!range.atEnd()) { |