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