Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
| index 33e69d2192ce6561da902d708cea6a3803f93fc3..5254e11979c0515932208ad1ef30a18734909a48 100644 |
| --- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
| +++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
| @@ -7,6 +7,8 @@ |
| #include "core/css/CSSSelectorList.h" |
| #include "core/css/StyleSheetContents.h" |
| #include "core/css/parser/CSSParserContext.h" |
| +#include "core/css/parser/CSSParserObserver.h" |
| +#include "core/css/parser/CSSParserTokenStream.h" |
| #include "core/frame/UseCounter.h" |
| #include "platform/RuntimeEnabledFeatures.h" |
| #include "wtf/PtrUtil.h" |
| @@ -106,11 +108,61 @@ CSSSelectorList CSSSelectorParser::parseSelector( |
| return result; |
| } |
| +CSSSelectorList CSSSelectorParser::consumeSelector( |
| + CSSParserTokenStream& stream, |
| + const CSSParserContext& context, |
| + StyleSheetContents* styleSheet, |
| + size_t startOffset, |
| + CSSParserObserver* observer) { |
| + CSSSelectorParser parser(context, styleSheet); |
| + DCHECK_NE(stream.peek().type(), WhitespaceToken); |
| + CSSSelectorList result = |
| + parser.consumeComplexSelectorList(stream, startOffset, observer); |
| + |
| + recordSelectorStats(context, result); |
| + return result; |
| +} |
| + |
| CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context, |
| StyleSheetContents* styleSheet) |
| : m_context(context), m_styleSheet(styleSheet) {} |
| CSSSelectorList CSSSelectorParser::consumeComplexSelectorList( |
| + CSSParserTokenStream& stream, |
| + size_t startOffset, |
| + CSSParserObserver* observer) { |
| + Vector<std::unique_ptr<CSSParserSelector>> selectorList; |
| + |
| + while (true) { |
| + size_t selectorStart = stream.index(); |
| + stream.consumeUntilAtEndOrPeekedTypeIs<LeftBraceToken, CommaToken>(); |
| + if (stream.atEnd()) |
| + return CSSSelectorList(); |
| + |
| + CSSParserTokenRange complexSelector = |
| + stream.makeSubRangeFrom(selectorStart); |
| + std::unique_ptr<CSSParserSelector> selector = |
| + consumeComplexSelector(complexSelector); |
| + if (observer) |
| + observer->observeSelector(startOffset, stream.previousOffset()); |
| + stream.clean(); |
| + |
| + if (!selector || m_failedParsing || !complexSelector.atEnd()) |
| + return CSSSelectorList(); |
| + |
| + selectorList.append(std::move(selector)); |
| + if (stream.peek().type() == LeftBraceToken) |
| + break; |
| + DCHECK_EQ(stream.peek().type(), CommaToken); |
| + stream.consume(); |
| + stream.skipWhitespaceAndComments(); |
| + startOffset = stream.offset(); |
| + } |
| + |
| + return CSSSelectorList::adoptSelectorVector(selectorList); |
|
Charlie Harrison
2017/01/09 21:35:07
Not new code, but why do we allocate some selector
|
| +} |
| + |
| +CSSSelectorList CSSSelectorParser::consumeComplexSelectorList( |
| CSSParserTokenRange& range) { |
| Vector<std::unique_ptr<CSSParserSelector>> selectorList; |
| std::unique_ptr<CSSParserSelector> selector = consumeComplexSelector(range); |