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