Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Unified Diff: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp

Issue 2503683003: [WIP] Streaming CSS parser (Closed)
Patch Set: rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698