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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/css/parser/CSSSelectorParser.h" 5 #include "core/css/parser/CSSSelectorParser.h"
6 6
7 #include "core/css/CSSSelectorList.h" 7 #include "core/css/CSSSelectorList.h"
8 #include "core/css/StyleSheetContents.h" 8 #include "core/css/StyleSheetContents.h"
9 #include "core/css/parser/CSSParserContext.h" 9 #include "core/css/parser/CSSParserContext.h"
10 #include "core/css/parser/CSSParserObserver.h"
11 #include "core/css/parser/CSSParserTokenStream.h"
10 #include "core/frame/UseCounter.h" 12 #include "core/frame/UseCounter.h"
11 #include "platform/RuntimeEnabledFeatures.h" 13 #include "platform/RuntimeEnabledFeatures.h"
12 #include "wtf/PtrUtil.h" 14 #include "wtf/PtrUtil.h"
13 #include <memory> 15 #include <memory>
14 16
15 namespace blink { 17 namespace blink {
16 18
17 static void recordSelectorStats(const CSSParserContext& context, 19 static void recordSelectorStats(const CSSParserContext& context,
18 const CSSSelectorList& selectorList) { 20 const CSSSelectorList& selectorList) {
19 if (!context.useCounter()) 21 if (!context.useCounter())
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 CSSSelectorParser parser(context, styleSheet); 101 CSSSelectorParser parser(context, styleSheet);
100 range.consumeWhitespace(); 102 range.consumeWhitespace();
101 CSSSelectorList result = parser.consumeComplexSelectorList(range); 103 CSSSelectorList result = parser.consumeComplexSelectorList(range);
102 if (!range.atEnd()) 104 if (!range.atEnd())
103 return CSSSelectorList(); 105 return CSSSelectorList();
104 106
105 recordSelectorStats(context, result); 107 recordSelectorStats(context, result);
106 return result; 108 return result;
107 } 109 }
108 110
111 CSSSelectorList CSSSelectorParser::consumeSelector(
112 CSSParserTokenStream& stream,
113 const CSSParserContext& context,
114 StyleSheetContents* styleSheet,
115 size_t startOffset,
116 CSSParserObserver* observer) {
117 CSSSelectorParser parser(context, styleSheet);
118 DCHECK_NE(stream.peek().type(), WhitespaceToken);
119 CSSSelectorList result =
120 parser.consumeComplexSelectorList(stream, startOffset, observer);
121
122 recordSelectorStats(context, result);
123 return result;
124 }
125
109 CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context, 126 CSSSelectorParser::CSSSelectorParser(const CSSParserContext& context,
110 StyleSheetContents* styleSheet) 127 StyleSheetContents* styleSheet)
111 : m_context(context), m_styleSheet(styleSheet) {} 128 : m_context(context), m_styleSheet(styleSheet) {}
112 129
113 CSSSelectorList CSSSelectorParser::consumeComplexSelectorList( 130 CSSSelectorList CSSSelectorParser::consumeComplexSelectorList(
131 CSSParserTokenStream& stream,
132 size_t startOffset,
133 CSSParserObserver* observer) {
134 Vector<std::unique_ptr<CSSParserSelector>> selectorList;
135
136 while (true) {
137 size_t selectorStart = stream.index();
138 stream.consumeUntilAtEndOrPeekedTypeIs<LeftBraceToken, CommaToken>();
139 if (stream.atEnd())
140 return CSSSelectorList();
141
142 CSSParserTokenRange complexSelector =
143 stream.makeSubRangeFrom(selectorStart);
144 std::unique_ptr<CSSParserSelector> selector =
145 consumeComplexSelector(complexSelector);
146 if (observer)
147 observer->observeSelector(startOffset, stream.previousOffset());
148 stream.clean();
149
150 if (!selector || m_failedParsing || !complexSelector.atEnd())
151 return CSSSelectorList();
152
153 selectorList.append(std::move(selector));
154 if (stream.peek().type() == LeftBraceToken)
155 break;
156 DCHECK_EQ(stream.peek().type(), CommaToken);
157 stream.consume();
158 stream.skipWhitespaceAndComments();
159 startOffset = stream.offset();
160 }
161
162 return CSSSelectorList::adoptSelectorVector(selectorList);
Charlie Harrison 2017/01/09 21:35:07 Not new code, but why do we allocate some selector
163 }
164
165 CSSSelectorList CSSSelectorParser::consumeComplexSelectorList(
114 CSSParserTokenRange& range) { 166 CSSParserTokenRange& range) {
115 Vector<std::unique_ptr<CSSParserSelector>> selectorList; 167 Vector<std::unique_ptr<CSSParserSelector>> selectorList;
116 std::unique_ptr<CSSParserSelector> selector = consumeComplexSelector(range); 168 std::unique_ptr<CSSParserSelector> selector = consumeComplexSelector(range);
117 if (!selector) 169 if (!selector)
118 return CSSSelectorList(); 170 return CSSSelectorList();
119 selectorList.push_back(std::move(selector)); 171 selectorList.push_back(std::move(selector));
120 while (!range.atEnd() && range.peek().type() == CommaToken) { 172 while (!range.atEnd() && range.peek().type() == CommaToken) {
121 range.consumeIncludingWhitespace(); 173 range.consumeIncludingWhitespace();
122 selector = consumeComplexSelector(range); 174 selector = consumeComplexSelector(range);
123 if (!selector) 175 if (!selector)
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 splitAfter->releaseTagHistory(); 926 splitAfter->releaseTagHistory();
875 secondCompound->appendTagHistory( 927 secondCompound->appendTagHistory(
876 secondCompound->pseudoType() == CSSSelector::PseudoSlotted 928 secondCompound->pseudoType() == CSSSelector::PseudoSlotted
877 ? CSSSelector::ShadowSlot 929 ? CSSSelector::ShadowSlot
878 : CSSSelector::ShadowPseudo, 930 : CSSSelector::ShadowPseudo,
879 std::move(compoundSelector)); 931 std::move(compoundSelector));
880 return secondCompound; 932 return secondCompound;
881 } 933 }
882 934
883 } // namespace blink 935 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698