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