ntp_user_data_logger.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/search/search.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/search_urls.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/url_constants.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/public/browser/navigation_details.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/web_contents.h"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Used to track if suggestions were issued by the client or the server.
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)enum SuggestionsType {
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CLIENT_SIDE = 0,
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SERVER_SIDE = 1,
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SUGGESTIONS_TYPE_COUNT = 2
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochDEFINE_WEB_CONTENTS_USER_DATA_KEY(NTPUserDataLogger);
279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
289ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben MurdochNTPUserDataLogger::~NTPUserDataLogger() {}
299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)NTPUserDataLogger* NTPUserDataLogger::GetOrCreateFromWebContents(
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      content::WebContents* content) {
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Calling CreateForWebContents when an instance is already attached has no
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // effect, so we can do this.
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NTPUserDataLogger::CreateForWebContents(content);
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  NTPUserDataLogger* logger = NTPUserDataLogger::FromWebContents(content);
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // We record the URL of this NTP in order to identify navigations that
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // originate from it. We use the NavigationController's URL since it might
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // differ from the WebContents URL which is usually chrome://newtab/.
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const content::NavigationEntry* entry =
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      content->GetController().GetVisibleEntry();
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (entry)
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    logger->ntp_url_ = entry->GetURL();
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return logger;
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NTPUserDataLogger::EmitThumbnailErrorRate() {
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK_LE(number_of_thumbnail_errors_, number_of_thumbnail_attempts_);
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (number_of_thumbnail_attempts_ != 0) {
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UMA_HISTOGRAM_PERCENTAGE(
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "NewTabPage.ThumbnailErrorRate",
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      GetPercentError(number_of_thumbnail_errors_,
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      number_of_thumbnail_attempts_));
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK_LE(number_of_fallback_thumbnails_used_,
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            number_of_fallback_thumbnails_requested_);
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (number_of_fallback_thumbnails_requested_ != 0) {
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    UMA_HISTOGRAM_PERCENTAGE(
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        "NewTabPage.ThumbnailFallbackRate",
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        GetPercentError(number_of_fallback_thumbnails_used_,
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        number_of_fallback_thumbnails_requested_));
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  number_of_thumbnail_attempts_ = 0;
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  number_of_thumbnail_errors_ = 0;
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  number_of_fallback_thumbnails_requested_ = 0;
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  number_of_fallback_thumbnails_used_ = 0;
699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NTPUserDataLogger::EmitNtpStatistics() {
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("NewTabPage.NumberOfMouseOvers", number_of_mouseovers_);
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  number_of_mouseovers_ = 0;
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("NewTabPage.NumberOfExternalTiles",
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       number_of_external_tiles_);
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  number_of_external_tiles_ = 0;
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION(
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "NewTabPage.SuggestionsType",
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      server_side_suggestions_ ? SERVER_SIDE : CLIENT_SIDE,
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SUGGESTIONS_TYPE_COUNT);
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  server_side_suggestions_ = false;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NTPUserDataLogger::LogEvent(NTPLoggingEventType event) {
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  switch (event) {
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case NTP_MOUSEOVER:
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      number_of_mouseovers_++;
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      break;
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case NTP_THUMBNAIL_ATTEMPT:
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      number_of_thumbnail_attempts_++;
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      break;
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case NTP_THUMBNAIL_ERROR:
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      number_of_thumbnail_errors_++;
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      break;
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case NTP_FALLBACK_THUMBNAIL_REQUESTED:
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      number_of_fallback_thumbnails_requested_++;
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case NTP_FALLBACK_THUMBNAIL_USED:
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      number_of_fallback_thumbnails_used_++;
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case NTP_SERVER_SIDE_SUGGESTION:
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      server_side_suggestions_ = true;
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      break;
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case NTP_CLIENT_SIDE_SUGGESTION:
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // We should never get a mix of server and client side suggestions,
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // otherwise there could be a race condition depending on the order in
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      // which the iframes call this method.
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      DCHECK(!server_side_suggestions_);
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    break;
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case NTP_EXTERNAL_TILE:
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      number_of_external_tiles_++;
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      break;
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    default:
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      NOTREACHED();
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// content::WebContentsObserver override
1199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochvoid NTPUserDataLogger::NavigationEntryCommitted(
1209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    const content::LoadCommittedDetails& load_details) {
1219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!load_details.previous_url.is_valid())
1229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    return;
1239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (search::MatchesOriginAndPath(ntp_url_, load_details.previous_url)) {
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EmitNtpStatistics();
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Only log thumbnail error rates for Instant NTP pages, as we do not have
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // this data for non-Instant NTPs.
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (ntp_url_ != GURL(chrome::kChromeUINewTabURL))
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      EmitThumbnailErrorRate();
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1319ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch}
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)NTPUserDataLogger::NTPUserDataLogger(content::WebContents* contents)
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : content::WebContentsObserver(contents),
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      number_of_mouseovers_(0),
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      number_of_thumbnail_attempts_(0),
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      number_of_thumbnail_errors_(0),
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      number_of_fallback_thumbnails_requested_(0),
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      number_of_fallback_thumbnails_used_(0),
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      number_of_external_tiles_(0),
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      server_side_suggestions_(false) {
142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)size_t NTPUserDataLogger::GetPercentError(size_t errors, size_t events) const {
145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return (100 * errors) / events;
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
147