Chromium Code Reviews| 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()) { |