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); |