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/ui/webui/ntp/ntp_user_data_logger.h" | 5 #include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 // originate from it. We use the NavigationController's URL since it might | 102 // originate from it. We use the NavigationController's URL since it might |
103 // differ from the WebContents URL which is usually chrome://newtab/. | 103 // differ from the WebContents URL which is usually chrome://newtab/. |
104 const content::NavigationEntry* entry = | 104 const content::NavigationEntry* entry = |
105 content->GetController().GetVisibleEntry(); | 105 content->GetController().GetVisibleEntry(); |
106 if (entry) | 106 if (entry) |
107 logger->ntp_url_ = entry->GetURL(); | 107 logger->ntp_url_ = entry->GetURL(); |
108 | 108 |
109 return logger; | 109 return logger; |
110 } | 110 } |
111 | 111 |
112 void NTPUserDataLogger::EmitNtpStatistics() { | |
113 // We only send statistics once per page. | |
114 // And we don't send if there are no tiles recorded. | |
115 if (has_emitted_ || !number_of_tiles_) | |
116 return; | |
117 | |
118 // LoadTime only gets update once per page, so we don't have it on reloads. | |
119 if (load_time_ > base::TimeDelta::FromMilliseconds(0)) { | |
120 logLoadTimeHistogram("NewTabPage.LoadTime", load_time_); | |
121 | |
122 // Split between ML and MV. | |
123 std::string type = has_server_side_suggestions_ ? | |
124 "MostLikely" : "MostVisited"; | |
125 logLoadTimeHistogram("NewTabPage.LoadTime." + type, load_time_); | |
126 // Split between Web and Local. | |
127 std::string source = ntp_url_.SchemeIsHTTPOrHTTPS() ? "Web" : "LocalNTP"; | |
128 logLoadTimeHistogram("NewTabPage.LoadTime." + source, load_time_); | |
129 | |
130 // Split between Startup and non-startup. | |
131 std::string status = during_startup_ ? "Startup" : "NewTab"; | |
132 logLoadTimeHistogram("NewTabPage.LoadTime." + status, load_time_); | |
133 | |
134 load_time_ = base::TimeDelta::FromMilliseconds(0); | |
135 } | |
136 UMA_HISTOGRAM_ENUMERATION( | |
137 "NewTabPage.SuggestionsType", | |
138 has_server_side_suggestions_ ? SERVER_SIDE : CLIENT_SIDE, | |
139 SUGGESTIONS_TYPE_COUNT); | |
140 has_server_side_suggestions_ = false; | |
141 has_client_side_suggestions_ = false; | |
142 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfTiles", number_of_tiles_); | |
143 number_of_tiles_ = 0; | |
144 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfThumbnailTiles", | |
145 number_of_thumbnail_tiles_); | |
146 number_of_thumbnail_tiles_ = 0; | |
147 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfGrayTiles", | |
148 number_of_gray_tiles_); | |
149 number_of_gray_tiles_ = 0; | |
150 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfExternalTiles", | |
151 number_of_external_tiles_); | |
152 number_of_external_tiles_ = 0; | |
153 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfThumbnailErrors", | |
154 number_of_thumbnail_errors_); | |
155 number_of_thumbnail_errors_ = 0; | |
156 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfGrayTileFallbacks", | |
157 number_of_gray_tile_fallbacks_); | |
158 number_of_gray_tile_fallbacks_ = 0; | |
159 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfExternalTileFallbacks", | |
160 number_of_external_tile_fallbacks_); | |
161 number_of_external_tile_fallbacks_ = 0; | |
162 has_emitted_ = true; | |
163 during_startup_ = false; | |
164 } | |
165 | |
166 void NTPUserDataLogger::LogEvent(NTPLoggingEventType event, | 112 void NTPUserDataLogger::LogEvent(NTPLoggingEventType event, |
167 base::TimeDelta time) { | 113 base::TimeDelta time) { |
168 switch (event) { | 114 switch (event) { |
169 // It is possible that our page gets update with a different set of | 115 // It is possible that our page gets update with a different set of |
170 // suggestions if the NTP is left open enough time. | 116 // suggestions if the NTP is left open enough time. |
171 // In either case, we want to flush our stats before recounting again. | 117 // In either case, we want to flush our stats before recounting again. |
172 case NTP_SERVER_SIDE_SUGGESTION: | 118 case NTP_SERVER_SIDE_SUGGESTION: |
173 if (has_client_side_suggestions_) | 119 if (has_client_side_suggestions_) |
174 EmitNtpStatistics(); | 120 EmitNtpStatistics(EmitReason::INTERNAL_FLUSH); |
175 has_server_side_suggestions_ = true; | 121 has_server_side_suggestions_ = true; |
176 break; | 122 break; |
177 case NTP_CLIENT_SIDE_SUGGESTION: | 123 case NTP_CLIENT_SIDE_SUGGESTION: |
178 if (has_server_side_suggestions_) | 124 if (has_server_side_suggestions_) |
179 EmitNtpStatistics(); | 125 EmitNtpStatistics(EmitReason::INTERNAL_FLUSH); |
180 has_client_side_suggestions_ = true; | 126 has_client_side_suggestions_ = true; |
181 break; | 127 break; |
182 case NTP_TILE: | 128 case NTP_TILE: |
183 number_of_tiles_++; | 129 number_of_tiles_++; |
184 break; | 130 break; |
185 case NTP_THUMBNAIL_TILE: | 131 case NTP_THUMBNAIL_TILE: |
186 number_of_thumbnail_tiles_++; | 132 number_of_thumbnail_tiles_++; |
187 break; | 133 break; |
188 case NTP_GRAY_TILE: | 134 case NTP_GRAY_TILE: |
189 number_of_gray_tiles_++; | 135 number_of_gray_tiles_++; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 content::RecordAction(base::UserMetricsAction("MostVisited_Clicked")); | 195 content::RecordAction(base::UserMetricsAction("MostVisited_Clicked")); |
250 } | 196 } |
251 | 197 |
252 // content::WebContentsObserver override | 198 // content::WebContentsObserver override |
253 void NTPUserDataLogger::NavigationEntryCommitted( | 199 void NTPUserDataLogger::NavigationEntryCommitted( |
254 const content::LoadCommittedDetails& load_details) { | 200 const content::LoadCommittedDetails& load_details) { |
255 if (!load_details.previous_url.is_valid()) | 201 if (!load_details.previous_url.is_valid()) |
256 return; | 202 return; |
257 | 203 |
258 if (search::MatchesOriginAndPath(ntp_url_, load_details.previous_url)) { | 204 if (search::MatchesOriginAndPath(ntp_url_, load_details.previous_url)) { |
259 EmitNtpStatistics(); | 205 EmitNtpStatistics(EmitReason::NAVIGATED_AWAY); |
260 } | 206 } |
261 } | 207 } |
262 | 208 |
| 209 void NTPUserDataLogger::TabDeactivated() { |
| 210 EmitNtpStatistics(EmitReason::CLOSED); |
| 211 } |
| 212 |
| 213 void NTPUserDataLogger::MostVisitedItemsChanged() { |
| 214 EmitNtpStatistics(EmitReason::MV_CHANGED); |
| 215 } |
| 216 |
263 NTPUserDataLogger::NTPUserDataLogger(content::WebContents* contents) | 217 NTPUserDataLogger::NTPUserDataLogger(content::WebContents* contents) |
264 : content::WebContentsObserver(contents), | 218 : content::WebContentsObserver(contents), |
265 has_server_side_suggestions_(false), | 219 has_server_side_suggestions_(false), |
266 has_client_side_suggestions_(false), | 220 has_client_side_suggestions_(false), |
267 number_of_tiles_(0), | 221 number_of_tiles_(0), |
268 number_of_thumbnail_tiles_(0), | 222 number_of_thumbnail_tiles_(0), |
269 number_of_gray_tiles_(0), | 223 number_of_gray_tiles_(0), |
270 number_of_external_tiles_(0), | 224 number_of_external_tiles_(0), |
271 number_of_thumbnail_errors_(0), | 225 number_of_thumbnail_errors_(0), |
272 number_of_gray_tile_fallbacks_(0), | 226 number_of_gray_tile_fallbacks_(0), |
(...skipping 13 matching lines...) Expand all Loading... |
286 browser_sync::SessionsSyncManager* sessions = | 240 browser_sync::SessionsSyncManager* sessions = |
287 static_cast<browser_sync::SessionsSyncManager*>( | 241 static_cast<browser_sync::SessionsSyncManager*>( |
288 sync->GetSessionsSyncableService()); | 242 sync->GetSessionsSyncableService()); |
289 if (sessions) { | 243 if (sessions) { |
290 sync_sessions::SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP( | 244 sync_sessions::SyncSessionsMetrics::RecordYoungestForeignTabAgeOnNTP( |
291 sessions); | 245 sessions); |
292 } | 246 } |
293 } | 247 } |
294 } | 248 } |
295 } | 249 } |
| 250 |
| 251 void NTPUserDataLogger::EmitNtpStatistics(EmitReason reason) { |
| 252 // We only send statistics once per page. |
| 253 // And we don't send if there are no tiles recorded. |
| 254 if (has_emitted_ || !number_of_tiles_) |
| 255 return; |
| 256 |
| 257 // LoadTime only gets update once per page, so we don't have it on reloads. |
| 258 if (load_time_ > base::TimeDelta::FromMilliseconds(0)) { |
| 259 logLoadTimeHistogram("NewTabPage.LoadTime", load_time_); |
| 260 |
| 261 // Split between ML and MV. |
| 262 std::string type = has_server_side_suggestions_ ? |
| 263 "MostLikely" : "MostVisited"; |
| 264 logLoadTimeHistogram("NewTabPage.LoadTime." + type, load_time_); |
| 265 // Split between Web and Local. |
| 266 std::string source = ntp_url_.SchemeIsHTTPOrHTTPS() ? "Web" : "LocalNTP"; |
| 267 logLoadTimeHistogram("NewTabPage.LoadTime." + source, load_time_); |
| 268 |
| 269 // Split between Startup and non-startup. |
| 270 std::string status = during_startup_ ? "Startup" : "NewTab"; |
| 271 logLoadTimeHistogram("NewTabPage.LoadTime." + status, load_time_); |
| 272 |
| 273 load_time_ = base::TimeDelta::FromMilliseconds(0); |
| 274 } |
| 275 UMA_HISTOGRAM_ENUMERATION( |
| 276 "NewTabPage.SuggestionsType", |
| 277 has_server_side_suggestions_ ? SERVER_SIDE : CLIENT_SIDE, |
| 278 SUGGESTIONS_TYPE_COUNT); |
| 279 has_server_side_suggestions_ = false; |
| 280 has_client_side_suggestions_ = false; |
| 281 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfTiles", number_of_tiles_); |
| 282 number_of_tiles_ = 0; |
| 283 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfThumbnailTiles", |
| 284 number_of_thumbnail_tiles_); |
| 285 number_of_thumbnail_tiles_ = 0; |
| 286 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfGrayTiles", |
| 287 number_of_gray_tiles_); |
| 288 number_of_gray_tiles_ = 0; |
| 289 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfExternalTiles", |
| 290 number_of_external_tiles_); |
| 291 number_of_external_tiles_ = 0; |
| 292 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfThumbnailErrors", |
| 293 number_of_thumbnail_errors_); |
| 294 number_of_thumbnail_errors_ = 0; |
| 295 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfGrayTileFallbacks", |
| 296 number_of_gray_tile_fallbacks_); |
| 297 number_of_gray_tile_fallbacks_ = 0; |
| 298 UMA_HISTOGRAM_NTP_TILES("NewTabPage.NumberOfExternalTileFallbacks", |
| 299 number_of_external_tile_fallbacks_); |
| 300 number_of_external_tile_fallbacks_ = 0; |
| 301 has_emitted_ = true; |
| 302 during_startup_ = false; |
| 303 } |
OLD | NEW |