Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp | 
| diff --git a/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp b/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp | 
| index 8370f0a0dbd447696b93fc7dd2c55b6cb6698e6b..18be2b1c05d573b8f8708c425fed6ece6ab057d8 100644 | 
| --- a/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp | 
| +++ b/third_party/WebKit/Source/core/css/parser/CSSLazyParsingState.cpp | 
| @@ -3,8 +3,10 @@ | 
| // found in the LICENSE file. | 
| #include "core/css/parser/CSSLazyParsingState.h" | 
| +#include "core/css/parser/CSSLazyPropertyParserImpl.h" | 
| #include "core/css/parser/CSSParserTokenRange.h" | 
| #include "core/frame/UseCounter.h" | 
| +#include "platform/Histogram.h" | 
| namespace blink { | 
| @@ -15,7 +17,19 @@ CSSLazyParsingState::CSSLazyParsingState(const CSSParserContext& context, | 
| : m_context(context), | 
| m_escapedStrings(std::move(escapedStrings)), | 
| m_sheetText(sheetText), | 
| - m_owningContents(contents) {} | 
| + m_owningContents(contents), | 
| + m_parsedStyleRules(0), | 
| + m_totalStyleRules(0), | 
| + m_styleRulesNeededForNextMilestone(0), | 
| + m_usage(UsageGe0) { | 
| + recordUsageMetrics(); | 
| +} | 
| + | 
| +CSSLazyPropertyParserImpl* CSSLazyParsingState::createLazyParser( | 
| + const CSSParserTokenRange& block) { | 
| + ++m_totalStyleRules; | 
| + return new CSSLazyPropertyParserImpl(std::move(block), this); | 
| +} | 
| const CSSParserContext& CSSLazyParsingState::context() { | 
| DCHECK(m_owningContents); | 
| @@ -25,9 +39,18 @@ const CSSParserContext& CSSLazyParsingState::context() { | 
| return m_context; | 
| } | 
| +void CSSLazyParsingState::countRuleParsed() { | 
| + ++m_parsedStyleRules; | 
| + while (m_parsedStyleRules > m_styleRulesNeededForNextMilestone) { | 
| + DCHECK_NE(UsageAll, m_usage); | 
| + ++m_usage; | 
| + recordUsageMetrics(); | 
| + } | 
| +} | 
| + | 
| bool CSSLazyParsingState::shouldLazilyParseProperties( | 
| const CSSSelectorList& selectors, | 
| - const CSSParserTokenRange& block) { | 
| + const CSSParserTokenRange& block) const { | 
| // Simple heuristic for an empty block. Note that |block| here does not | 
| // include {} brackets. We avoid lazy parsing empty blocks so we can avoid | 
| // considering them when possible for matching. Lazy blocks must always be | 
| @@ -53,4 +76,34 @@ bool CSSLazyParsingState::shouldLazilyParseProperties( | 
| return true; | 
| } | 
| +void CSSLazyParsingState::recordUsageMetrics() { | 
| + DEFINE_STATIC_LOCAL(EnumerationHistogram, usageHistogram, | 
| + ("Style.LazyUsage.Percent", UsageAll)); | 
| 
 
Ilya Sherman
2016/12/01 00:48:21
This should be UsageAll + 1, i.e. enumerated histo
 
Charlie Harrison
2016/12/01 02:43:51
Oops you're right. I added another LastValue enum
 
 | 
| + switch (m_usage) { | 
| + case UsageGe0: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules * .1; | 
| + break; | 
| + case UsageGt10: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules * .25; | 
| + break; | 
| + case UsageGt25: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules * .5; | 
| + break; | 
| + case UsageGt50: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules * .75; | 
| + break; | 
| + case UsageGt75: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules * .9; | 
| + break; | 
| + case UsageGt90: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules - 1; | 
| + break; | 
| + case UsageAll: | 
| + m_styleRulesNeededForNextMilestone = m_totalStyleRules; | 
| + break; | 
| + } | 
| + | 
| + usageHistogram.count(m_usage); | 
| +} | 
| + | 
| } // namespace blink |