Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google, Inc. All rights reserved. | 2 * Copyright (C) 2012 Google, Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1099 ASSERT_NOT_REACHED(); | 1099 ASSERT_NOT_REACHED(); |
| 1100 return 0; | 1100 return 0; |
| 1101 } | 1101 } |
| 1102 | 1102 |
| 1103 ASSERT_NOT_REACHED(); | 1103 ASSERT_NOT_REACHED(); |
| 1104 return 0; | 1104 return 0; |
| 1105 } | 1105 } |
| 1106 | 1106 |
| 1107 UseCounter::UseCounter(Context context) | 1107 UseCounter::UseCounter(Context context) |
| 1108 : mute_count_(0), | 1108 : mute_count_(0), |
| 1109 disable_reporting_(false), | |
| 1110 context_(context), | 1109 context_(context), |
| 1111 features_recorded_(kNumberOfFeatures), | 1110 features_recorded_(kNumberOfFeatures), |
| 1112 css_recorded_(numCSSPropertyIDs), | 1111 css_recorded_(numCSSPropertyIDs), |
| 1113 animated_css_recorded_(numCSSPropertyIDs) {} | 1112 animated_css_recorded_(numCSSPropertyIDs) {} |
| 1114 | 1113 |
| 1115 void UseCounter::MuteForInspector() { | 1114 void UseCounter::MuteForInspector() { |
| 1116 mute_count_++; | 1115 mute_count_++; |
| 1117 } | 1116 } |
| 1118 | 1117 |
| 1119 void UseCounter::UnmuteForInspector() { | 1118 void UseCounter::UnmuteForInspector() { |
| 1120 mute_count_--; | 1119 mute_count_--; |
| 1121 } | 1120 } |
| 1122 | 1121 |
| 1123 void UseCounter::RecordMeasurement(Feature feature) { | 1122 void UseCounter::RecordMeasurement(Feature feature) { |
| 1124 if (mute_count_) | 1123 if (mute_count_) |
| 1125 return; | 1124 return; |
| 1126 | 1125 |
| 1127 DCHECK(feature != kOBSOLETE_PageDestruction && | 1126 DCHECK(feature != kOBSOLETE_PageDestruction && |
| 1128 feature != | 1127 feature != |
| 1129 kPageVisits); // PageDestruction is reserved as a scaling factor. | 1128 kPageVisits); // PageDestruction is reserved as a scaling factor. |
| 1130 DCHECK(feature < kNumberOfFeatures); | 1129 DCHECK(feature < kNumberOfFeatures); |
| 1131 | 1130 |
| 1132 if (!features_recorded_.QuickGet(feature)) { | 1131 if (!features_recorded_.QuickGet(feature)) { |
| 1133 // Note that HTTPArchive tooling looks specifically for this event - see | 1132 // Note that HTTPArchive tooling looks specifically for this event - see |
| 1134 // https://github.com/HTTPArchive/httparchive/issues/59 | 1133 // https://github.com/HTTPArchive/httparchive/issues/59 |
| 1135 if (!disable_reporting_) { | 1134 if (context_ != kDisabledContext) { |
| 1136 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), | 1135 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), |
| 1137 "FeatureFirstUsed", "feature", feature); | 1136 "FeatureFirstUsed", "feature", feature); |
| 1138 FeaturesHistogram().Count(feature); | 1137 FeaturesHistogram().Count(feature); |
| 1139 NotifyFeatureCounted(feature); | 1138 NotifyFeatureCounted(feature); |
| 1140 } | 1139 } |
| 1141 features_recorded_.QuickSet(feature); | 1140 features_recorded_.QuickSet(feature); |
| 1142 } | 1141 } |
| 1143 legacy_counter_.CountFeature(feature); | 1142 legacy_counter_.CountFeature(feature); |
| 1144 } | 1143 } |
| 1145 | 1144 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1156 } | 1155 } |
| 1157 | 1156 |
| 1158 DEFINE_TRACE(UseCounter) { | 1157 DEFINE_TRACE(UseCounter) { |
| 1159 visitor->Trace(observers_); | 1158 visitor->Trace(observers_); |
| 1160 } | 1159 } |
| 1161 | 1160 |
| 1162 void UseCounter::DidCommitLoad(KURL url) { | 1161 void UseCounter::DidCommitLoad(KURL url) { |
| 1163 legacy_counter_.UpdateMeasurements(); | 1162 legacy_counter_.UpdateMeasurements(); |
| 1164 | 1163 |
| 1165 // Reset state from previous load. | 1164 // Reset state from previous load. |
| 1166 disable_reporting_ = false; | |
| 1167 | |
| 1168 // Use the protocol of the document being loaded into the main frame to | 1165 // Use the protocol of the document being loaded into the main frame to |
| 1169 // decide whether this page is interesting from a metrics perspective. | 1166 // decide whether this page is interesting from a metrics perspective. |
| 1170 // Note that SVGImage cases always have an about:blank URL | 1167 // Note that SVGImage cases always have an about:blank URL |
| 1171 if (context_ == kDefaultContext && | 1168 if (context_ != kSVGImageContext) { |
| 1172 !SchemeRegistry::ShouldTrackUsageMetricsForScheme(url.Protocol())) { | 1169 if (url.ProtocolIs("chrome-extension")) |
| 1173 disable_reporting_ = true; | 1170 context_ = kExtensionContext; |
| 1171 else if (!SchemeRegistry::ShouldTrackUsageMetricsForScheme(url.Protocol())) | |
|
Rick Byers
2017/04/28 15:04:40
nit: avoid the double negative by removing the '!'
lunalu1
2017/05/01 15:37:52
Done
| |
| 1172 context_ = kDisabledContext; | |
| 1173 else | |
| 1174 context_ = kDefaultContext; | |
| 1174 } | 1175 } |
| 1175 | 1176 |
| 1176 features_recorded_.ClearAll(); | 1177 features_recorded_.ClearAll(); |
| 1177 css_recorded_.ClearAll(); | 1178 css_recorded_.ClearAll(); |
| 1178 animated_css_recorded_.ClearAll(); | 1179 animated_css_recorded_.ClearAll(); |
| 1179 if (!disable_reporting_ && !mute_count_) { | 1180 if (context_ != kDisabledContext && !mute_count_) { |
| 1180 FeaturesHistogram().Count(kPageVisits); | 1181 FeaturesHistogram().Count(kPageVisits); |
| 1181 CssHistogram().Count(totalPagesMeasuredCSSSampleId()); | 1182 if (context_ != kExtensionContext) { |
| 1182 AnimatedCSSHistogram().Count(totalPagesMeasuredCSSSampleId()); | 1183 CssHistogram().Count(totalPagesMeasuredCSSSampleId()); |
| 1184 AnimatedCSSHistogram().Count(totalPagesMeasuredCSSSampleId()); | |
| 1185 } | |
| 1183 } | 1186 } |
| 1184 } | 1187 } |
| 1185 | 1188 |
| 1186 void UseCounter::Count(const Frame* frame, Feature feature) { | 1189 void UseCounter::Count(const Frame* frame, Feature feature) { |
| 1187 if (!frame) | 1190 if (!frame) |
| 1188 return; | 1191 return; |
| 1189 Page* page = frame->GetPage(); | 1192 Page* page = frame->GetPage(); |
| 1190 if (!page) | 1193 if (!page) |
| 1191 return; | 1194 return; |
| 1192 | 1195 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1245 void UseCounter::Count(CSSParserMode css_parser_mode, CSSPropertyID property) { | 1248 void UseCounter::Count(CSSParserMode css_parser_mode, CSSPropertyID property) { |
| 1246 DCHECK(isCSSPropertyIDWithName(property) || property == CSSPropertyVariable); | 1249 DCHECK(isCSSPropertyIDWithName(property) || property == CSSPropertyVariable); |
| 1247 | 1250 |
| 1248 if (!IsUseCounterEnabledForMode(css_parser_mode) || mute_count_) | 1251 if (!IsUseCounterEnabledForMode(css_parser_mode) || mute_count_) |
| 1249 return; | 1252 return; |
| 1250 | 1253 |
| 1251 if (!css_recorded_.QuickGet(property)) { | 1254 if (!css_recorded_.QuickGet(property)) { |
| 1252 // Note that HTTPArchive tooling looks specifically for this event - see | 1255 // Note that HTTPArchive tooling looks specifically for this event - see |
| 1253 // https://github.com/HTTPArchive/httparchive/issues/59 | 1256 // https://github.com/HTTPArchive/httparchive/issues/59 |
| 1254 int sample_id = MapCSSPropertyIdToCSSSampleIdForHistogram(property); | 1257 int sample_id = MapCSSPropertyIdToCSSSampleIdForHistogram(property); |
| 1255 if (!disable_reporting_) { | 1258 if (context_ != kDisabledContext && context_ != kExtensionContext) { |
| 1256 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), | 1259 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), |
| 1257 "CSSFirstUsed", "feature", sample_id); | 1260 "CSSFirstUsed", "feature", sample_id); |
| 1258 CssHistogram().Count(sample_id); | 1261 CssHistogram().Count(sample_id); |
| 1259 } | 1262 } |
| 1260 css_recorded_.QuickSet(property); | 1263 css_recorded_.QuickSet(property); |
| 1261 } | 1264 } |
| 1262 legacy_counter_.CountCSS(property); | 1265 legacy_counter_.CountCSS(property); |
| 1263 } | 1266 } |
| 1264 | 1267 |
| 1265 void UseCounter::Count(Feature feature) { | 1268 void UseCounter::Count(Feature feature) { |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 1292 } | 1295 } |
| 1293 | 1296 |
| 1294 void UseCounter::CountAnimatedCSS(CSSPropertyID property) { | 1297 void UseCounter::CountAnimatedCSS(CSSPropertyID property) { |
| 1295 DCHECK(isCSSPropertyIDWithName(property) || property == CSSPropertyVariable); | 1298 DCHECK(isCSSPropertyIDWithName(property) || property == CSSPropertyVariable); |
| 1296 | 1299 |
| 1297 if (mute_count_) | 1300 if (mute_count_) |
| 1298 return; | 1301 return; |
| 1299 | 1302 |
| 1300 if (!animated_css_recorded_.QuickGet(property)) { | 1303 if (!animated_css_recorded_.QuickGet(property)) { |
| 1301 int sample_id = MapCSSPropertyIdToCSSSampleIdForHistogram(property); | 1304 int sample_id = MapCSSPropertyIdToCSSSampleIdForHistogram(property); |
| 1302 if (!disable_reporting_) { | 1305 if (context_ != kDisabledContext && context_ != kExtensionContext) { |
| 1303 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), | 1306 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"), |
| 1304 "AnimatedCSSFirstUsed", "feature", sample_id); | 1307 "AnimatedCSSFirstUsed", "feature", sample_id); |
| 1305 AnimatedCSSHistogram().Count(sample_id); | 1308 AnimatedCSSHistogram().Count(sample_id); |
| 1306 } | 1309 } |
| 1307 animated_css_recorded_.QuickSet(property); | 1310 animated_css_recorded_.QuickSet(property); |
| 1308 } | 1311 } |
| 1309 } | 1312 } |
| 1310 | 1313 |
| 1311 void UseCounter::NotifyFeatureCounted(Feature feature) { | 1314 void UseCounter::NotifyFeatureCounted(Feature feature) { |
| 1312 DCHECK(!mute_count_); | 1315 DCHECK(!mute_count_); |
| 1313 DCHECK(!disable_reporting_); | 1316 DCHECK(context_ != kDisabledContext); |
| 1314 HeapHashSet<Member<Observer>> to_be_removed; | 1317 HeapHashSet<Member<Observer>> to_be_removed; |
| 1315 for (auto observer : observers_) { | 1318 for (auto observer : observers_) { |
| 1316 if (observer->OnCountFeature(feature)) | 1319 if (observer->OnCountFeature(feature)) |
| 1317 to_be_removed.insert(observer); | 1320 to_be_removed.insert(observer); |
| 1318 } | 1321 } |
| 1319 observers_.RemoveAll(to_be_removed); | 1322 observers_.RemoveAll(to_be_removed); |
| 1320 } | 1323 } |
| 1321 | 1324 |
| 1322 EnumerationHistogram& UseCounter::FeaturesHistogram() const { | 1325 EnumerationHistogram& UseCounter::FeaturesHistogram() const { |
| 1326 DCHECK_NE(kDisabledContext, context_); | |
| 1323 // Every SVGImage has it's own Page instance, and multiple web pages can | 1327 // Every SVGImage has it's own Page instance, and multiple web pages can |
| 1324 // share the usage of a single SVGImage. Ideally perhaps we'd delegate | 1328 // share the usage of a single SVGImage. Ideally perhaps we'd delegate |
| 1325 // metrics from an SVGImage to one of the Page's it's displayed in, but | 1329 // metrics from an SVGImage to one of the Page's it's displayed in, but |
| 1326 // that's tricky (SVGImage is intentionally isolated, and the Page that | 1330 // that's tricky (SVGImage is intentionally isolated, and the Page that |
| 1327 // created it may not even exist anymore). | 1331 // created it may not even exist anymore). |
| 1328 // So instead we just use a dedicated histogram for the SVG case. | 1332 // So instead we just use a dedicated histogram for the SVG case. |
| 1333 DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, svg_histogram, | |
| 1334 ("Blink.UseCounter.SVGImage.Features", | |
| 1335 blink::UseCounter::kNumberOfFeatures)); | |
| 1336 DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, extension_histogram, | |
| 1337 ("Blink.UseCounter.Extensions.Features", | |
| 1338 blink::UseCounter::kNumberOfFeatures)); | |
| 1329 DEFINE_STATIC_LOCAL( | 1339 DEFINE_STATIC_LOCAL( |
| 1330 blink::EnumerationHistogram, histogram, | 1340 blink::EnumerationHistogram, histogram, |
| 1331 ("Blink.UseCounter.Features", blink::UseCounter::kNumberOfFeatures)); | 1341 ("Blink.UseCounter.Features", blink::UseCounter::kNumberOfFeatures)); |
| 1332 DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, svg_histogram, | 1342 switch (context_) { |
| 1333 ("Blink.UseCounter.SVGImage.Features", | 1343 case kSVGImageContext: |
| 1334 blink::UseCounter::kNumberOfFeatures)); | 1344 return svg_histogram; |
| 1335 | 1345 case kExtensionContext: |
| 1336 return context_ == kSVGImageContext ? svg_histogram : histogram; | 1346 return extension_histogram; |
| 1347 default: | |
| 1348 return histogram; | |
| 1349 } | |
| 1337 } | 1350 } |
| 1338 | 1351 |
| 1339 EnumerationHistogram& UseCounter::CssHistogram() const { | 1352 EnumerationHistogram& UseCounter::CssHistogram() const { |
| 1340 DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, histogram, | 1353 DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, histogram, |
|
Rick Byers
2017/04/28 15:04:40
Nit: Add DCHECKs to verify we don't have kExtensio
lunalu1
2017/05/01 15:37:52
Done.
| |
| 1341 ("Blink.UseCounter.CSSProperties", kMaximumCSSSampleId)); | 1354 ("Blink.UseCounter.CSSProperties", kMaximumCSSSampleId)); |
| 1342 DEFINE_STATIC_LOCAL( | 1355 DEFINE_STATIC_LOCAL( |
| 1343 blink::EnumerationHistogram, svg_histogram, | 1356 blink::EnumerationHistogram, svg_histogram, |
| 1344 ("Blink.UseCounter.SVGImage.CSSProperties", kMaximumCSSSampleId)); | 1357 ("Blink.UseCounter.SVGImage.CSSProperties", kMaximumCSSSampleId)); |
| 1345 | 1358 |
| 1346 return context_ == kSVGImageContext ? svg_histogram : histogram; | 1359 return context_ == kSVGImageContext ? svg_histogram : histogram; |
| 1347 } | 1360 } |
| 1348 | 1361 |
| 1349 EnumerationHistogram& UseCounter::AnimatedCSSHistogram() const { | 1362 EnumerationHistogram& UseCounter::AnimatedCSSHistogram() const { |
| 1350 DEFINE_STATIC_LOCAL( | 1363 DEFINE_STATIC_LOCAL( |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1415 } | 1428 } |
| 1416 } | 1429 } |
| 1417 | 1430 |
| 1418 if (needs_pages_measured_update) | 1431 if (needs_pages_measured_update) |
| 1419 css_properties_histogram.Count(totalPagesMeasuredCSSSampleId()); | 1432 css_properties_histogram.Count(totalPagesMeasuredCSSSampleId()); |
| 1420 | 1433 |
| 1421 css_bits_.ClearAll(); | 1434 css_bits_.ClearAll(); |
| 1422 } | 1435 } |
| 1423 | 1436 |
| 1424 } // namespace blink | 1437 } // namespace blink |
| OLD | NEW |