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

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp

Issue 2616093003: Make CSSParserContext be garbage collected. (Closed)
Patch Set: fix fuzzer compile again 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/CSSParserImpl.h" 5 #include "core/css/parser/CSSParserImpl.h"
6 6
7 #include "core/css/CSSCustomIdentValue.h" 7 #include "core/css/CSSCustomIdentValue.h"
8 #include "core/css/CSSCustomPropertyDeclaration.h" 8 #include "core/css/CSSCustomPropertyDeclaration.h"
9 #include "core/css/CSSKeyframesRule.h" 9 #include "core/css/CSSKeyframesRule.h"
10 #include "core/css/CSSStyleSheet.h" 10 #include "core/css/CSSStyleSheet.h"
(...skipping 18 matching lines...) Expand all
29 #include "core/dom/Element.h" 29 #include "core/dom/Element.h"
30 #include "core/frame/Deprecation.h" 30 #include "core/frame/Deprecation.h"
31 #include "core/frame/UseCounter.h" 31 #include "core/frame/UseCounter.h"
32 #include "platform/instrumentation/tracing/TraceEvent.h" 32 #include "platform/instrumentation/tracing/TraceEvent.h"
33 #include "wtf/PtrUtil.h" 33 #include "wtf/PtrUtil.h"
34 #include <bitset> 34 #include <bitset>
35 #include <memory> 35 #include <memory>
36 36
37 namespace blink { 37 namespace blink {
38 38
39 CSSParserImpl::CSSParserImpl(const CSSParserContext& context, 39 CSSParserImpl::CSSParserImpl(const CSSParserContext* context,
40 StyleSheetContents* styleSheet) 40 StyleSheetContents* styleSheet)
41 : m_context(context), 41 : m_context(context),
42 m_styleSheet(styleSheet), 42 m_styleSheet(styleSheet),
43 m_observerWrapper(nullptr) {} 43 m_observerWrapper(nullptr) {}
44 44
45 MutableStylePropertySet::SetResult CSSParserImpl::parseValue( 45 MutableStylePropertySet::SetResult CSSParserImpl::parseValue(
46 MutableStylePropertySet* declaration, 46 MutableStylePropertySet* declaration,
47 CSSPropertyID unresolvedProperty, 47 CSSPropertyID unresolvedProperty,
48 const String& string, 48 const String& string,
49 bool important, 49 bool important,
50 const CSSParserContext& context) { 50 const CSSParserContext* context) {
51 CSSParserImpl parser(context); 51 CSSParserImpl parser(context);
52 StyleRule::RuleType ruleType = StyleRule::Style; 52 StyleRule::RuleType ruleType = StyleRule::Style;
53 if (declaration->cssParserMode() == CSSViewportRuleMode) 53 if (declaration->cssParserMode() == CSSViewportRuleMode)
54 ruleType = StyleRule::Viewport; 54 ruleType = StyleRule::Viewport;
55 else if (declaration->cssParserMode() == CSSFontFaceRuleMode) 55 else if (declaration->cssParserMode() == CSSFontFaceRuleMode)
56 ruleType = StyleRule::FontFace; 56 ruleType = StyleRule::FontFace;
57 CSSTokenizer tokenizer(string); 57 CSSTokenizer tokenizer(string);
58 parser.consumeDeclarationValue(tokenizer.tokenRange(), unresolvedProperty, 58 parser.consumeDeclarationValue(tokenizer.tokenRange(), unresolvedProperty,
59 important, ruleType); 59 important, ruleType);
60 bool didParse = false; 60 bool didParse = false;
61 bool didChange = false; 61 bool didChange = false;
62 if (!parser.m_parsedProperties.isEmpty()) { 62 if (!parser.m_parsedProperties.isEmpty()) {
63 didParse = true; 63 didParse = true;
64 didChange = declaration->addParsedProperties(parser.m_parsedProperties); 64 didChange = declaration->addParsedProperties(parser.m_parsedProperties);
65 } 65 }
66 return MutableStylePropertySet::SetResult{didParse, didChange}; 66 return MutableStylePropertySet::SetResult{didParse, didChange};
67 } 67 }
68 68
69 MutableStylePropertySet::SetResult CSSParserImpl::parseVariableValue( 69 MutableStylePropertySet::SetResult CSSParserImpl::parseVariableValue(
70 MutableStylePropertySet* declaration, 70 MutableStylePropertySet* declaration,
71 const AtomicString& propertyName, 71 const AtomicString& propertyName,
72 const PropertyRegistry* registry, 72 const PropertyRegistry* registry,
73 const String& value, 73 const String& value,
74 bool important, 74 bool important,
75 const CSSParserContext& context, 75 const CSSParserContext* context,
76 bool isAnimationTainted) { 76 bool isAnimationTainted) {
77 CSSParserImpl parser(context); 77 CSSParserImpl parser(context);
78 CSSTokenizer tokenizer(value); 78 CSSTokenizer tokenizer(value);
79 parser.consumeVariableValue(tokenizer.tokenRange(), propertyName, important, 79 parser.consumeVariableValue(tokenizer.tokenRange(), propertyName, important,
80 isAnimationTainted); 80 isAnimationTainted);
81 bool didParse = false; 81 bool didParse = false;
82 bool didChange = false; 82 bool didChange = false;
83 if (!parser.m_parsedProperties.isEmpty()) { 83 if (!parser.m_parsedProperties.isEmpty()) {
84 const CSSCustomPropertyDeclaration* parsedDeclaration = 84 const CSSCustomPropertyDeclaration* parsedDeclaration =
85 toCSSCustomPropertyDeclaration(parser.m_parsedProperties[0].value()); 85 toCSSCustomPropertyDeclaration(parser.m_parsedProperties[0].value());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 ImmutableStylePropertySet* result = ImmutableStylePropertySet::create( 148 ImmutableStylePropertySet* result = ImmutableStylePropertySet::create(
149 results.data() + unusedEntries, results.size() - unusedEntries, mode); 149 results.data() + unusedEntries, results.size() - unusedEntries, mode);
150 parsedProperties.clear(); 150 parsedProperties.clear();
151 return result; 151 return result;
152 } 152 }
153 153
154 ImmutableStylePropertySet* CSSParserImpl::parseInlineStyleDeclaration( 154 ImmutableStylePropertySet* CSSParserImpl::parseInlineStyleDeclaration(
155 const String& string, 155 const String& string,
156 Element* element) { 156 Element* element) {
157 Document& document = element->document(); 157 Document& document = element->document();
158 CSSParserContext context = 158 CSSParserContext* context = CSSParserContext::create(
159 CSSParserContext(document.elementSheet().contents()->parserContext(), 159 document.elementSheet().contents()->parserContext(),
160 UseCounter::getFrom(&document)); 160 UseCounter::getFrom(&document));
161 CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode() 161 CSSParserMode mode = element->isHTMLElement() && !document.inQuirksMode()
162 ? HTMLStandardMode 162 ? HTMLStandardMode
163 : HTMLQuirksMode; 163 : HTMLQuirksMode;
164 context.setMode(mode); 164 context->setMode(mode);
165 CSSParserImpl parser(context, document.elementSheet().contents()); 165 CSSParserImpl parser(context, document.elementSheet().contents());
166 CSSTokenizer tokenizer(string); 166 CSSTokenizer tokenizer(string);
167 parser.consumeDeclarationList(tokenizer.tokenRange(), StyleRule::Style); 167 parser.consumeDeclarationList(tokenizer.tokenRange(), StyleRule::Style);
168 return createStylePropertySet(parser.m_parsedProperties, mode); 168 return createStylePropertySet(parser.m_parsedProperties, mode);
169 } 169 }
170 170
171 bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration, 171 bool CSSParserImpl::parseDeclarationList(MutableStylePropertySet* declaration,
172 const String& string, 172 const String& string,
173 const CSSParserContext& context) { 173 const CSSParserContext* context) {
174 CSSParserImpl parser(context); 174 CSSParserImpl parser(context);
175 StyleRule::RuleType ruleType = StyleRule::Style; 175 StyleRule::RuleType ruleType = StyleRule::Style;
176 if (declaration->cssParserMode() == CSSViewportRuleMode) 176 if (declaration->cssParserMode() == CSSViewportRuleMode)
177 ruleType = StyleRule::Viewport; 177 ruleType = StyleRule::Viewport;
178 CSSTokenizer tokenizer(string); 178 CSSTokenizer tokenizer(string);
179 parser.consumeDeclarationList(tokenizer.tokenRange(), ruleType); 179 parser.consumeDeclarationList(tokenizer.tokenRange(), ruleType);
180 if (parser.m_parsedProperties.isEmpty()) 180 if (parser.m_parsedProperties.isEmpty())
181 return false; 181 return false;
182 182
183 std::bitset<numCSSProperties> seenProperties; 183 std::bitset<numCSSProperties> seenProperties;
184 size_t unusedEntries = parser.m_parsedProperties.size(); 184 size_t unusedEntries = parser.m_parsedProperties.size();
185 HeapVector<CSSProperty, 256> results(unusedEntries); 185 HeapVector<CSSProperty, 256> results(unusedEntries);
186 HashSet<AtomicString> seenCustomProperties; 186 HashSet<AtomicString> seenCustomProperties;
187 filterProperties(true, parser.m_parsedProperties, results, unusedEntries, 187 filterProperties(true, parser.m_parsedProperties, results, unusedEntries,
188 seenProperties, seenCustomProperties); 188 seenProperties, seenCustomProperties);
189 filterProperties(false, parser.m_parsedProperties, results, unusedEntries, 189 filterProperties(false, parser.m_parsedProperties, results, unusedEntries,
190 seenProperties, seenCustomProperties); 190 seenProperties, seenCustomProperties);
191 if (unusedEntries) 191 if (unusedEntries)
192 results.remove(0, unusedEntries); 192 results.remove(0, unusedEntries);
193 return declaration->addParsedProperties(results); 193 return declaration->addParsedProperties(results);
194 } 194 }
195 195
196 StyleRuleBase* CSSParserImpl::parseRule(const String& string, 196 StyleRuleBase* CSSParserImpl::parseRule(const String& string,
197 const CSSParserContext& context, 197 const CSSParserContext* context,
198 StyleSheetContents* styleSheet, 198 StyleSheetContents* styleSheet,
199 AllowedRulesType allowedRules) { 199 AllowedRulesType allowedRules) {
200 CSSParserImpl parser(context, styleSheet); 200 CSSParserImpl parser(context, styleSheet);
201 CSSTokenizer tokenizer(string); 201 CSSTokenizer tokenizer(string);
202 CSSParserTokenRange range = tokenizer.tokenRange(); 202 CSSParserTokenRange range = tokenizer.tokenRange();
203 range.consumeWhitespace(); 203 range.consumeWhitespace();
204 if (range.atEnd()) 204 if (range.atEnd())
205 return nullptr; // Parse error, empty rule 205 return nullptr; // Parse error, empty rule
206 StyleRuleBase* rule; 206 StyleRuleBase* rule;
207 if (range.peek().type() == AtKeywordToken) 207 if (range.peek().type() == AtKeywordToken)
208 rule = parser.consumeAtRule(range, allowedRules); 208 rule = parser.consumeAtRule(range, allowedRules);
209 else 209 else
210 rule = parser.consumeQualifiedRule(range, allowedRules); 210 rule = parser.consumeQualifiedRule(range, allowedRules);
211 if (!rule) 211 if (!rule)
212 return nullptr; // Parse error, failed to consume rule 212 return nullptr; // Parse error, failed to consume rule
213 range.consumeWhitespace(); 213 range.consumeWhitespace();
214 if (!rule || !range.atEnd()) 214 if (!rule || !range.atEnd())
215 return nullptr; // Parse error, trailing garbage 215 return nullptr; // Parse error, trailing garbage
216 return rule; 216 return rule;
217 } 217 }
218 218
219 void CSSParserImpl::parseStyleSheet(const String& string, 219 void CSSParserImpl::parseStyleSheet(const String& string,
220 const CSSParserContext& context, 220 const CSSParserContext* context,
221 StyleSheetContents* styleSheet, 221 StyleSheetContents* styleSheet,
222 bool deferPropertyParsing) { 222 bool deferPropertyParsing) {
223 TRACE_EVENT_BEGIN2("blink,blink_style", "CSSParserImpl::parseStyleSheet", 223 TRACE_EVENT_BEGIN2("blink,blink_style", "CSSParserImpl::parseStyleSheet",
224 "baseUrl", context.baseURL().getString().utf8(), "mode", 224 "baseUrl", context->baseURL().getString().utf8(), "mode",
225 context.mode()); 225 context->mode());
226 226
227 TRACE_EVENT_BEGIN0("blink,blink_style", 227 TRACE_EVENT_BEGIN0("blink,blink_style",
228 "CSSParserImpl::parseStyleSheet.tokenize"); 228 "CSSParserImpl::parseStyleSheet.tokenize");
229 CSSTokenizer tokenizer(string); 229 CSSTokenizer tokenizer(string);
230 TRACE_EVENT_END0("blink,blink_style", 230 TRACE_EVENT_END0("blink,blink_style",
231 "CSSParserImpl::parseStyleSheet.tokenize"); 231 "CSSParserImpl::parseStyleSheet.tokenize");
232 232
233 TRACE_EVENT_BEGIN0("blink,blink_style", 233 TRACE_EVENT_BEGIN0("blink,blink_style",
234 "CSSParserImpl::parseStyleSheet.parse"); 234 "CSSParserImpl::parseStyleSheet.parse");
235 CSSParserImpl parser(context, styleSheet); 235 CSSParserImpl parser(context, styleSheet);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range) { 329 bool CSSParserImpl::supportsDeclaration(CSSParserTokenRange& range) {
330 ASSERT(m_parsedProperties.isEmpty()); 330 ASSERT(m_parsedProperties.isEmpty());
331 consumeDeclaration(range, StyleRule::Style); 331 consumeDeclaration(range, StyleRule::Style);
332 bool result = !m_parsedProperties.isEmpty(); 332 bool result = !m_parsedProperties.isEmpty();
333 m_parsedProperties.clear(); 333 m_parsedProperties.clear();
334 return result; 334 return result;
335 } 335 }
336 336
337 void CSSParserImpl::parseDeclarationListForInspector( 337 void CSSParserImpl::parseDeclarationListForInspector(
338 const String& declaration, 338 const String& declaration,
339 const CSSParserContext& context, 339 const CSSParserContext* context,
340 CSSParserObserver& observer) { 340 CSSParserObserver& observer) {
341 CSSParserImpl parser(context); 341 CSSParserImpl parser(context);
342 CSSParserObserverWrapper wrapper(observer); 342 CSSParserObserverWrapper wrapper(observer);
343 parser.m_observerWrapper = &wrapper; 343 parser.m_observerWrapper = &wrapper;
344 CSSTokenizer tokenizer(declaration, wrapper); 344 CSSTokenizer tokenizer(declaration, wrapper);
345 observer.startRuleHeader(StyleRule::Style, 0); 345 observer.startRuleHeader(StyleRule::Style, 0);
346 observer.endRuleHeader(1); 346 observer.endRuleHeader(1);
347 parser.consumeDeclarationList(tokenizer.tokenRange(), StyleRule::Style); 347 parser.consumeDeclarationList(tokenizer.tokenRange(), StyleRule::Style);
348 } 348 }
349 349
350 void CSSParserImpl::parseStyleSheetForInspector(const String& string, 350 void CSSParserImpl::parseStyleSheetForInspector(const String& string,
351 const CSSParserContext& context, 351 const CSSParserContext* context,
352 StyleSheetContents* styleSheet, 352 StyleSheetContents* styleSheet,
353 CSSParserObserver& observer) { 353 CSSParserObserver& observer) {
354 CSSParserImpl parser(context, styleSheet); 354 CSSParserImpl parser(context, styleSheet);
355 CSSParserObserverWrapper wrapper(observer); 355 CSSParserObserverWrapper wrapper(observer);
356 parser.m_observerWrapper = &wrapper; 356 parser.m_observerWrapper = &wrapper;
357 CSSTokenizer tokenizer(string, wrapper); 357 CSSTokenizer tokenizer(string, wrapper);
358 bool firstRuleValid = 358 bool firstRuleValid =
359 parser.consumeRuleList(tokenizer.tokenRange(), TopLevelRuleList, 359 parser.consumeRuleList(tokenizer.tokenRange(), TopLevelRuleList,
360 [&styleSheet](StyleRuleBase* rule) { 360 [&styleSheet](StyleRuleBase* rule) {
361 if (rule->isCharsetRule()) 361 if (rule->isCharsetRule())
362 return; 362 return;
363 styleSheet->parserAppendRule(rule); 363 styleSheet->parserAppendRule(rule);
364 }); 364 });
365 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); 365 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid);
366 } 366 }
367 367
368 StylePropertySet* CSSParserImpl::parseDeclarationListForLazyStyle( 368 StylePropertySet* CSSParserImpl::parseDeclarationListForLazyStyle(
369 CSSParserTokenRange block, 369 CSSParserTokenRange block,
370 const CSSParserContext& context) { 370 const CSSParserContext* context) {
371 CSSParserImpl parser(context); 371 CSSParserImpl parser(context);
372 parser.consumeDeclarationList(std::move(block), StyleRule::Style); 372 parser.consumeDeclarationList(std::move(block), StyleRule::Style);
373 return createStylePropertySet(parser.m_parsedProperties, context.mode()); 373 return createStylePropertySet(parser.m_parsedProperties, context->mode());
374 } 374 }
375 375
376 static CSSParserImpl::AllowedRulesType computeNewAllowedRules( 376 static CSSParserImpl::AllowedRulesType computeNewAllowedRules(
377 CSSParserImpl::AllowedRulesType allowedRules, 377 CSSParserImpl::AllowedRulesType allowedRules,
378 StyleRuleBase* rule) { 378 StyleRuleBase* rule) {
379 if (!rule || allowedRules == CSSParserImpl::KeyframeRules || 379 if (!rule || allowedRules == CSSParserImpl::KeyframeRules ||
380 allowedRules == CSSParserImpl::NoRules) 380 allowedRules == CSSParserImpl::NoRules)
381 return allowedRules; 381 return allowedRules;
382 ASSERT(allowedRules <= CSSParserImpl::RegularRules); 382 ASSERT(allowedRules <= CSSParserImpl::RegularRules);
383 if (rule->isCharsetRule() || rule->isImportRule()) 383 if (rule->isCharsetRule() || rule->isImportRule())
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 AllowedRulesType allowedRules) { 445 AllowedRulesType allowedRules) {
446 ASSERT(range.peek().type() == AtKeywordToken); 446 ASSERT(range.peek().type() == AtKeywordToken);
447 const StringView name = range.consumeIncludingWhitespace().value(); 447 const StringView name = range.consumeIncludingWhitespace().value();
448 const CSSParserToken* preludeStart = &range.peek(); 448 const CSSParserToken* preludeStart = &range.peek();
449 while (!range.atEnd() && range.peek().type() != LeftBraceToken && 449 while (!range.atEnd() && range.peek().type() != LeftBraceToken &&
450 range.peek().type() != SemicolonToken) 450 range.peek().type() != SemicolonToken)
451 range.consumeComponentValue(); 451 range.consumeComponentValue();
452 452
453 CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek()); 453 CSSParserTokenRange prelude = range.makeSubRange(preludeStart, &range.peek());
454 CSSAtRuleID id = cssAtRuleID(name); 454 CSSAtRuleID id = cssAtRuleID(name);
455 if (id != CSSAtRuleInvalid && m_context.useCounter()) 455 if (id != CSSAtRuleInvalid && m_context->isUseCounterRecordingEnabled())
456 countAtRule(m_context.useCounter(), id); 456 countAtRule(m_context->useCounter(), id);
457 457
458 if (range.atEnd() || range.peek().type() == SemicolonToken) { 458 if (range.atEnd() || range.peek().type() == SemicolonToken) {
459 range.consume(); 459 range.consume();
460 if (allowedRules == AllowCharsetRules && id == CSSAtRuleCharset) 460 if (allowedRules == AllowCharsetRules && id == CSSAtRuleCharset)
461 return consumeCharsetRule(prelude); 461 return consumeCharsetRule(prelude);
462 if (allowedRules <= AllowImportRules && id == CSSAtRuleImport) 462 if (allowedRules <= AllowImportRules && id == CSSAtRuleImport)
463 return consumeImportRule(prelude); 463 return consumeImportRule(prelude);
464 if (allowedRules <= AllowNamespaceRules && id == CSSAtRuleNamespace) 464 if (allowedRules <= AllowNamespaceRules && id == CSSAtRuleNamespace)
465 return consumeNamespaceRule(prelude); 465 return consumeNamespaceRule(prelude);
466 if (allowedRules == ApplyRules && id == CSSAtRuleApply) { 466 if (allowedRules == ApplyRules && id == CSSAtRuleApply) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 634
635 return StyleRuleSupports::create(prelude.serialize().stripWhiteSpace(), 635 return StyleRuleSupports::create(prelude.serialize().stripWhiteSpace(),
636 supported, rules); 636 supported, rules);
637 } 637 }
638 638
639 StyleRuleViewport* CSSParserImpl::consumeViewportRule( 639 StyleRuleViewport* CSSParserImpl::consumeViewportRule(
640 CSSParserTokenRange prelude, 640 CSSParserTokenRange prelude,
641 CSSParserTokenRange block) { 641 CSSParserTokenRange block) {
642 // Allow @viewport rules from UA stylesheets even if the feature is disabled. 642 // Allow @viewport rules from UA stylesheets even if the feature is disabled.
643 if (!RuntimeEnabledFeatures::cssViewportEnabled() && 643 if (!RuntimeEnabledFeatures::cssViewportEnabled() &&
644 !isUASheetBehavior(m_context.mode())) 644 !isUASheetBehavior(m_context->mode()))
645 return nullptr; 645 return nullptr;
646 646
647 if (!prelude.atEnd()) 647 if (!prelude.atEnd())
648 return nullptr; // Parser error; @viewport prelude should be empty 648 return nullptr; // Parser error; @viewport prelude should be empty
649 649
650 if (m_observerWrapper) { 650 if (m_observerWrapper) {
651 unsigned endOffset = m_observerWrapper->endOffset(prelude); 651 unsigned endOffset = m_observerWrapper->endOffset(prelude);
652 m_observerWrapper->observer().startRuleHeader( 652 m_observerWrapper->observer().startRuleHeader(
653 StyleRule::Viewport, m_observerWrapper->startOffset(prelude)); 653 StyleRule::Viewport, m_observerWrapper->startOffset(prelude));
654 m_observerWrapper->observer().endRuleHeader(endOffset); 654 m_observerWrapper->observer().endRuleHeader(endOffset);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks 694 CSSParserTokenRange rangeCopy = prelude; // For inspector callbacks
695 const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace(); 695 const CSSParserToken& nameToken = prelude.consumeIncludingWhitespace();
696 if (!prelude.atEnd()) 696 if (!prelude.atEnd())
697 return nullptr; // Parse error; expected single non-whitespace token in 697 return nullptr; // Parse error; expected single non-whitespace token in
698 // @keyframes header 698 // @keyframes header
699 699
700 String name; 700 String name;
701 if (nameToken.type() == IdentToken) { 701 if (nameToken.type() == IdentToken) {
702 name = nameToken.value().toString(); 702 name = nameToken.value().toString();
703 } else if (nameToken.type() == StringToken && webkitPrefixed) { 703 } else if (nameToken.type() == StringToken && webkitPrefixed) {
704 if (m_context.useCounter()) 704 if (m_context->isUseCounterRecordingEnabled())
705 m_context.useCounter()->count(UseCounter::QuotedKeyframesRule); 705 m_context->useCounter()->count(UseCounter::QuotedKeyframesRule);
706 name = nameToken.value().toString(); 706 name = nameToken.value().toString();
707 } else { 707 } else {
708 return nullptr; // Parse error; expected ident token in @keyframes header 708 return nullptr; // Parse error; expected ident token in @keyframes header
709 } 709 }
710 710
711 if (m_observerWrapper) { 711 if (m_observerWrapper) {
712 m_observerWrapper->observer().startRuleHeader( 712 m_observerWrapper->observer().startRuleHeader(
713 StyleRule::Keyframes, m_observerWrapper->startOffset(rangeCopy)); 713 StyleRule::Keyframes, m_observerWrapper->startOffset(rangeCopy));
714 m_observerWrapper->observer().endRuleHeader( 714 m_observerWrapper->observer().endRuleHeader(
715 m_observerWrapper->endOffset(prelude)); 715 m_observerWrapper->endOffset(prelude));
(...skipping 23 matching lines...) Expand all
739 unsigned endOffset = m_observerWrapper->endOffset(prelude); 739 unsigned endOffset = m_observerWrapper->endOffset(prelude);
740 m_observerWrapper->observer().startRuleHeader( 740 m_observerWrapper->observer().startRuleHeader(
741 StyleRule::Page, m_observerWrapper->startOffset(prelude)); 741 StyleRule::Page, m_observerWrapper->startOffset(prelude));
742 m_observerWrapper->observer().endRuleHeader(endOffset); 742 m_observerWrapper->observer().endRuleHeader(endOffset);
743 } 743 }
744 744
745 consumeDeclarationList(block, StyleRule::Style); 745 consumeDeclarationList(block, StyleRule::Style);
746 746
747 return StyleRulePage::create( 747 return StyleRulePage::create(
748 std::move(selectorList), 748 std::move(selectorList),
749 createStylePropertySet(m_parsedProperties, m_context.mode())); 749 createStylePropertySet(m_parsedProperties, m_context->mode()));
750 } 750 }
751 751
752 void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude) { 752 void CSSParserImpl::consumeApplyRule(CSSParserTokenRange prelude) {
753 ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled()); 753 ASSERT(RuntimeEnabledFeatures::cssApplyAtRulesEnabled());
754 754
755 const CSSParserToken& ident = prelude.consumeIncludingWhitespace(); 755 const CSSParserToken& ident = prelude.consumeIncludingWhitespace();
756 if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident)) 756 if (!prelude.atEnd() || !CSSVariableParser::isValidVariableName(ident))
757 return; // Parse error, expected a single custom property name 757 return; // Parse error, expected a single custom property name
758 m_parsedProperties.push_back(CSSProperty( 758 m_parsedProperties.push_back(CSSProperty(
759 CSSPropertyApplyAtRule, 759 CSSPropertyApplyAtRule,
(...skipping 10 matching lines...) Expand all
770 if (m_observerWrapper) { 770 if (m_observerWrapper) {
771 m_observerWrapper->observer().startRuleHeader( 771 m_observerWrapper->observer().startRuleHeader(
772 StyleRule::Keyframe, m_observerWrapper->startOffset(prelude)); 772 StyleRule::Keyframe, m_observerWrapper->startOffset(prelude));
773 m_observerWrapper->observer().endRuleHeader( 773 m_observerWrapper->observer().endRuleHeader(
774 m_observerWrapper->endOffset(prelude)); 774 m_observerWrapper->endOffset(prelude));
775 } 775 }
776 776
777 consumeDeclarationList(block, StyleRule::Keyframe); 777 consumeDeclarationList(block, StyleRule::Keyframe);
778 return StyleRuleKeyframe::create( 778 return StyleRuleKeyframe::create(
779 std::move(keyList), 779 std::move(keyList),
780 createStylePropertySet(m_parsedProperties, m_context.mode())); 780 createStylePropertySet(m_parsedProperties, m_context->mode()));
781 } 781 }
782 782
783 static void observeSelectors(CSSParserObserverWrapper& wrapper, 783 static void observeSelectors(CSSParserObserverWrapper& wrapper,
784 CSSParserTokenRange selectors) { 784 CSSParserTokenRange selectors) {
785 // This is easier than hooking into the CSSSelectorParser 785 // This is easier than hooking into the CSSSelectorParser
786 selectors.consumeWhitespace(); 786 selectors.consumeWhitespace();
787 CSSParserTokenRange originalRange = selectors; 787 CSSParserTokenRange originalRange = selectors;
788 wrapper.observer().startRuleHeader(StyleRule::Style, 788 wrapper.observer().startRuleHeader(StyleRule::Style,
789 wrapper.startOffset(originalRange)); 789 wrapper.startOffset(originalRange));
790 790
(...skipping 25 matching lines...) Expand all
816 } else if (m_lazyState && 816 } else if (m_lazyState &&
817 m_lazyState->shouldLazilyParseProperties(selectorList, block)) { 817 m_lazyState->shouldLazilyParseProperties(selectorList, block)) {
818 DCHECK(m_styleSheet); 818 DCHECK(m_styleSheet);
819 return StyleRule::createLazy(std::move(selectorList), 819 return StyleRule::createLazy(std::move(selectorList),
820 m_lazyState->createLazyParser(block)); 820 m_lazyState->createLazyParser(block));
821 } 821 }
822 consumeDeclarationList(block, StyleRule::Style); 822 consumeDeclarationList(block, StyleRule::Style);
823 823
824 return StyleRule::create( 824 return StyleRule::create(
825 std::move(selectorList), 825 std::move(selectorList),
826 createStylePropertySet(m_parsedProperties, m_context.mode())); 826 createStylePropertySet(m_parsedProperties, m_context->mode()));
827 } 827 }
828 828
829 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, 829 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range,
830 StyleRule::RuleType ruleType) { 830 StyleRule::RuleType ruleType) {
831 ASSERT(m_parsedProperties.isEmpty()); 831 ASSERT(m_parsedProperties.isEmpty());
832 832
833 bool useObserver = m_observerWrapper && (ruleType == StyleRule::Style || 833 bool useObserver = m_observerWrapper && (ruleType == StyleRule::Style ||
834 ruleType == StyleRule::Keyframe); 834 ruleType == StyleRule::Keyframe);
835 if (useObserver) { 835 if (useObserver) {
836 m_observerWrapper->observer().startRuleBody( 836 m_observerWrapper->observer().startRuleBody(
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 else 979 else
980 return nullptr; // Parser error, invalid value in keyframe selector 980 return nullptr; // Parser error, invalid value in keyframe selector
981 if (range.atEnd()) 981 if (range.atEnd())
982 return result; 982 return result;
983 if (range.consume().type() != CommaToken) 983 if (range.consume().type() != CommaToken)
984 return nullptr; // Parser error 984 return nullptr; // Parser error
985 } 985 }
986 } 986 }
987 987
988 } // namespace blink 988 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698