| 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 |