| 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" |
| 11 #include "core/css/StylePropertySet.h" | 11 #include "core/css/StylePropertySet.h" |
| 12 #include "core/css/StyleRuleImport.h" | 12 #include "core/css/StyleRuleImport.h" |
| 13 #include "core/css/StyleRuleKeyframe.h" | 13 #include "core/css/StyleRuleKeyframe.h" |
| 14 #include "core/css/StyleRuleNamespace.h" | 14 #include "core/css/StyleRuleNamespace.h" |
| 15 #include "core/css/StyleSheetContents.h" | 15 #include "core/css/StyleSheetContents.h" |
| 16 #include "core/css/parser/CSSAtRuleID.h" | 16 #include "core/css/parser/CSSAtRuleID.h" |
| 17 #include "core/css/parser/CSSLazyParsingState.h" |
| 18 #include "core/css/parser/CSSLazyPropertyParserImpl.h" |
| 17 #include "core/css/parser/CSSParserObserver.h" | 19 #include "core/css/parser/CSSParserObserver.h" |
| 18 #include "core/css/parser/CSSParserObserverWrapper.h" | 20 #include "core/css/parser/CSSParserObserverWrapper.h" |
| 19 #include "core/css/parser/CSSParserSelector.h" | 21 #include "core/css/parser/CSSParserSelector.h" |
| 20 #include "core/css/parser/CSSPropertyParser.h" | 22 #include "core/css/parser/CSSPropertyParser.h" |
| 21 #include "core/css/parser/CSSSelectorParser.h" | 23 #include "core/css/parser/CSSSelectorParser.h" |
| 22 #include "core/css/parser/CSSSupportsParser.h" | 24 #include "core/css/parser/CSSSupportsParser.h" |
| 23 #include "core/css/parser/CSSTokenizer.h" | 25 #include "core/css/parser/CSSTokenizer.h" |
| 24 #include "core/css/parser/CSSVariableParser.h" | 26 #include "core/css/parser/CSSVariableParser.h" |
| 25 #include "core/css/parser/MediaQueryParser.h" | 27 #include "core/css/parser/MediaQueryParser.h" |
| 26 #include "core/dom/Document.h" | 28 #include "core/dom/Document.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 if (!rule) | 187 if (!rule) |
| 186 return nullptr; // Parse error, failed to consume rule | 188 return nullptr; // Parse error, failed to consume rule |
| 187 range.consumeWhitespace(); | 189 range.consumeWhitespace(); |
| 188 if (!rule || !range.atEnd()) | 190 if (!rule || !range.atEnd()) |
| 189 return nullptr; // Parse error, trailing garbage | 191 return nullptr; // Parse error, trailing garbage |
| 190 return rule; | 192 return rule; |
| 191 } | 193 } |
| 192 | 194 |
| 193 void CSSParserImpl::parseStyleSheet(const String& string, | 195 void CSSParserImpl::parseStyleSheet(const String& string, |
| 194 const CSSParserContext& context, | 196 const CSSParserContext& context, |
| 195 StyleSheetContents* styleSheet) { | 197 StyleSheetContents* styleSheet, |
| 198 bool deferPropertyParsing) { |
| 196 TRACE_EVENT_BEGIN2("blink,blink_style", "CSSParserImpl::parseStyleSheet", | 199 TRACE_EVENT_BEGIN2("blink,blink_style", "CSSParserImpl::parseStyleSheet", |
| 197 "baseUrl", context.baseURL().getString().utf8(), "mode", | 200 "baseUrl", context.baseURL().getString().utf8(), "mode", |
| 198 context.mode()); | 201 context.mode()); |
| 199 | 202 |
| 200 TRACE_EVENT_BEGIN0("blink,blink_style", | 203 TRACE_EVENT_BEGIN0("blink,blink_style", |
| 201 "CSSParserImpl::parseStyleSheet.tokenize"); | 204 "CSSParserImpl::parseStyleSheet.tokenize"); |
| 202 CSSTokenizer::Scope scope(string); | 205 CSSTokenizer::Scope scope(string); |
| 203 TRACE_EVENT_END0("blink,blink_style", | 206 TRACE_EVENT_END0("blink,blink_style", |
| 204 "CSSParserImpl::parseStyleSheet.tokenize"); | 207 "CSSParserImpl::parseStyleSheet.tokenize"); |
| 205 | 208 |
| 206 TRACE_EVENT_BEGIN0("blink,blink_style", | 209 TRACE_EVENT_BEGIN0("blink,blink_style", |
| 207 "CSSParserImpl::parseStyleSheet.parse"); | 210 "CSSParserImpl::parseStyleSheet.parse"); |
| 208 CSSParserImpl parser(context, styleSheet); | 211 CSSParserImpl parser(context, styleSheet); |
| 212 if (deferPropertyParsing) { |
| 213 parser.m_lazyState = |
| 214 new CSSLazyParsingState(context, scope.takeEscapedStrings(), string); |
| 215 } |
| 209 bool firstRuleValid = parser.consumeRuleList( | 216 bool firstRuleValid = parser.consumeRuleList( |
| 210 scope.tokenRange(), TopLevelRuleList, [&styleSheet](StyleRuleBase* rule) { | 217 scope.tokenRange(), TopLevelRuleList, [&styleSheet](StyleRuleBase* rule) { |
| 211 if (rule->isCharsetRule()) | 218 if (rule->isCharsetRule()) |
| 212 return; | 219 return; |
| 213 styleSheet->parserAppendRule(rule); | 220 styleSheet->parserAppendRule(rule); |
| 214 }); | 221 }); |
| 215 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); | 222 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); |
| 216 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse"); | 223 TRACE_EVENT_END0("blink,blink_style", "CSSParserImpl::parseStyleSheet.parse"); |
| 217 | 224 |
| 218 TRACE_EVENT_END2("blink,blink_style", "CSSParserImpl::parseStyleSheet", | 225 TRACE_EVENT_END2("blink,blink_style", "CSSParserImpl::parseStyleSheet", |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 CSSTokenizer::Scope scope(string, wrapper); | 331 CSSTokenizer::Scope scope(string, wrapper); |
| 325 bool firstRuleValid = parser.consumeRuleList( | 332 bool firstRuleValid = parser.consumeRuleList( |
| 326 scope.tokenRange(), TopLevelRuleList, [&styleSheet](StyleRuleBase* rule) { | 333 scope.tokenRange(), TopLevelRuleList, [&styleSheet](StyleRuleBase* rule) { |
| 327 if (rule->isCharsetRule()) | 334 if (rule->isCharsetRule()) |
| 328 return; | 335 return; |
| 329 styleSheet->parserAppendRule(rule); | 336 styleSheet->parserAppendRule(rule); |
| 330 }); | 337 }); |
| 331 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); | 338 styleSheet->setHasSyntacticallyValidCSSHeader(firstRuleValid); |
| 332 } | 339 } |
| 333 | 340 |
| 341 StylePropertySet* CSSParserImpl::parseDeclarationListForLazyStyle( |
| 342 CSSParserTokenRange block, |
| 343 const CSSParserContext& context) { |
| 344 CSSParserImpl parser(context); |
| 345 parser.consumeDeclarationList(std::move(block), StyleRule::Style); |
| 346 return createStylePropertySet(parser.m_parsedProperties, context.mode()); |
| 347 } |
| 348 |
| 334 static CSSParserImpl::AllowedRulesType computeNewAllowedRules( | 349 static CSSParserImpl::AllowedRulesType computeNewAllowedRules( |
| 335 CSSParserImpl::AllowedRulesType allowedRules, | 350 CSSParserImpl::AllowedRulesType allowedRules, |
| 336 StyleRuleBase* rule) { | 351 StyleRuleBase* rule) { |
| 337 if (!rule || allowedRules == CSSParserImpl::KeyframeRules || | 352 if (!rule || allowedRules == CSSParserImpl::KeyframeRules || |
| 338 allowedRules == CSSParserImpl::NoRules) | 353 allowedRules == CSSParserImpl::NoRules) |
| 339 return allowedRules; | 354 return allowedRules; |
| 340 ASSERT(allowedRules <= CSSParserImpl::RegularRules); | 355 ASSERT(allowedRules <= CSSParserImpl::RegularRules); |
| 341 if (rule->isCharsetRule() || rule->isImportRule()) | 356 if (rule->isCharsetRule() || rule->isImportRule()) |
| 342 return CSSParserImpl::AllowImportRules; | 357 return CSSParserImpl::AllowImportRules; |
| 343 if (rule->isNamespaceRule()) | 358 if (rule->isNamespaceRule()) |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 wrapper.observer().endRuleHeader(wrapper.endOffset(originalRange)); | 776 wrapper.observer().endRuleHeader(wrapper.endOffset(originalRange)); |
| 762 } | 777 } |
| 763 | 778 |
| 764 StyleRule* CSSParserImpl::consumeStyleRule(CSSParserTokenRange prelude, | 779 StyleRule* CSSParserImpl::consumeStyleRule(CSSParserTokenRange prelude, |
| 765 CSSParserTokenRange block) { | 780 CSSParserTokenRange block) { |
| 766 CSSSelectorList selectorList = | 781 CSSSelectorList selectorList = |
| 767 CSSSelectorParser::parseSelector(prelude, m_context, m_styleSheet); | 782 CSSSelectorParser::parseSelector(prelude, m_context, m_styleSheet); |
| 768 if (!selectorList.isValid()) | 783 if (!selectorList.isValid()) |
| 769 return nullptr; // Parse error, invalid selector list | 784 return nullptr; // Parse error, invalid selector list |
| 770 | 785 |
| 771 if (m_observerWrapper) | 786 // TODO(csharrison): How should we lazily parse css that needs the observer? |
| 787 if (m_observerWrapper) { |
| 772 observeSelectors(*m_observerWrapper, prelude); | 788 observeSelectors(*m_observerWrapper, prelude); |
| 773 | 789 } else if (m_lazyState && |
| 790 m_lazyState->shouldLazilyParseProperties(selectorList)) { |
| 791 DCHECK(m_styleSheet); |
| 792 return StyleRule::createLazy( |
| 793 std::move(selectorList), |
| 794 new CSSLazyPropertyParserImpl(block, m_lazyState)); |
| 795 } |
| 774 consumeDeclarationList(block, StyleRule::Style); | 796 consumeDeclarationList(block, StyleRule::Style); |
| 775 | 797 |
| 776 return StyleRule::create( | 798 return StyleRule::create( |
| 777 std::move(selectorList), | 799 std::move(selectorList), |
| 778 createStylePropertySet(m_parsedProperties, m_context.mode())); | 800 createStylePropertySet(m_parsedProperties, m_context.mode())); |
| 779 } | 801 } |
| 780 | 802 |
| 781 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, | 803 void CSSParserImpl::consumeDeclarationList(CSSParserTokenRange range, |
| 782 StyleRule::RuleType ruleType) { | 804 StyleRule::RuleType ruleType) { |
| 783 ASSERT(m_parsedProperties.isEmpty()); | 805 ASSERT(m_parsedProperties.isEmpty()); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 else | 957 else |
| 936 return nullptr; // Parser error, invalid value in keyframe selector | 958 return nullptr; // Parser error, invalid value in keyframe selector |
| 937 if (range.atEnd()) | 959 if (range.atEnd()) |
| 938 return result; | 960 return result; |
| 939 if (range.consume().type() != CommaToken) | 961 if (range.consume().type() != CommaToken) |
| 940 return nullptr; // Parser error | 962 return nullptr; // Parser error |
| 941 } | 963 } |
| 942 } | 964 } |
| 943 | 965 |
| 944 } // namespace blink | 966 } // namespace blink |
| OLD | NEW |