Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(666)

Side by Side Diff: third_party/WebKit/Source/core/css/parser/CSSParserImpl.cpp

Issue 2315923002: Lazy Parse CSS (Closed)
Patch Set: esprehn review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/css/parser/CSSParserImpl.h ('k') | third_party/WebKit/Source/core/css/parser/CSSTokenizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698