Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(661)

Side by Side Diff: chrome/browser/shell_integration.cc

Issue 1426663005: Make the histograms for setting the default browser consistent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed name collision Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/shell_integration.h ('k') | chrome/browser/shell_integration_win.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/shell_integration.h" 5 #include "chrome/browser/shell_integration.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
11 #include "base/prefs/pref_service.h" 11 #include "base/prefs/pref_service.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "base/strings/stringprintf.h"
13 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
14 #include "base/threading/thread_restrictions.h" 15 #include "base/threading/thread_restrictions.h"
15 #include "base/timer/timer.h" 16 #include "base/timer/timer.h"
16 #include "chrome/browser/policy/policy_path_parser.h" 17 #include "chrome/browser/policy/policy_path_parser.h"
17 #include "chrome/common/chrome_paths.h" 18 #include "chrome/common/chrome_paths.h"
18 #include "chrome/common/chrome_switches.h" 19 #include "chrome/common/chrome_switches.h"
19 #include "components/version_info/version_info.h" 20 #include "components/version_info/version_info.h"
20 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
21 22
22 #if defined(OS_CHROMEOS) 23 #if defined(OS_CHROMEOS)
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 170
170 /////////////////////////////////////////////////////////////////////////////// 171 ///////////////////////////////////////////////////////////////////////////////
171 // ShellIntegration::DefaultWebClientWorker 172 // ShellIntegration::DefaultWebClientWorker
172 // 173 //
173 174
174 ShellIntegration::DefaultWebClientWorker::DefaultWebClientWorker( 175 ShellIntegration::DefaultWebClientWorker::DefaultWebClientWorker(
175 DefaultWebClientObserver* observer) 176 DefaultWebClientObserver* observer)
176 : observer_(observer) {} 177 : observer_(observer) {}
177 178
178 void ShellIntegration::DefaultWebClientWorker::StartCheckIsDefault() { 179 void ShellIntegration::DefaultWebClientWorker::StartCheckIsDefault() {
179 if (observer_) { 180 if (observer_)
180 observer_->SetDefaultWebClientUIState(STATE_PROCESSING); 181 observer_->SetDefaultWebClientUIState(STATE_PROCESSING);
181 BrowserThread::PostTask( 182
182 BrowserThread::FILE, FROM_HERE, 183 BrowserThread::PostTask(
183 base::Bind(&DefaultWebClientWorker::CheckIsDefault, this)); 184 BrowserThread::FILE, FROM_HERE,
184 } 185 base::Bind(&DefaultWebClientWorker::CheckIsDefault, this));
185 } 186 }
186 187
187 void ShellIntegration::DefaultWebClientWorker::StartSetAsDefault() { 188 void ShellIntegration::DefaultWebClientWorker::StartSetAsDefault() {
188 // Cancel the already running process if another start is requested. 189 // Cancel the already running process if another start is requested.
189 if (set_as_default_in_progress_) { 190 if (set_as_default_in_progress_) {
190 if (set_as_default_initialized_) { 191 if (set_as_default_initialized_) {
191 FinalizeSetAsDefault(); 192 FinalizeSetAsDefault();
192 set_as_default_initialized_ = false; 193 set_as_default_initialized_ = false;
193 } 194 }
194 195
195 ReportAttemptResult(AttemptResult::RETRY); 196 ReportAttemptResult(AttemptResult::RETRY);
196 } 197 }
197 198
198 set_as_default_in_progress_ = true; 199 set_as_default_in_progress_ = true;
199 bool interactive_permitted = false; 200 bool interactive_permitted = true;
200 if (observer_) { 201 if (observer_) {
201 observer_->SetDefaultWebClientUIState(STATE_PROCESSING); 202 observer_->SetDefaultWebClientUIState(STATE_PROCESSING);
202 interactive_permitted = observer_->IsInteractiveSetDefaultPermitted(); 203 interactive_permitted = observer_->IsInteractiveSetDefaultPermitted();
204 }
203 205
204 // The initialization is only useful when there is an observer. 206 set_as_default_initialized_ = InitializeSetAsDefault();
205 set_as_default_initialized_ = InitializeSetAsDefault();
206 }
207 207
208 // Remember the start time. 208 // Remember the start time.
209 start_time_ = base::TimeTicks::Now(); 209 start_time_ = base::TimeTicks::Now();
210 210
211 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 211 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
212 base::Bind(&DefaultWebClientWorker::SetAsDefault, 212 base::Bind(&DefaultWebClientWorker::SetAsDefault,
213 this, interactive_permitted)); 213 this, interactive_permitted));
214 } 214 }
215 215
216 void ShellIntegration::DefaultWebClientWorker::ObserverDestroyed() { 216 void ShellIntegration::DefaultWebClientWorker::ObserverDestroyed() {
(...skipping 13 matching lines...) Expand all
230 230
231 /////////////////////////////////////////////////////////////////////////////// 231 ///////////////////////////////////////////////////////////////////////////////
232 // DefaultWebClientWorker, private: 232 // DefaultWebClientWorker, private:
233 233
234 ShellIntegration::DefaultWebClientWorker::~DefaultWebClientWorker() {} 234 ShellIntegration::DefaultWebClientWorker::~DefaultWebClientWorker() {}
235 235
236 void ShellIntegration::DefaultWebClientWorker::OnCheckIsDefaultComplete( 236 void ShellIntegration::DefaultWebClientWorker::OnCheckIsDefaultComplete(
237 DefaultWebClientState state) { 237 DefaultWebClientState state) {
238 DCHECK_CURRENTLY_ON(BrowserThread::UI); 238 DCHECK_CURRENTLY_ON(BrowserThread::UI);
239 UpdateUI(state); 239 UpdateUI(state);
240
241 if (check_default_should_report_success_) {
242 check_default_should_report_success_ = false;
243
244 ReportAttemptResult(state == DefaultWebClientState::IS_DEFAULT
245 ? AttemptResult::SUCCESS
246 : AttemptResult::NO_ERRORS_NOT_DEFAULT);
247 }
248
240 // The worker has finished everything it needs to do, so free the observer 249 // The worker has finished everything it needs to do, so free the observer
241 // if we own it. 250 // if we own it.
242 if (observer_ && observer_->IsOwnedByWorker()) { 251 if (observer_ && observer_->IsOwnedByWorker()) {
243 delete observer_; 252 delete observer_;
244 observer_ = nullptr; 253 observer_ = nullptr;
245 } 254 }
246 } 255 }
247 256
248 void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete( 257 void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete(
249 AttemptResult result) { 258 AttemptResult result) {
250 DCHECK_CURRENTLY_ON(BrowserThread::UI); 259 DCHECK_CURRENTLY_ON(BrowserThread::UI);
251 // Hold on to a reference because if this was called via the default browser 260 // Hold on to a reference because if this was called via the default browser
252 // callback in StartupBrowserCreator, clearing the callback in 261 // callback in StartupBrowserCreator, clearing the callback in
253 // FinalizeSetAsDefault would otherwise remove the last reference and delete 262 // FinalizeSetAsDefault() would otherwise remove the last reference and delete
254 // us in the middle of this function. 263 // us in the middle of this function.
255 scoped_refptr<DefaultWebClientWorker> scoped_ref(this); 264 scoped_refptr<DefaultWebClientWorker> scoped_ref(this);
256 265
257 if (set_as_default_in_progress_) { 266 if (set_as_default_in_progress_) {
258 set_as_default_in_progress_ = false; 267 set_as_default_in_progress_ = false;
259 268
260 if (set_as_default_initialized_) { 269 if (set_as_default_initialized_) {
261 FinalizeSetAsDefault(); 270 FinalizeSetAsDefault();
262 set_as_default_initialized_ = false; 271 set_as_default_initialized_ = false;
263 } 272 }
264 if (observer_) { 273 if (observer_) {
265 bool succeeded = result == AttemptResult::SUCCESS || 274 bool succeeded = result == AttemptResult::SUCCESS ||
266 result == AttemptResult::ALREADY_DEFAULT; 275 result == AttemptResult::ALREADY_DEFAULT;
267 observer_->OnSetAsDefaultConcluded(succeeded); 276 observer_->OnSetAsDefaultConcluded(succeeded);
268 } 277 }
269 278
270 ReportAttemptResult(result); 279 // Report failures here. Successes are reported in
280 // OnCheckIsDefaultComplete() after checking that the change is verified.
281 check_default_should_report_success_ = result == AttemptResult::SUCCESS;
282 if (!check_default_should_report_success_)
283 ReportAttemptResult(result);
271 284
272 // Start the default browser check which will notify the observer as to 285 // Start the default browser check which will notify the observer as to
273 // whether Chrome is really the default browser. This is needed because 286 // whether Chrome is really the default browser. This is needed because
274 // detecting that the process was successful is not 100% sure. 287 // detecting that the process was successful is not 100% sure.
275 // For example, on Windows 10+, the user might have unchecked the "Always 288 // For example, on Windows 10+, the user might have unchecked the "Always
276 // use this app" checkbox which can't be detected. 289 // use this app" checkbox which can't be detected.
277 StartCheckIsDefault(); 290 StartCheckIsDefault();
278 } 291 }
279 } 292 }
280 293
281 void ShellIntegration::DefaultWebClientWorker::ReportAttemptResult( 294 void ShellIntegration::DefaultWebClientWorker::ReportAttemptResult(
282 AttemptResult result) { 295 AttemptResult result) {
283 if (!ShouldReportAttemptResults()) 296 const char* histogram_prefix = GetHistogramPrefix();
284 return;
285 297
286 UMA_HISTOGRAM_ENUMERATION("DefaultBrowser.AsyncSetAsDefault.Result", result, 298 // Report result.
287 AttemptResult::NUM_ATTEMPT_RESULT_TYPES); 299 base::LinearHistogram::FactoryGet(
300 base::StringPrintf("%s.SetDefaultResult", histogram_prefix), 1,
301 AttemptResult::NUM_ATTEMPT_RESULT_TYPES,
302 AttemptResult::NUM_ATTEMPT_RESULT_TYPES + 1,
303 base::HistogramBase::kUmaTargetedHistogramFlag)
304 ->Add(result);
288 305
289 switch (result) { 306 // Report asynchronous duration.
290 case SUCCESS: 307 if (IsSetAsDefaultAsynchronous() && ShouldReportDurationForResult(result)) {
291 UMA_HISTOGRAM_MEDIUM_TIMES( 308 base::Histogram::FactoryTimeGet(
292 "DefaultBrowser.AsyncSetAsDefault.Duration_Success", 309 base::StringPrintf("%s.SetDefaultAsyncDuration_%s", histogram_prefix,
293 base::TimeTicks::Now() - start_time_); 310 AttemptResultToString(result)),
294 break; 311 base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(3),
295 case FAILURE: 312 50, base::HistogramBase::kUmaTargetedHistogramFlag)
296 UMA_HISTOGRAM_MEDIUM_TIMES( 313 ->AddTime(base::TimeTicks::Now() - start_time_);
297 "DefaultBrowser.AsyncSetAsDefault.Duration_Failure",
298 base::TimeTicks::Now() - start_time_);
299 break;
300 case ABANDONED:
301 UMA_HISTOGRAM_MEDIUM_TIMES(
302 "DefaultBrowser.AsyncSetAsDefault.Duration_Abandoned",
303 base::TimeTicks::Now() - start_time_);
304 break;
305 case RETRY:
306 UMA_HISTOGRAM_MEDIUM_TIMES(
307 "DefaultBrowser.AsyncSetAsDefault.Duration_Retry",
308 base::TimeTicks::Now() - start_time_);
309 break;
310 default:
311 break;
312 } 314 }
313 } 315 }
314 316
315 bool ShellIntegration::DefaultWebClientWorker::InitializeSetAsDefault() { 317 bool ShellIntegration::DefaultWebClientWorker::InitializeSetAsDefault() {
316 return true; 318 return true;
317 } 319 }
318 320
319 void ShellIntegration::DefaultWebClientWorker::FinalizeSetAsDefault() {} 321 void ShellIntegration::DefaultWebClientWorker::FinalizeSetAsDefault() {}
320 322
321 #if !defined(OS_WIN)
322 // static
323 bool ShellIntegration::DefaultWebClientWorker::ShouldReportAttemptResults() {
324 return false;
325 }
326 #endif // !defined(OS_WIN)
327
328 void ShellIntegration::DefaultWebClientWorker::UpdateUI( 323 void ShellIntegration::DefaultWebClientWorker::UpdateUI(
329 DefaultWebClientState state) { 324 DefaultWebClientState state) {
330 if (observer_) { 325 if (observer_) {
331 switch (state) { 326 switch (state) {
332 case NOT_DEFAULT: 327 case NOT_DEFAULT:
333 observer_->SetDefaultWebClientUIState(STATE_NOT_DEFAULT); 328 observer_->SetDefaultWebClientUIState(STATE_NOT_DEFAULT);
334 break; 329 break;
335 case IS_DEFAULT: 330 case IS_DEFAULT:
336 observer_->SetDefaultWebClientUIState(STATE_IS_DEFAULT); 331 observer_->SetDefaultWebClientUIState(STATE_IS_DEFAULT);
337 break; 332 break;
338 case UNKNOWN_DEFAULT: 333 case UNKNOWN_DEFAULT:
339 observer_->SetDefaultWebClientUIState(STATE_UNKNOWN); 334 observer_->SetDefaultWebClientUIState(STATE_UNKNOWN);
340 break; 335 break;
341 default: 336 default:
342 break; 337 break;
343 } 338 }
344 } 339 }
345 } 340 }
346 341
342 // static
343 bool ShellIntegration::DefaultWebClientWorker::ShouldReportDurationForResult(
344 AttemptResult result) {
345 return result == SUCCESS || result == FAILURE || result == ABANDONED ||
346 result == RETRY;
347 }
348
349 // static
350 const char* ShellIntegration::DefaultWebClientWorker::AttemptResultToString(
351 AttemptResult result) {
352 switch (result) {
353 case SUCCESS:
354 return "Success";
355 case ALREADY_DEFAULT:
356 return "AlreadyDefault";
357 case FAILURE:
358 return "Failure";
359 case ABANDONED:
360 return "Abandoned";
361 case LAUNCH_FAILURE:
362 return "LaunchFailure";
363 case OTHER_WORKER:
364 return "OtherWorker";
365 case RETRY:
366 return "Retry";
367 case NO_ERRORS_NOT_DEFAULT:
368 return "NoErrorsNotDefault";
369 case NUM_ATTEMPT_RESULT_TYPES:
370 break;
371 }
372 NOTREACHED();
373 return "";
374 }
375
347 /////////////////////////////////////////////////////////////////////////////// 376 ///////////////////////////////////////////////////////////////////////////////
348 // ShellIntegration::DefaultBrowserWorker 377 // ShellIntegration::DefaultBrowserWorker
349 // 378 //
350 379
351 ShellIntegration::DefaultBrowserWorker::DefaultBrowserWorker( 380 ShellIntegration::DefaultBrowserWorker::DefaultBrowserWorker(
352 DefaultWebClientObserver* observer) 381 DefaultWebClientObserver* observer)
353 : DefaultWebClientWorker(observer) { 382 : DefaultWebClientWorker(observer) {
354 } 383 }
355 384
356 ShellIntegration::DefaultBrowserWorker::~DefaultBrowserWorker() {} 385 ShellIntegration::DefaultBrowserWorker::~DefaultBrowserWorker() {}
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 NOTREACHED(); 430 NOTREACHED();
402 break; 431 break;
403 #endif 432 #endif
404 } 433 }
405 BrowserThread::PostTask( 434 BrowserThread::PostTask(
406 BrowserThread::UI, FROM_HERE, 435 BrowserThread::UI, FROM_HERE,
407 base::Bind(&DefaultBrowserWorker::OnSetAsDefaultAttemptComplete, this, 436 base::Bind(&DefaultBrowserWorker::OnSetAsDefaultAttemptComplete, this,
408 result)); 437 result));
409 } 438 }
410 439
440 const char* ShellIntegration::DefaultBrowserWorker::GetHistogramPrefix() {
441 return "DefaultBrowser";
442 }
443
411 /////////////////////////////////////////////////////////////////////////////// 444 ///////////////////////////////////////////////////////////////////////////////
412 // ShellIntegration::DefaultProtocolClientWorker 445 // ShellIntegration::DefaultProtocolClientWorker
413 // 446 //
414 447
415 ShellIntegration::DefaultProtocolClientWorker::DefaultProtocolClientWorker( 448 ShellIntegration::DefaultProtocolClientWorker::DefaultProtocolClientWorker(
416 DefaultWebClientObserver* observer, const std::string& protocol) 449 DefaultWebClientObserver* observer, const std::string& protocol)
417 : DefaultWebClientWorker(observer), 450 : DefaultWebClientWorker(observer),
418 protocol_(protocol) { 451 protocol_(protocol) {
419 } 452 }
420 453
(...skipping 29 matching lines...) Expand all
450 break; 483 break;
451 case SET_DEFAULT_ASYNCHRONOUS: 484 case SET_DEFAULT_ASYNCHRONOUS:
452 NOTREACHED(); 485 NOTREACHED();
453 break; 486 break;
454 } 487 }
455 BrowserThread::PostTask( 488 BrowserThread::PostTask(
456 BrowserThread::UI, FROM_HERE, 489 BrowserThread::UI, FROM_HERE,
457 base::Bind(&DefaultProtocolClientWorker::OnSetAsDefaultAttemptComplete, 490 base::Bind(&DefaultProtocolClientWorker::OnSetAsDefaultAttemptComplete,
458 this, result)); 491 this, result));
459 } 492 }
493
494 const char*
495 ShellIntegration::DefaultProtocolClientWorker::GetHistogramPrefix() {
496 return "DefaultProtocolClient";
497 }
OLDNEW
« no previous file with comments | « chrome/browser/shell_integration.h ('k') | chrome/browser/shell_integration_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698