Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/frame/Deprecation.h" | 5 #include "core/frame/Deprecation.h" |
| 6 #include "core/frame/FrameHost.h" | 6 #include "core/frame/FrameHost.h" |
| 7 #include "core/frame/UseCounter.h" | 7 #include "core/frame/UseCounter.h" |
| 8 #include "core/testing/DummyPageHolder.h" | 8 #include "core/testing/DummyPageHolder.h" |
| 9 #include "platform/testing/HistogramTester.h" | 9 #include "platform/testing/HistogramTester.h" |
| 10 #include "platform/testing/URLTestHelpers.h" | 10 #include "platform/testing/URLTestHelpers.h" |
| 11 #include "platform/weborigin/KURL.h" | 11 #include "platform/weborigin/KURL.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 // Note that the new histogram names will change once the semantics stabilize; | |
|
alancutter (OOO until 2018)
2017/02/20 23:49:38
I don't know the context around this comment, why
| |
| 16 const char* const kFeaturesHistogramName = "Blink.UseCounter.Features"; | 15 const char* const kFeaturesHistogramName = "Blink.UseCounter.Features"; |
| 17 const char* const kCSSHistogramName = "Blink.UseCounter.CSSProperties"; | 16 const char* const kCSSHistogramName = "Blink.UseCounter.CSSProperties"; |
| 17 const char* const kAnimatedCSSHistogramName = | |
| 18 "Blink.UseCounter.AnimatedCSSProperties"; | |
| 19 | |
| 18 const char* const kSVGFeaturesHistogramName = | 20 const char* const kSVGFeaturesHistogramName = |
| 19 "Blink.UseCounter.SVGImage.Features"; | 21 "Blink.UseCounter.SVGImage.Features"; |
| 20 const char* const kSVGCSSHistogramName = | 22 const char* const kSVGCSSHistogramName = |
| 21 "Blink.UseCounter.SVGImage.CSSProperties"; | 23 "Blink.UseCounter.SVGImage.CSSProperties"; |
| 24 const char* const kSVGAnimatedCSSHistogramName = | |
| 25 "Blink.UseCounter.SVGImage.AnimatedCSSProperties"; | |
| 26 | |
| 22 const char* const kLegacyFeaturesHistogramName = "WebCore.FeatureObserver"; | 27 const char* const kLegacyFeaturesHistogramName = "WebCore.FeatureObserver"; |
| 23 const char* const kLegacyCSSHistogramName = | 28 const char* const kLegacyCSSHistogramName = |
| 24 "WebCore.FeatureObserver.CSSProperties"; | 29 "WebCore.FeatureObserver.CSSProperties"; |
| 25 } | 30 } |
| 26 | 31 |
| 27 namespace blink { | 32 namespace blink { |
| 28 | 33 |
| 29 template <typename T> | 34 template <typename T> |
| 30 void histogramBasicTest(const std::string& histogram, | 35 void histogramBasicTest(const std::string& histogram, |
| 31 const std::string& legacyHistogram, | 36 const std::string& legacyHistogram, |
| 32 const std::vector<std::string>& unaffectedHistograms, | 37 const std::vector<std::string>& unaffectedHistograms, |
| 33 T item, | 38 T item, |
| 34 T secondItem, | 39 T secondItem, |
| 35 std::function<bool(T)> counted, | 40 std::function<bool(T)> counted, |
| 36 std::function<void(T)> count, | 41 std::function<void(T)> count, |
| 37 std::function<int(T)> histogramMap, | 42 std::function<int(T)> histogramMap, |
| 38 std::function<void(KURL)> didCommitLoad, | 43 std::function<void(KURL)> didCommitLoad, |
| 39 const std::string& url, | 44 const std::string& url, |
| 40 int pageVisitBucket) { | 45 int pageVisitBucket) { |
| 41 HistogramTester histogramTester; | 46 HistogramTester histogramTester; |
| 42 | 47 |
| 43 // Test recording a single (arbitrary) counter | 48 // Test recording a single (arbitrary) counter |
| 44 EXPECT_FALSE(counted(item)); | 49 EXPECT_FALSE(counted(item)); |
| 45 count(item); | 50 count(item); |
| 46 EXPECT_TRUE(counted(item)); | 51 EXPECT_TRUE(counted(item)); |
| 47 histogramTester.expectUniqueSample(histogram, histogramMap(item), 1); | 52 histogramTester.expectUniqueSample(histogram, histogramMap(item), 1); |
| 48 histogramTester.expectTotalCount(legacyHistogram, 0); | 53 if (!legacyHistogram.empty()) { |
| 54 histogramTester.expectTotalCount(legacyHistogram, 0); | |
| 55 } | |
| 49 | 56 |
| 50 // Test that repeated measurements have no effect | 57 // Test that repeated measurements have no effect |
| 51 count(item); | 58 count(item); |
| 52 histogramTester.expectUniqueSample(histogram, histogramMap(item), 1); | 59 histogramTester.expectUniqueSample(histogram, histogramMap(item), 1); |
| 53 histogramTester.expectTotalCount(legacyHistogram, 0); | 60 if (!legacyHistogram.empty()) { |
| 61 histogramTester.expectTotalCount(legacyHistogram, 0); | |
| 62 } | |
| 54 | 63 |
| 55 // Test recording a different sample | 64 // Test recording a different sample |
| 56 EXPECT_FALSE(counted(secondItem)); | 65 EXPECT_FALSE(counted(secondItem)); |
| 57 count(secondItem); | 66 count(secondItem); |
| 58 EXPECT_TRUE(counted(secondItem)); | 67 EXPECT_TRUE(counted(secondItem)); |
| 59 histogramTester.expectBucketCount(histogram, histogramMap(item), 1); | 68 histogramTester.expectBucketCount(histogram, histogramMap(item), 1); |
| 60 histogramTester.expectBucketCount(histogram, histogramMap(secondItem), 1); | 69 histogramTester.expectBucketCount(histogram, histogramMap(secondItem), 1); |
| 61 histogramTester.expectTotalCount(histogram, 2); | 70 histogramTester.expectTotalCount(histogram, 2); |
| 62 histogramTester.expectTotalCount(legacyHistogram, 0); | 71 if (!legacyHistogram.empty()) { |
| 72 histogramTester.expectTotalCount(legacyHistogram, 0); | |
| 73 } | |
| 63 | 74 |
| 64 // After a page load, the histograms will be updated, even when the URL | 75 // After a page load, the histograms will be updated, even when the URL |
| 65 // scheme is internal | 76 // scheme is internal |
| 66 didCommitLoad(URLTestHelpers::toKURL(url)); | 77 didCommitLoad(URLTestHelpers::toKURL(url)); |
| 67 histogramTester.expectBucketCount(histogram, histogramMap(item), 1); | 78 histogramTester.expectBucketCount(histogram, histogramMap(item), 1); |
| 68 histogramTester.expectBucketCount(histogram, histogramMap(secondItem), 1); | 79 histogramTester.expectBucketCount(histogram, histogramMap(secondItem), 1); |
| 69 histogramTester.expectBucketCount(histogram, pageVisitBucket, 1); | 80 histogramTester.expectBucketCount(histogram, pageVisitBucket, 1); |
| 70 histogramTester.expectTotalCount(histogram, 3); | 81 histogramTester.expectTotalCount(histogram, 3); |
| 71 | 82 |
| 72 // And verify the legacy histogram now looks the same | 83 // And verify the legacy histogram now looks the same |
| 73 histogramTester.expectBucketCount(legacyHistogram, histogramMap(item), 1); | 84 if (!legacyHistogram.empty()) { |
| 74 histogramTester.expectBucketCount(legacyHistogram, histogramMap(secondItem), | 85 histogramTester.expectBucketCount(legacyHistogram, histogramMap(item), 1); |
| 75 1); | 86 histogramTester.expectBucketCount(legacyHistogram, histogramMap(secondItem), |
| 76 histogramTester.expectBucketCount(legacyHistogram, pageVisitBucket, 1); | 87 1); |
| 77 histogramTester.expectTotalCount(legacyHistogram, 3); | 88 histogramTester.expectBucketCount(legacyHistogram, pageVisitBucket, 1); |
| 89 histogramTester.expectTotalCount(legacyHistogram, 3); | |
| 90 } | |
| 78 | 91 |
| 79 // Now a repeat measurement should get recorded again, exactly once | 92 // Now a repeat measurement should get recorded again, exactly once |
| 80 EXPECT_FALSE(counted(item)); | 93 EXPECT_FALSE(counted(item)); |
| 81 count(item); | 94 count(item); |
| 82 count(item); | 95 count(item); |
| 83 EXPECT_TRUE(counted(item)); | 96 EXPECT_TRUE(counted(item)); |
| 84 histogramTester.expectBucketCount(histogram, histogramMap(item), 2); | 97 histogramTester.expectBucketCount(histogram, histogramMap(item), 2); |
| 85 histogramTester.expectTotalCount(histogram, 4); | 98 histogramTester.expectTotalCount(histogram, 4); |
| 86 | 99 |
| 87 // And on the next page load, the legacy histogram will again be updated | 100 // And on the next page load, the legacy histogram will again be updated |
| 88 didCommitLoad(URLTestHelpers::toKURL(url)); | 101 didCommitLoad(URLTestHelpers::toKURL(url)); |
| 89 histogramTester.expectBucketCount(legacyHistogram, histogramMap(item), 2); | 102 if (!legacyHistogram.empty()) { |
| 90 histogramTester.expectBucketCount(legacyHistogram, histogramMap(secondItem), | 103 histogramTester.expectBucketCount(legacyHistogram, histogramMap(item), 2); |
| 91 1); | 104 histogramTester.expectBucketCount(legacyHistogram, histogramMap(secondItem), |
| 92 histogramTester.expectBucketCount(legacyHistogram, pageVisitBucket, 2); | 105 1); |
| 93 histogramTester.expectTotalCount(legacyHistogram, 5); | 106 histogramTester.expectBucketCount(legacyHistogram, pageVisitBucket, 2); |
| 107 histogramTester.expectTotalCount(legacyHistogram, 5); | |
| 108 } | |
| 94 | 109 |
| 95 for (size_t i = 0; i < unaffectedHistograms.size(); ++i) { | 110 for (size_t i = 0; i < unaffectedHistograms.size(); ++i) { |
| 96 histogramTester.expectTotalCount(unaffectedHistograms[i], 0); | 111 histogramTester.expectTotalCount(unaffectedHistograms[i], 0); |
| 97 } | 112 } |
| 98 } | 113 } |
| 99 | 114 |
| 100 // Failing on Android: crbug.com/667913 | 115 // Failing on Android: crbug.com/667913 |
| 101 #if OS(ANDROID) | 116 #if OS(ANDROID) |
| 102 #define MAYBE_RecordingFeatures DISABLED_RecordingFeatures | 117 #define MAYBE_RecordingFeatures DISABLED_RecordingFeatures |
| 103 #else | 118 #else |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 132 [&](CSSPropertyID property) { | 147 [&](CSSPropertyID property) { |
| 133 useCounter.count(HTMLStandardMode, property); | 148 useCounter.count(HTMLStandardMode, property); |
| 134 }, | 149 }, |
| 135 [](CSSPropertyID property) -> int { | 150 [](CSSPropertyID property) -> int { |
| 136 return UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property); | 151 return UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property); |
| 137 }, | 152 }, |
| 138 [&](KURL kurl) { useCounter.didCommitLoad(kurl); }, | 153 [&](KURL kurl) { useCounter.didCommitLoad(kurl); }, |
| 139 "https://dummysite.com/", 1 /* page visit bucket */); | 154 "https://dummysite.com/", 1 /* page visit bucket */); |
| 140 } | 155 } |
| 141 | 156 |
| 157 TEST(UseCounterTest, RecordingAnimatedCSSProperties) { | |
| 158 UseCounter useCounter; | |
| 159 histogramBasicTest<CSSPropertyID>( | |
| 160 kAnimatedCSSHistogramName, "", | |
| 161 {kSVGCSSHistogramName, kSVGAnimatedCSSHistogramName}, CSSPropertyOpacity, | |
| 162 CSSPropertyVariable, | |
| 163 [&](CSSPropertyID property) -> bool { | |
| 164 return useCounter.isCountedAnimatedCSS(property); | |
| 165 }, | |
| 166 [&](CSSPropertyID property) { useCounter.countAnimatedCSS(property); }, | |
| 167 [](CSSPropertyID property) -> int { | |
| 168 return UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property); | |
| 169 }, | |
| 170 [&](KURL kurl) { useCounter.didCommitLoad(kurl); }, | |
| 171 "https://dummysite.com/", 1 /* page visit bucket */); | |
| 172 } | |
| 173 | |
| 142 // Failing on Android: crbug.com/667913 | 174 // Failing on Android: crbug.com/667913 |
| 143 #if OS(ANDROID) | 175 #if OS(ANDROID) |
| 144 #define MAYBE_SVGImageContextFeatures DISABLED_SVGImageContextFeatures | 176 #define MAYBE_SVGImageContextFeatures DISABLED_SVGImageContextFeatures |
| 145 #else | 177 #else |
| 146 #define MAYBE_SVGImageContextFeatures SVGImageContextFeatures | 178 #define MAYBE_SVGImageContextFeatures SVGImageContextFeatures |
| 147 #endif | 179 #endif |
| 148 TEST(UseCounterTest, MAYBE_SVGImageContextFeatures) { | 180 TEST(UseCounterTest, MAYBE_SVGImageContextFeatures) { |
| 149 UseCounter useCounter(UseCounter::SVGImageContext); | 181 UseCounter useCounter(UseCounter::SVGImageContext); |
| 150 histogramBasicTest<UseCounter::Feature>( | 182 histogramBasicTest<UseCounter::Feature>( |
| 151 kSVGFeaturesHistogramName, kLegacyFeaturesHistogramName, | 183 kSVGFeaturesHistogramName, kLegacyFeaturesHistogramName, |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 177 useCounter.count(HTMLStandardMode, property); | 209 useCounter.count(HTMLStandardMode, property); |
| 178 }, | 210 }, |
| 179 [](CSSPropertyID property) -> int { | 211 [](CSSPropertyID property) -> int { |
| 180 return UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property); | 212 return UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property); |
| 181 }, | 213 }, |
| 182 [&](KURL kurl) { useCounter.didCommitLoad(kurl); }, "about:blank", | 214 [&](KURL kurl) { useCounter.didCommitLoad(kurl); }, "about:blank", |
| 183 // In practice SVGs always appear to be loaded with an about:blank URL | 215 // In practice SVGs always appear to be loaded with an about:blank URL |
| 184 1 /* page visit bucket */); | 216 1 /* page visit bucket */); |
| 185 } | 217 } |
| 186 | 218 |
| 219 TEST(UseCounterTest, SVGImageContextAnimatedCSSProperties) { | |
| 220 UseCounter useCounter(UseCounter::SVGImageContext); | |
| 221 histogramBasicTest<CSSPropertyID>( | |
| 222 kSVGAnimatedCSSHistogramName, "", | |
| 223 {kCSSHistogramName, kAnimatedCSSHistogramName}, CSSPropertyOpacity, | |
| 224 CSSPropertyVariable, | |
| 225 [&](CSSPropertyID property) -> bool { | |
| 226 return useCounter.isCountedAnimatedCSS(property); | |
| 227 }, | |
| 228 [&](CSSPropertyID property) { useCounter.countAnimatedCSS(property); }, | |
| 229 [](CSSPropertyID property) -> int { | |
| 230 return UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(property); | |
| 231 }, | |
| 232 [&](KURL kurl) { useCounter.didCommitLoad(kurl); }, "about:blank", | |
| 233 // In practice SVGs always appear to be loaded with an about:blank URL | |
| 234 1 /* page visit bucket */); | |
| 235 } | |
| 236 | |
| 187 // Failing on Android: crbug.com/667913 | 237 // Failing on Android: crbug.com/667913 |
| 188 #if OS(ANDROID) | 238 #if OS(ANDROID) |
| 189 #define MAYBE_InspectorDisablesMeasurement DISABLED_InspectorDisablesMeasurement | 239 #define MAYBE_InspectorDisablesMeasurement DISABLED_InspectorDisablesMeasurement |
| 190 #else | 240 #else |
| 191 #define MAYBE_InspectorDisablesMeasurement InspectorDisablesMeasurement | 241 #define MAYBE_InspectorDisablesMeasurement InspectorDisablesMeasurement |
| 192 #endif | 242 #endif |
| 193 TEST(UseCounterTest, MAYBE_InspectorDisablesMeasurement) { | 243 TEST(UseCounterTest, MAYBE_InspectorDisablesMeasurement) { |
| 194 UseCounter useCounter; | 244 UseCounter useCounter; |
| 195 HistogramTester histogramTester; | 245 HistogramTester histogramTester; |
| 196 | 246 |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 390 | 440 |
| 391 m_deprecation.unmuteForInspector(); | 441 m_deprecation.unmuteForInspector(); |
| 392 Deprecation::warnOnDeprecatedProperties(frame(), property); | 442 Deprecation::warnOnDeprecatedProperties(frame(), property); |
| 393 // TODO: use the actually deprecated property to get a deprecation message. | 443 // TODO: use the actually deprecated property to get a deprecation message. |
| 394 EXPECT_FALSE(m_deprecation.isSuppressed(property)); | 444 EXPECT_FALSE(m_deprecation.isSuppressed(property)); |
| 395 Deprecation::countDeprecation(frame(), feature); | 445 Deprecation::countDeprecation(frame(), feature); |
| 396 EXPECT_TRUE(m_useCounter.hasRecordedMeasurement(feature)); | 446 EXPECT_TRUE(m_useCounter.hasRecordedMeasurement(feature)); |
| 397 } | 447 } |
| 398 | 448 |
| 399 } // namespace blink | 449 } // namespace blink |
| OLD | NEW |