OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |