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