19ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 29ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 39ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// found in the LICENSE file. 49ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h" 69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/metrics/histogram.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/stringprintf.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/search/most_visited_iframe_source.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/search/search.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/search_urls.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/url_constants.h" 149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/public/browser/navigation_details.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/web_contents.h" 189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Macro to log UMA statistics related to the 8 tiles shown on the NTP. 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define UMA_HISTOGRAM_NTP_TILES(name, sample) \ 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS(name, sample, 0, 8, 9) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Used to track if suggestions were issued by the client or the server. 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)enum SuggestionsType { 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CLIENT_SIDE = 0, 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SERVER_SIDE = 1, 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SUGGESTIONS_TYPE_COUNT = 2 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Number of Most Visited elements on the NTP for logging purposes. 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const int kNumMostVisited = 8; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Name of the histogram keeping track of Most Visited impressions. 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kMostVisitedImpressionHistogramName[] = 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "NewTabPage.SuggestionsImpression"; 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Format string to generate the name for the histogram keeping track of 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// suggestion impressions. 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kMostVisitedImpressionHistogramWithProvider[] = 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "NewTabPage.SuggestionsImpression.%s"; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Name of the histogram keeping track of Most Visited navigations. 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kMostVisitedNavigationHistogramName[] = 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "NewTabPage.MostVisited"; 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Format string to generate the name for the histogram keeping track of 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// suggestion navigations. 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kMostVisitedNavigationHistogramWithProvider[] = 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "NewTabPage.MostVisited.%s"; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochDEFINE_WEB_CONTENTS_USER_DATA_KEY(NTPUserDataLogger); 569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochNTPUserDataLogger::~NTPUserDataLogger() {} 589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)NTPUserDataLogger* NTPUserDataLogger::GetOrCreateFromWebContents( 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::WebContents* content) { 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Calling CreateForWebContents when an instance is already attached has no 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // effect, so we can do this. 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NTPUserDataLogger::CreateForWebContents(content); 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NTPUserDataLogger* logger = NTPUserDataLogger::FromWebContents(content); 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We record the URL of this NTP in order to identify navigations that 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // originate from it. We use the NavigationController's URL since it might 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // differ from the WebContents URL which is usually chrome://newtab/. 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const content::NavigationEntry* entry = 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content->GetController().GetVisibleEntry(); 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (entry) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) logger->ntp_url_ = entry->GetURL(); 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return logger; 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::string NTPUserDataLogger::GetMostVisitedImpressionHistogramNameForProvider( 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& provider) { 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return base::StringPrintf(kMostVisitedImpressionHistogramWithProvider, 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) provider.c_str()); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)std::string NTPUserDataLogger::GetMostVisitedNavigationHistogramNameForProvider( 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& provider) { 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return base::StringPrintf(kMostVisitedNavigationHistogramWithProvider, 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) provider.c_str()); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NTPUserDataLogger::EmitNtpStatistics() { 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("NewTabPage.NumberOfMouseOvers", number_of_mouseovers_); 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) number_of_mouseovers_ = 0; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Only log the following statistics if at least one tile is recorded. This 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // check is required because the statistics are emitted whenever the user 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // changes tab away from the NTP. However, if the user comes back to that NTP 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // later the statistics are not regenerated (i.e. they are all 0). If we log 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // them again we get a strong bias. 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (number_of_tiles_ > 0) { 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "NewTabPage.SuggestionsType", 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_server_side_suggestions_ ? SERVER_SIDE : CLIENT_SIDE, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SUGGESTIONS_TYPE_COUNT); 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_server_side_suggestions_ = false; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfTiles", number_of_tiles_); 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_tiles_ = 0; 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfThumbnailTiles", 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_tiles_); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_tiles_ = 0; 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfGrayTiles", 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tiles_); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tiles_ = 0; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfExternalTiles", 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_external_tiles_); 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_external_tiles_ = 0; 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfThumbnailErrors", 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_errors_); 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_errors_ = 0; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfGrayTileFallbacks", 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tile_fallbacks_); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tile_fallbacks_ = 0; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfExternalTileFallbacks", 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_external_tile_fallbacks_); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_external_tile_fallbacks_ = 0; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NTPUserDataLogger::LogEvent(NTPLoggingEventType event) { 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (event) { 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case NTP_SERVER_SIDE_SUGGESTION: 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_server_side_suggestions_ = true; 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case NTP_CLIENT_SIDE_SUGGESTION: 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We should never get a mix of server and client side suggestions, 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // otherwise there could be a race condition depending on the order in 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // which the iframes call this method. 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!has_server_side_suggestions_); 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_TILE: 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_tiles_++; 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_THUMBNAIL_TILE: 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_tiles_++; 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_GRAY_TILE: 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tiles_++; 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case NTP_EXTERNAL_TILE: 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) number_of_external_tiles_++; 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_THUMBNAIL_ERROR: 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_errors_++; 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_GRAY_TILE_FALLBACK: 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tile_fallbacks_++; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_EXTERNAL_TILE_FALLBACK: 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_external_tile_fallbacks_++; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NTP_MOUSEOVER: 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_mouseovers_++; 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NOTREACHED(); 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NTPUserDataLogger::LogMostVisitedImpression( 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int position, const base::string16& provider) { 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Log the Most Visited navigation for navigations that have providers and 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // those that dont. 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION(kMostVisitedImpressionHistogramName, position, 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNumMostVisited); 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If a provider is specified, log the metric specific to it. 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!provider.empty()) { 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cannot rely on UMA histograms macro because the name of the histogram is 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // generated dynamically. 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::HistogramBase* counter = base::LinearHistogram::FactoryGet( 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetMostVisitedImpressionHistogramNameForProvider( 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::UTF16ToUTF8(provider)), 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1, 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNumMostVisited, 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNumMostVisited + 1, 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Histogram::kUmaTargetedHistogramFlag); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) counter->Add(position); 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NTPUserDataLogger::LogMostVisitedNavigation( 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int position, const base::string16& provider) { 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Log the Most Visited navigation for navigations that have providers and 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // those that dont. 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION(kMostVisitedNavigationHistogramName, position, 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNumMostVisited); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If a provider is specified, log the metric specific to it. 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!provider.empty()) { 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Cannot rely on UMA histograms macro because the name of the histogram is 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // generated dynamically. 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::HistogramBase* counter = base::LinearHistogram::FactoryGet( 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetMostVisitedNavigationHistogramNameForProvider( 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::UTF16ToUTF8(provider)), 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1, 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNumMostVisited, 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNumMostVisited + 1, 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Histogram::kUmaTargetedHistogramFlag); 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) counter->Add(position); 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Records the action. This will be available as a time-stamped stream 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // server-side and can be used to compute time-to-long-dwell. 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::RecordAction(base::UserMetricsAction("MostVisited_Clicked")); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// content::WebContentsObserver override 2199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid NTPUserDataLogger::NavigationEntryCommitted( 2209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch const content::LoadCommittedDetails& load_details) { 2219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch if (!load_details.previous_url.is_valid()) 2229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch return; 2239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (search::MatchesOriginAndPath(ntp_url_, load_details.previous_url)) { 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EmitNtpStatistics(); 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch} 228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)NTPUserDataLogger::NTPUserDataLogger(content::WebContents* contents) 230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) : content::WebContentsObserver(contents), 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) has_server_side_suggestions_(false), 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_tiles_(0), 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_tiles_(0), 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tiles_(0), 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) number_of_external_tiles_(0), 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_thumbnail_errors_(0), 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_gray_tile_fallbacks_(0), 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_external_tile_fallbacks_(0), 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) number_of_mouseovers_(0) { 240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 241