Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/android/most_visited_sites.h" | 5 #include "chrome/browser/android/most_visited_sites.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 51 | 51 |
| 52 // Total number of tiles displayed. | 52 // Total number of tiles displayed. |
| 53 const char kNumTilesHistogramName[] = "NewTabPage.NumberOfTiles"; | 53 const char kNumTilesHistogramName[] = "NewTabPage.NumberOfTiles"; |
| 54 // Tracking thumbnails. | 54 // Tracking thumbnails. |
| 55 const char kNumLocalThumbnailTilesHistogramName[] = | 55 const char kNumLocalThumbnailTilesHistogramName[] = |
| 56 "NewTabPage.NumberOfThumbnailTiles"; | 56 "NewTabPage.NumberOfThumbnailTiles"; |
| 57 const char kNumEmptyTilesHistogramName[] = "NewTabPage.NumberOfGrayTiles"; | 57 const char kNumEmptyTilesHistogramName[] = "NewTabPage.NumberOfGrayTiles"; |
| 58 const char kNumServerTilesHistogramName[] = "NewTabPage.NumberOfExternalTiles"; | 58 const char kNumServerTilesHistogramName[] = "NewTabPage.NumberOfExternalTiles"; |
| 59 // Client suggestion opened. | 59 // Client suggestion opened. |
| 60 const char kOpenedItemClientHistogramName[] = "NewTabPage.MostVisited.client"; | 60 const char kOpenedItemClientHistogramName[] = "NewTabPage.MostVisited.client"; |
| 61 // Control group suggestion opened. | |
| 62 const char kOpenedItemControlHistogramName[] = "NewTabPage.MostVisited.client0"; | |
| 61 // Server suggestion opened, no provider. | 63 // Server suggestion opened, no provider. |
| 62 const char kOpenedItemServerHistogramName[] = "NewTabPage.MostVisited.server"; | 64 const char kOpenedItemServerHistogramName[] = "NewTabPage.MostVisited.server"; |
| 63 // Server suggestion opened with provider. | 65 // Server suggestion opened with provider. |
| 64 const char kOpenedItemServerProviderHistogramFormat[] = | 66 const char kOpenedItemServerProviderHistogramFormat[] = |
| 65 "NewTabPage.MostVisited.server%d"; | 67 "NewTabPage.MostVisited.server%d"; |
| 66 // Client impression. | 68 // Client impression. |
| 67 const char kImpressionClientHistogramName[] = | 69 const char kImpressionClientHistogramName[] = |
| 68 "NewTabPage.SuggestionsImpression.client"; | 70 "NewTabPage.SuggestionsImpression.client"; |
| 71 // Control group impression. | |
| 72 const char kImpressionControlHistogramName[] = | |
| 73 "NewTabPage.SuggestionsImpression.client0"; | |
| 69 // Server suggestion impression, no provider. | 74 // Server suggestion impression, no provider. |
| 70 const char kImpressionServerHistogramName[] = | 75 const char kImpressionServerHistogramName[] = |
| 71 "NewTabPage.SuggestionsImpression.server"; | 76 "NewTabPage.SuggestionsImpression.server"; |
| 72 // Server suggestion impression with provider. | 77 // Server suggestion impression with provider. |
| 73 const char kImpressionServerHistogramFormat[] = | 78 const char kImpressionServerHistogramFormat[] = |
| 74 "NewTabPage.SuggestionsImpression.server%d"; | 79 "NewTabPage.SuggestionsImpression.server%d"; |
| 75 | 80 |
| 76 void ExtractMostVisitedTitlesAndURLs( | 81 void ExtractMostVisitedTitlesAndURLs( |
| 77 const history::MostVisitedURLList& visited_list, | 82 const history::MostVisitedURLList& visited_list, |
| 78 std::vector<base::string16>* titles, | 83 std::vector<base::string16>* titles, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 161 1, | 166 1, |
| 162 num_sites, | 167 num_sites, |
| 163 num_sites + 1, | 168 num_sites + 1, |
| 164 base::Histogram::kUmaTargetedHistogramFlag); | 169 base::Histogram::kUmaTargetedHistogramFlag); |
| 165 counter->Add(position); | 170 counter->Add(position); |
| 166 } | 171 } |
| 167 | 172 |
| 168 } // namespace | 173 } // namespace |
| 169 | 174 |
| 170 MostVisitedSites::MostVisitedSites(Profile* profile) | 175 MostVisitedSites::MostVisitedSites(Profile* profile) |
| 171 : profile_(profile), num_sites_(0), num_local_thumbs_(0), | 176 : profile_(profile), num_sites_(0), is_control_group_(false), |
| 172 num_server_thumbs_(0), num_empty_thumbs_(0), weak_ptr_factory_(this) { | 177 num_local_thumbs_(0), num_server_thumbs_(0), num_empty_thumbs_(0), |
| 178 weak_ptr_factory_(this) { | |
| 173 // Register the debugging page for the Suggestions Service and the thumbnails | 179 // Register the debugging page for the Suggestions Service and the thumbnails |
| 174 // debugging page. | 180 // debugging page. |
| 175 content::URLDataSource::Add(profile_, | 181 content::URLDataSource::Add(profile_, |
| 176 new suggestions::SuggestionsSource(profile_)); | 182 new suggestions::SuggestionsSource(profile_)); |
| 177 content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_)); | 183 content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_)); |
| 178 } | 184 } |
| 179 | 185 |
| 180 MostVisitedSites::~MostVisitedSites() { | 186 MostVisitedSites::~MostVisitedSites() { |
| 181 } | 187 } |
| 182 | 188 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 break; | 277 break; |
| 272 } | 278 } |
| 273 } | 279 } |
| 274 } | 280 } |
| 275 | 281 |
| 276 void MostVisitedSites::RecordOpenedMostVisitedItem(JNIEnv* env, | 282 void MostVisitedSites::RecordOpenedMostVisitedItem(JNIEnv* env, |
| 277 jobject obj, | 283 jobject obj, |
| 278 jint index) { | 284 jint index) { |
| 279 switch (mv_source_) { | 285 switch (mv_source_) { |
| 280 case TOP_SITES: { | 286 case TOP_SITES: { |
| 281 HISTOGRAM_SPARSE_SLOWLY(kOpenedItemClientHistogramName, index); | 287 UMA_HISTOGRAM_SPARSE_SLOWLY(is_control_group_ ? |
| 288 kOpenedItemControlHistogramName : kOpenedItemClientHistogramName, | |
| 289 index); | |
|
beaudoin1
2014/06/18 17:46:54
I know many histogram macros do not support a dyna
Mathieu
2014/06/18 17:55:09
Ah good catch, I even have the function in this fi
| |
| 282 break; | 290 break; |
| 283 } | 291 } |
| 284 case SUGGESTIONS_SERVICE: { | 292 case SUGGESTIONS_SERVICE: { |
| 285 if (server_suggestions_.suggestions_size() > index) { | 293 if (server_suggestions_.suggestions_size() > index) { |
| 286 if (server_suggestions_.suggestions(index).providers_size()) { | 294 if (server_suggestions_.suggestions(index).providers_size()) { |
| 287 std::string histogram = base::StringPrintf( | 295 std::string histogram = base::StringPrintf( |
| 288 kOpenedItemServerProviderHistogramFormat, | 296 kOpenedItemServerProviderHistogramFormat, |
| 289 server_suggestions_.suggestions(index).providers(0)); | 297 server_suggestions_.suggestions(index).providers(0)); |
| 290 LogHistogramEvent(histogram, index, num_sites_); | 298 LogHistogramEvent(histogram, index, num_sites_); |
| 291 } else { | 299 } else { |
| 292 HISTOGRAM_SPARSE_SLOWLY(kOpenedItemServerHistogramName, index); | 300 UMA_HISTOGRAM_SPARSE_SLOWLY(kOpenedItemServerHistogramName, index); |
|
beaudoin1
2014/06/18 17:46:54
Out of curiosity: What's the difference between th
Mathieu
2014/06/18 17:55:09
The COUNTS macros don't work very well when the ma
| |
| 293 } | 301 } |
| 294 } | 302 } |
| 295 break; | 303 break; |
| 296 } | 304 } |
| 297 } | 305 } |
| 298 } | 306 } |
| 299 | 307 |
| 300 void MostVisitedSites::Observe(int type, | 308 void MostVisitedSites::Observe(int type, |
| 301 const content::NotificationSource& source, | 309 const content::NotificationSource& source, |
| 302 const content::NotificationDetails& details) { | 310 const content::NotificationDetails& details) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 ScopedJavaGlobalRef<jobject>* j_observer, | 354 ScopedJavaGlobalRef<jobject>* j_observer, |
| 347 int num_sites, | 355 int num_sites, |
| 348 const history::MostVisitedURLList& visited_list) { | 356 const history::MostVisitedURLList& visited_list) { |
| 349 std::vector<base::string16> titles; | 357 std::vector<base::string16> titles; |
| 350 std::vector<std::string> urls; | 358 std::vector<std::string> urls; |
| 351 ExtractMostVisitedTitlesAndURLs(visited_list, &titles, &urls, num_sites); | 359 ExtractMostVisitedTitlesAndURLs(visited_list, &titles, &urls, num_sites); |
| 352 | 360 |
| 353 mv_source_ = TOP_SITES; | 361 mv_source_ = TOP_SITES; |
| 354 | 362 |
| 355 int num_tiles = urls.size(); | 363 int num_tiles = urls.size(); |
| 356 HISTOGRAM_SPARSE_SLOWLY(kNumTilesHistogramName, num_tiles); | 364 UMA_HISTOGRAM_SPARSE_SLOWLY(kNumTilesHistogramName, num_tiles); |
| 357 for (int i = 0; i < num_tiles; ++i) { | 365 for (int i = 0; i < num_tiles; ++i) { |
| 358 HISTOGRAM_SPARSE_SLOWLY(kImpressionClientHistogramName, i); | 366 UMA_HISTOGRAM_SPARSE_SLOWLY(is_control_group_ ? |
| 367 kImpressionControlHistogramName : kImpressionClientHistogramName, i); | |
|
beaudoin1
2014/06/18 17:46:54
Same remark here.
Mathieu
2014/06/18 17:55:09
Done.
| |
| 359 } | 368 } |
| 360 | 369 |
| 361 JNIEnv* env = AttachCurrentThread(); | 370 JNIEnv* env = AttachCurrentThread(); |
| 362 Java_MostVisitedURLsObserver_onMostVisitedURLsAvailable( | 371 Java_MostVisitedURLsObserver_onMostVisitedURLsAvailable( |
| 363 env, | 372 env, |
| 364 j_observer->obj(), | 373 j_observer->obj(), |
| 365 ToJavaArrayOfStrings(env, titles).obj(), | 374 ToJavaArrayOfStrings(env, titles).obj(), |
| 366 ToJavaArrayOfStrings(env, urls).obj()); | 375 ToJavaArrayOfStrings(env, urls).obj()); |
| 367 } | 376 } |
| 368 | 377 |
| 369 void MostVisitedSites::OnSuggestionsProfileAvailable( | 378 void MostVisitedSites::OnSuggestionsProfileAvailable( |
| 370 ScopedJavaGlobalRef<jobject>* j_observer, | 379 ScopedJavaGlobalRef<jobject>* j_observer, |
| 371 const SuggestionsProfile& suggestions_profile) { | 380 const SuggestionsProfile& suggestions_profile) { |
| 372 int size = suggestions_profile.suggestions_size(); | 381 int size = suggestions_profile.suggestions_size(); |
| 373 if (size == 0) { | 382 |
| 374 // No suggestions data available, initiate Top Sites query. | 383 // Determine if the user is in a control group (they would have received |
| 384 // suggestions, but are in a group where they shouldn't). | |
| 385 is_control_group_ = size && SuggestionsService::IsControlGroup(); | |
| 386 | |
| 387 // If no suggestions data is available or the user is in a control group, | |
| 388 // initiate Top Sites query. | |
| 389 if (is_control_group_ || !size) { | |
| 375 InitiateTopSitesQuery(); | 390 InitiateTopSitesQuery(); |
| 376 return; | 391 return; |
| 377 } | 392 } |
| 378 | 393 |
| 379 std::vector<base::string16> titles; | 394 std::vector<base::string16> titles; |
| 380 std::vector<std::string> urls; | 395 std::vector<std::string> urls; |
| 381 | 396 |
| 382 int i = 0; | 397 int i = 0; |
| 383 for (; i < size && i < num_sites_; ++i) { | 398 for (; i < size && i < num_sites_; ++i) { |
| 384 const ChromeSuggestion& suggestion = suggestions_profile.suggestions(i); | 399 const ChromeSuggestion& suggestion = suggestions_profile.suggestions(i); |
| 385 titles.push_back(base::UTF8ToUTF16(suggestion.title())); | 400 titles.push_back(base::UTF8ToUTF16(suggestion.title())); |
| 386 urls.push_back(suggestion.url()); | 401 urls.push_back(suggestion.url()); |
| 387 if (suggestion.providers_size()) { | 402 if (suggestion.providers_size()) { |
| 388 std::string histogram = base::StringPrintf( | 403 std::string histogram = base::StringPrintf( |
| 389 kImpressionServerHistogramFormat, suggestion.providers(0)); | 404 kImpressionServerHistogramFormat, suggestion.providers(0)); |
| 390 LogHistogramEvent(histogram, i, num_sites_); | 405 LogHistogramEvent(histogram, i, num_sites_); |
| 391 } else { | 406 } else { |
| 392 HISTOGRAM_SPARSE_SLOWLY(kImpressionServerHistogramName, i); | 407 UMA_HISTOGRAM_SPARSE_SLOWLY(kImpressionServerHistogramName, i); |
| 393 } | 408 } |
| 394 } | 409 } |
| 395 HISTOGRAM_SPARSE_SLOWLY(kNumTilesHistogramName, i); | 410 UMA_HISTOGRAM_SPARSE_SLOWLY(kNumTilesHistogramName, i); |
| 396 | 411 |
| 397 mv_source_ = SUGGESTIONS_SERVICE; | 412 mv_source_ = SUGGESTIONS_SERVICE; |
| 398 // Keep a copy of the suggestions for eventual logging. | 413 // Keep a copy of the suggestions for eventual logging. |
| 399 server_suggestions_ = suggestions_profile; | 414 server_suggestions_ = suggestions_profile; |
| 400 | 415 |
| 401 JNIEnv* env = AttachCurrentThread(); | 416 JNIEnv* env = AttachCurrentThread(); |
| 402 Java_MostVisitedURLsObserver_onMostVisitedURLsAvailable( | 417 Java_MostVisitedURLsObserver_onMostVisitedURLsAvailable( |
| 403 env, | 418 env, |
| 404 j_observer->obj(), | 419 j_observer->obj(), |
| 405 ToJavaArrayOfStrings(env, titles).obj(), | 420 ToJavaArrayOfStrings(env, titles).obj(), |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 447 gfx::ConvertToJavaBitmap(bitmap).obj()); | 462 gfx::ConvertToJavaBitmap(bitmap).obj()); |
| 448 } else { | 463 } else { |
| 449 num_empty_thumbs_++; | 464 num_empty_thumbs_++; |
| 450 } | 465 } |
| 451 | 466 |
| 452 Java_ThumbnailCallback_onMostVisitedURLsThumbnailAvailable( | 467 Java_ThumbnailCallback_onMostVisitedURLsThumbnailAvailable( |
| 453 env, j_callback->obj(), j_bitmap_ref->obj()); | 468 env, j_callback->obj(), j_bitmap_ref->obj()); |
| 454 } | 469 } |
| 455 | 470 |
| 456 void MostVisitedSites::RecordUMAMetrics() { | 471 void MostVisitedSites::RecordUMAMetrics() { |
| 457 HISTOGRAM_SPARSE_SLOWLY(kNumLocalThumbnailTilesHistogramName, | 472 UMA_HISTOGRAM_SPARSE_SLOWLY(kNumLocalThumbnailTilesHistogramName, |
| 458 num_local_thumbs_); | 473 num_local_thumbs_); |
| 459 num_local_thumbs_ = 0; | 474 num_local_thumbs_ = 0; |
| 460 HISTOGRAM_SPARSE_SLOWLY(kNumEmptyTilesHistogramName, num_empty_thumbs_); | 475 UMA_HISTOGRAM_SPARSE_SLOWLY(kNumEmptyTilesHistogramName, num_empty_thumbs_); |
| 461 num_empty_thumbs_ = 0; | 476 num_empty_thumbs_ = 0; |
| 462 HISTOGRAM_SPARSE_SLOWLY(kNumServerTilesHistogramName, num_server_thumbs_); | 477 UMA_HISTOGRAM_SPARSE_SLOWLY(kNumServerTilesHistogramName, num_server_thumbs_); |
| 463 num_server_thumbs_ = 0; | 478 num_server_thumbs_ = 0; |
| 464 } | 479 } |
| 465 | 480 |
| 466 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) { | 481 static jlong Init(JNIEnv* env, jobject obj, jobject jprofile) { |
| 467 MostVisitedSites* most_visited_sites = | 482 MostVisitedSites* most_visited_sites = |
| 468 new MostVisitedSites(ProfileAndroid::FromProfileAndroid(jprofile)); | 483 new MostVisitedSites(ProfileAndroid::FromProfileAndroid(jprofile)); |
| 469 return reinterpret_cast<intptr_t>(most_visited_sites); | 484 return reinterpret_cast<intptr_t>(most_visited_sites); |
| 470 } | 485 } |
| OLD | NEW |