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