Index: third_party/WebKit/Source/core/frame/UseCounter.cpp |
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.cpp b/third_party/WebKit/Source/core/frame/UseCounter.cpp |
index 0ce8ee4baed1ab2fae4fe0e8b4e3e6f3ffd72314..8220443cb7ea06f398e4ecb8b2cd3eb57f9b323e 100644 |
--- a/third_party/WebKit/Source/core/frame/UseCounter.cpp |
+++ b/third_party/WebKit/Source/core/frame/UseCounter.cpp |
@@ -42,10 +42,8 @@ namespace blink { |
static int totalPagesMeasuredCSSSampleId() { return 1; } |
-int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id) |
+int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyID cssPropertyID) |
{ |
- CSSPropertyID cssPropertyID = static_cast<CSSPropertyID>(id); |
- |
switch (cssPropertyID) { |
// Begin at 2, because 1 is reserved for totalPagesMeasuredCSSSampleId. |
case CSSPropertyColor: return 2; |
@@ -605,51 +603,61 @@ void UseCounter::recordMeasurement(Feature feature) |
if (m_muteCount) |
return; |
- if (!m_countBits.hasRecordedMeasurement(feature)) { |
+ DCHECK(feature != PageDestruction); // PageDestruction is reserved as a scaling factor. |
+ DCHECK(feature < NumberOfFeatures); |
+ |
+ if (!m_featureBits.quickGet(feature)) { |
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), "FeatureFirstUsed", "feature", feature); |
+ m_featureBits.quickSet(feature); |
} |
- m_countBits.recordMeasurement(feature); |
+} |
+ |
+bool UseCounter::hasRecordedMeasurement(Feature feature) const |
+{ |
+ if (m_muteCount) |
+ return false; |
+ |
+ DCHECK(feature != PageDestruction); // PageDestruction is reserved as a scaling factor. |
+ DCHECK(feature < NumberOfFeatures); |
+ |
+ return m_featureBits.quickGet(feature); |
} |
UseCounter::UseCounter() |
: m_muteCount(0) |
+ , m_featureBits(NumberOfFeatures) |
+ , m_CSSFeatureBits(lastUnresolvedCSSProperty + 1) |
{ |
- m_CSSFeatureBits.ensureSize(lastUnresolvedCSSProperty + 1); |
- m_CSSFeatureBits.clearAll(); |
} |
UseCounter::~UseCounter() |
{ |
// We always log PageDestruction so that we have a scale for the rest of the features. |
+ // TODO(rbyers): This is flawed due to renderer fast shutdown - crbug.com/597963 |
featureObserverHistogram().count(PageDestruction); |
updateMeasurements(); |
} |
-void UseCounter::CountBits::updateMeasurements() |
+void UseCounter::updateMeasurements() |
{ |
EnumerationHistogram& featureHistogram = featureObserverHistogram(); |
- for (unsigned i = 0; i < NumberOfFeatures; ++i) { |
- if (m_bits.quickGet(i)) |
+ featureHistogram.count(PageVisits); |
+ for (size_t i = 0; i < NumberOfFeatures; ++i) { |
+ if (m_featureBits.quickGet(i)) |
featureHistogram.count(i); |
} |
// Clearing count bits is timing sensitive. |
- m_bits.clearAll(); |
-} |
- |
-void UseCounter::updateMeasurements() |
-{ |
- featureObserverHistogram().count(PageVisits); |
- m_countBits.updateMeasurements(); |
+ m_featureBits.clearAll(); |
// FIXME: Sometimes this function is called more than once per page. The following |
// bool guards against incrementing the page count when there are no CSS |
// bits set. https://crbug.com/236262. |
DEFINE_STATIC_LOCAL(EnumerationHistogram, cssPropertiesHistogram, ("WebCore.FeatureObserver.CSSProperties", maximumCSSSampleId())); |
bool needsPagesMeasuredUpdate = false; |
- for (int i = firstCSSProperty; i <= lastUnresolvedCSSProperty; ++i) { |
+ for (size_t i = firstCSSProperty; i <= lastUnresolvedCSSProperty; ++i) { |
if (m_CSSFeatureBits.quickGet(i)) { |
- int cssSampleId = mapCSSPropertyIdToCSSSampleIdForHistogram(i); |
+ int cssSampleId = mapCSSPropertyIdToCSSSampleIdForHistogram(static_cast<CSSPropertyID>(i)); |
cssPropertiesHistogram.count(cssSampleId); |
needsPagesMeasuredUpdate = true; |
} |
@@ -663,6 +671,9 @@ void UseCounter::updateMeasurements() |
void UseCounter::didCommitLoad() |
{ |
+ // TODO(rbyers): This gets invoked more than expected. crbug.com/236262 |
+ // Eg. every SVGImage has it's own Page instance, they should probably all be delegating |
+ // their UseCounter to the containing Page. |
updateMeasurements(); |
} |
@@ -698,7 +709,6 @@ bool UseCounter::isCounted(CSSPropertyID unresolvedProperty) |
return m_CSSFeatureBits.quickGet(unresolvedProperty); |
} |
- |
bool UseCounter::isCounted(Document& document, const String& string) |
{ |
Frame* frame = document.frame(); |
@@ -756,21 +766,21 @@ void UseCounter::countCrossOriginIframe(const Document& document, Feature featur |
void UseCounter::count(CSSParserMode cssParserMode, CSSPropertyID feature) |
{ |
- ASSERT(feature >= firstCSSProperty); |
- ASSERT(feature <= lastUnresolvedCSSProperty); |
+ DCHECK(feature >= firstCSSProperty); |
+ DCHECK(feature <= lastUnresolvedCSSProperty); |
if (!isUseCounterEnabledForMode(cssParserMode) || m_muteCount) |
return; |
if (!m_CSSFeatureBits.quickGet(feature)) { |
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), "CSSFeatureFirstUsed", "feature", feature); |
+ m_CSSFeatureBits.quickSet(feature); |
} |
- m_CSSFeatureBits.quickSet(feature); |
} |
void UseCounter::count(Feature feature) |
{ |
- ASSERT(Deprecation::deprecationMessage(feature).isEmpty()); |
+ DCHECK(Deprecation::deprecationMessage(feature).isEmpty()); |
recordMeasurement(feature); |
} |