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