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

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

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

Powered by Google App Engine
This is Rietveld 408576698