Index: third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
diff --git a/third_party/WebKit/Source/core/frame/UseCounterTest.cpp b/third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
index f8c491e322df036683e25c11a0283017b024ee92..2afa3c1669da88c53f3abbedeb73e78995c50dc2 100644 |
--- a/third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
+++ b/third_party/WebKit/Source/core/frame/UseCounterTest.cpp |
@@ -12,39 +12,52 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
namespace { |
-const char* const kFeaturesHistogramName = "Blink.UseCounter.Features"; |
-const char* const kCSSHistogramName = "Blink.UseCounter.CSSProperties"; |
-const char* const kAnimatedCSSHistogramName = |
+const char kFeaturesHistogramName[] = "Blink.UseCounter.Features"; |
+const char kCSSHistogramName[] = "Blink.UseCounter.CSSProperties"; |
+const char kAnimatedCSSHistogramName[] = |
"Blink.UseCounter.AnimatedCSSProperties"; |
+const char kExtensionFeaturesHistogramName[] = |
+ "Blink.UseCounter.Extensions.Features"; |
-const char* const kSVGFeaturesHistogramName = |
- "Blink.UseCounter.SVGImage.Features"; |
-const char* const kSVGCSSHistogramName = |
- "Blink.UseCounter.SVGImage.CSSProperties"; |
-const char* const kSVGAnimatedCSSHistogramName = |
+const char kSVGFeaturesHistogramName[] = "Blink.UseCounter.SVGImage.Features"; |
+const char kSVGCSSHistogramName[] = "Blink.UseCounter.SVGImage.CSSProperties"; |
+const char kSVGAnimatedCSSHistogramName[] = |
"Blink.UseCounter.SVGImage.AnimatedCSSProperties"; |
-const char* const kLegacyFeaturesHistogramName = "WebCore.FeatureObserver"; |
-const char* const kLegacyCSSHistogramName = |
- "WebCore.FeatureObserver.CSSProperties"; |
+const char kLegacyFeaturesHistogramName[] = "WebCore.FeatureObserver"; |
+const char kLegacyCSSHistogramName[] = "WebCore.FeatureObserver.CSSProperties"; |
+ |
+// In practice, SVGs always appear to be loaded with an about:blank URL |
+const char kSvgUrl[] = "about:blank"; |
+const char* const kInternalUrl = kSvgUrl; |
+const char kHttpsUrl[] = "https://dummysite.com/"; |
+const char kExtensionUrl[] = "chrome-extension://dummysite/"; |
+ |
+int GetPageVisitsBucketforHistogram(const std::string& histogram_name) { |
+ if (histogram_name.find("CSS") == std::string::npos) |
+ return blink::UseCounter::kPageVisits; |
+ // For CSS histograms, the page visits bucket should be 1. |
+ return 1; |
} |
+} // namespace |
+ |
namespace blink { |
template <typename T> |
void HistogramBasicTest(const std::string& histogram, |
const std::string& legacy_histogram, |
- const std::vector<std::string>& unaffected_histograms, |
T item, |
T second_item, |
std::function<bool(T)> counted, |
std::function<void(T)> count, |
std::function<int(T)> histogram_map, |
std::function<void(KURL)> did_commit_load, |
- const std::string& url, |
- int page_visit_bucket) { |
+ const std::string& url) { |
HistogramTester histogram_tester; |
+ int page_visit_bucket = GetPageVisitsBucketforHistogram(histogram); |
+ |
// Test recording a single (arbitrary) counter |
EXPECT_FALSE(counted(item)); |
count(item); |
@@ -109,18 +122,40 @@ void HistogramBasicTest(const std::string& histogram, |
histogram_tester.ExpectTotalCount(legacy_histogram, 5); |
} |
- for (size_t i = 0; i < unaffected_histograms.size(); ++i) { |
- histogram_tester.ExpectTotalCount(unaffected_histograms[i], 0); |
+ // For all histograms, no other histograms besides |histogram| should |
+ // be affected. Legacy histograms are not included in the list because they |
+ // soon will be removed. |
+ for (const std::string& unaffected_histogram : |
+ {kAnimatedCSSHistogramName, kCSSHistogramName, |
+ kExtensionFeaturesHistogramName, kFeaturesHistogramName, |
+ kSVGAnimatedCSSHistogramName, kSVGCSSHistogramName, |
+ kSVGFeaturesHistogramName}) { |
+ if (unaffected_histogram == histogram) |
+ continue; |
+ // CSS histograms are never created in didCommitLoad when the context is |
+ // extension. |
+ if (histogram == kExtensionFeaturesHistogramName && |
+ unaffected_histogram.find("CSS") != std::string::npos) |
+ continue; |
+ |
+ // The expected total count for "Features" of unaffected histograms should |
+ // be either: |
+ // a. pageVisits, for "CSSFeatures"; or |
+ // b. 0 (pageVisits is 0), for others, including "SVGImage.CSSFeatures" |
+ // since no SVG images are loaded at all. |
+ histogram_tester.ExpectTotalCount( |
+ unaffected_histogram, |
+ 0 + histogram_tester.GetBucketCount( |
+ unaffected_histogram, |
+ GetPageVisitsBucketforHistogram(unaffected_histogram))); |
} |
} |
TEST(UseCounterTest, RecordingFeatures) { |
UseCounter use_counter; |
HistogramBasicTest<UseCounter::Feature>( |
- kFeaturesHistogramName, kLegacyFeaturesHistogramName, |
- {kSVGFeaturesHistogramName, kSVGCSSHistogramName, |
- kSVGAnimatedCSSHistogramName}, |
- UseCounter::kFetch, UseCounter::kFetchBodyStream, |
+ kFeaturesHistogramName, kLegacyFeaturesHistogramName, UseCounter::kFetch, |
+ UseCounter::kFetchBodyStream, |
[&](UseCounter::Feature feature) -> bool { |
return use_counter.HasRecordedMeasurement(feature); |
}, |
@@ -128,17 +163,14 @@ TEST(UseCounterTest, RecordingFeatures) { |
use_counter.RecordMeasurement(feature); |
}, |
[](UseCounter::Feature feature) -> int { return feature; }, |
- [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, |
- "https://dummysite.com/", UseCounter::kPageVisits); |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kHttpsUrl); |
} |
TEST(UseCounterTest, RecordingCSSProperties) { |
UseCounter use_counter; |
HistogramBasicTest<CSSPropertyID>( |
- kCSSHistogramName, kLegacyCSSHistogramName, |
- {kSVGFeaturesHistogramName, kSVGCSSHistogramName, |
- kSVGAnimatedCSSHistogramName}, |
- CSSPropertyFont, CSSPropertyZoom, |
+ kCSSHistogramName, kLegacyCSSHistogramName, CSSPropertyFont, |
+ CSSPropertyZoom, |
[&](CSSPropertyID property) -> bool { |
return use_counter.IsCounted(property); |
}, |
@@ -148,16 +180,13 @@ TEST(UseCounterTest, RecordingCSSProperties) { |
[](CSSPropertyID property) -> int { |
return UseCounter::MapCSSPropertyIdToCSSSampleIdForHistogram(property); |
}, |
- [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, |
- "https://dummysite.com/", 1 /* page visit bucket */); |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kHttpsUrl); |
} |
TEST(UseCounterTest, RecordingAnimatedCSSProperties) { |
UseCounter use_counter; |
HistogramBasicTest<CSSPropertyID>( |
- kAnimatedCSSHistogramName, "", |
- {kSVGCSSHistogramName, kSVGAnimatedCSSHistogramName}, CSSPropertyOpacity, |
- CSSPropertyVariable, |
+ kAnimatedCSSHistogramName, "", CSSPropertyOpacity, CSSPropertyVariable, |
[&](CSSPropertyID property) -> bool { |
return use_counter.IsCountedAnimatedCSS(property); |
}, |
@@ -165,15 +194,28 @@ TEST(UseCounterTest, RecordingAnimatedCSSProperties) { |
[](CSSPropertyID property) -> int { |
return UseCounter::MapCSSPropertyIdToCSSSampleIdForHistogram(property); |
}, |
- [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, |
- "https://dummysite.com/", 1 /* page visit bucket */); |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kHttpsUrl); |
+} |
+ |
+TEST(UseCounterTest, RecordingExtensions) { |
+ UseCounter use_counter(UseCounter::kExtensionContext); |
+ HistogramBasicTest<UseCounter::Feature>( |
+ kExtensionFeaturesHistogramName, kLegacyFeaturesHistogramName, |
+ UseCounter::kFetch, UseCounter::kFetchBodyStream, |
+ [&](UseCounter::Feature feature) -> bool { |
+ return use_counter.HasRecordedMeasurement(feature); |
+ }, |
+ [&](UseCounter::Feature feature) { |
+ use_counter.RecordMeasurement(feature); |
+ }, |
+ [](UseCounter::Feature feature) -> int { return feature; }, |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kExtensionUrl); |
} |
TEST(UseCounterTest, SVGImageContextFeatures) { |
UseCounter use_counter(UseCounter::kSVGImageContext); |
HistogramBasicTest<UseCounter::Feature>( |
kSVGFeaturesHistogramName, kLegacyFeaturesHistogramName, |
- {kFeaturesHistogramName, kCSSHistogramName, kAnimatedCSSHistogramName}, |
UseCounter::kSVGSMILAdditiveAnimation, |
UseCounter::kSVGSMILAnimationElementTiming, |
[&](UseCounter::Feature feature) -> bool { |
@@ -183,17 +225,14 @@ TEST(UseCounterTest, SVGImageContextFeatures) { |
use_counter.RecordMeasurement(feature); |
}, |
[](UseCounter::Feature feature) -> int { return feature; }, |
- [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, "about:blank", |
- // In practice SVGs always appear to be loaded with an about:blank URL |
- UseCounter::kPageVisits); |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kSvgUrl); |
} |
TEST(UseCounterTest, SVGImageContextCSSProperties) { |
UseCounter use_counter(UseCounter::kSVGImageContext); |
HistogramBasicTest<CSSPropertyID>( |
- kSVGCSSHistogramName, kLegacyCSSHistogramName, |
- {kFeaturesHistogramName, kCSSHistogramName, kAnimatedCSSHistogramName}, |
- CSSPropertyFont, CSSPropertyZoom, |
+ kSVGCSSHistogramName, kLegacyCSSHistogramName, CSSPropertyFont, |
+ CSSPropertyZoom, |
[&](CSSPropertyID property) -> bool { |
return use_counter.IsCounted(property); |
}, |
@@ -203,17 +242,13 @@ TEST(UseCounterTest, SVGImageContextCSSProperties) { |
[](CSSPropertyID property) -> int { |
return UseCounter::MapCSSPropertyIdToCSSSampleIdForHistogram(property); |
}, |
- [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, "about:blank", |
- // In practice SVGs always appear to be loaded with an about:blank URL |
- 1 /* page visit bucket */); |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kSvgUrl); |
} |
TEST(UseCounterTest, SVGImageContextAnimatedCSSProperties) { |
UseCounter use_counter(UseCounter::kSVGImageContext); |
HistogramBasicTest<CSSPropertyID>( |
- kSVGAnimatedCSSHistogramName, "", |
- {kCSSHistogramName, kAnimatedCSSHistogramName}, CSSPropertyOpacity, |
- CSSPropertyVariable, |
+ kSVGAnimatedCSSHistogramName, "", CSSPropertyOpacity, CSSPropertyVariable, |
[&](CSSPropertyID property) -> bool { |
return use_counter.IsCountedAnimatedCSS(property); |
}, |
@@ -221,9 +256,7 @@ TEST(UseCounterTest, SVGImageContextAnimatedCSSProperties) { |
[](CSSPropertyID property) -> int { |
return UseCounter::MapCSSPropertyIdToCSSSampleIdForHistogram(property); |
}, |
- [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, "about:blank", |
- // In practice SVGs always appear to be loaded with an about:blank URL |
- 1 /* page visit bucket */); |
+ [&](KURL kurl) { use_counter.DidCommitLoad(kurl); }, kSvgUrl); |
} |
TEST(UseCounterTest, InspectorDisablesMeasurement) { |
@@ -304,7 +337,7 @@ TEST(UseCounterTest, MutedDocuments) { |
CSSPropertyFontWeight, 1); |
// Loading an internal page doesn't bump PageVisits and metrics not reported. |
- use_counter.DidCommitLoad(URLTestHelpers::ToKURL("about:blank")); |
+ use_counter.DidCommitLoad(URLTestHelpers::ToKURL(kInternalUrl)); |
EXPECT_FALSE(use_counter.HasRecordedMeasurement(UseCounter::kFetch)); |
EXPECT_FALSE(use_counter.IsCounted(CSSPropertyFontWeight)); |
use_counter.RecordMeasurement(UseCounter::kFetch); |
@@ -332,16 +365,14 @@ TEST(UseCounterTest, MutedDocuments) { |
CSSPropertyFontWeight, 2); |
// HTTPs URLs are the same. |
- use_counter.DidCommitLoad( |
- URLTestHelpers::ToKURL("https://baz.com:1234/blob.html")); |
+ use_counter.DidCommitLoad(URLTestHelpers::ToKURL(kHttpsUrl)); |
use_counter.RecordMeasurement(UseCounter::kFetch); |
use_counter.Count(kHTMLStandardMode, CSSPropertyFontWeight); |
ExpectHistograms(histogram_tester, 2, UseCounter::kFetch, 3, |
CSSPropertyFontWeight, 3); |
// Extensions aren't counted. |
- use_counter.DidCommitLoad( |
- URLTestHelpers::ToKURL("chrome-extension://1238ba908adf/")); |
+ use_counter.DidCommitLoad(URLTestHelpers::ToKURL(kExtensionUrl)); |
use_counter.RecordMeasurement(UseCounter::kFetch); |
use_counter.Count(kHTMLStandardMode, CSSPropertyFontWeight); |
ExpectHistograms(histogram_tester, 2, UseCounter::kFetch, 3, |