Chromium Code Reviews| Index: chrome/browser/shell_integration.cc |
| diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc |
| index d8c5b8dcf38352aab3c7937c875c333fd463e3f6..61dc27a2fd400966f802aa7be414101710487110 100644 |
| --- a/chrome/browser/shell_integration.cc |
| +++ b/chrome/browser/shell_integration.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/metrics/histogram_macros.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/string_util.h" |
| +#include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/threading/thread_restrictions.h" |
| #include "base/timer/timer.h" |
| @@ -35,6 +36,43 @@ namespace { |
| const struct ShellIntegration::AppModeInfo* gAppModeInfo = nullptr; |
| +// Returns true if the duration should be reported to UMA for |result|. |
| +bool ShouldReportDurationForResult( |
| + ShellIntegration::DefaultWebClientWorker::AttemptResult result) { |
| + using AttemptResult = ShellIntegration::DefaultWebClientWorker::AttemptResult; |
| + |
| + return result == AttemptResult::SUCCESS || result == AttemptResult::FAILURE || |
| + result == AttemptResult::ABANDONED || result == AttemptResult::RETRY; |
| +} |
| + |
| +// Returns a string based on |result| used for UMA reports. |
| +const char* AttemptResultToString( |
| + ShellIntegration::DefaultWebClientWorker::AttemptResult result) { |
| + using AttemptResult = ShellIntegration::DefaultWebClientWorker::AttemptResult; |
| + |
| + switch (result) { |
| + case AttemptResult::SUCCESS: |
| + return "Success"; |
| + case AttemptResult::ALREADY_DEFAULT: |
| + return "AlreadyDefault"; |
| + case AttemptResult::FAILURE: |
| + return "Failure"; |
| + case AttemptResult::ABANDONED: |
| + return "Abandoned"; |
| + case AttemptResult::LAUNCH_FAILURE: |
| + return "LaunchFailure"; |
| + case AttemptResult::OTHER_WORKER: |
| + return "OtherWorker"; |
| + case AttemptResult::RETRY: |
| + return "Retry"; |
| + case AttemptResult::NO_ERRORS_NOT_DEFAULT: |
| + return "NoErrorsNotDefault"; |
| + default: |
|
grt (UTC plus 2)
2015/11/10 20:04:30
leave out the "default" case so that the compiler
Patrick Monette
2015/11/11 22:03:35
Done.
|
| + NOTREACHED(); |
| + return ""; |
| + } |
| +} |
| + |
| } // namespace |
| #if !defined(OS_WIN) |
| @@ -176,12 +214,12 @@ ShellIntegration::DefaultWebClientWorker::DefaultWebClientWorker( |
| : observer_(observer) {} |
| void ShellIntegration::DefaultWebClientWorker::StartCheckIsDefault() { |
| - if (observer_) { |
| + if (observer_) |
| observer_->SetDefaultWebClientUIState(STATE_PROCESSING); |
| - BrowserThread::PostTask( |
| - BrowserThread::FILE, FROM_HERE, |
| - base::Bind(&DefaultWebClientWorker::CheckIsDefault, this)); |
| - } |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&DefaultWebClientWorker::CheckIsDefault, this)); |
| } |
| void ShellIntegration::DefaultWebClientWorker::StartSetAsDefault() { |
| @@ -196,15 +234,14 @@ void ShellIntegration::DefaultWebClientWorker::StartSetAsDefault() { |
| } |
| set_as_default_in_progress_ = true; |
| - bool interactive_permitted = false; |
| + bool interactive_permitted = true; |
| if (observer_) { |
| observer_->SetDefaultWebClientUIState(STATE_PROCESSING); |
| interactive_permitted = observer_->IsInteractiveSetDefaultPermitted(); |
| - |
| - // The initialization is only useful when there is an observer. |
| - set_as_default_initialized_ = InitializeSetAsDefault(); |
| } |
| + set_as_default_initialized_ = InitializeSetAsDefault(); |
| + |
| // Remember the start time. |
| start_time_ = base::TimeTicks::Now(); |
| @@ -237,6 +274,15 @@ void ShellIntegration::DefaultWebClientWorker::OnCheckIsDefaultComplete( |
| DefaultWebClientState state) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| UpdateUI(state); |
| + |
| + if (check_default_should_report_success_) { |
| + check_default_should_report_success_ = false; |
| + |
| + ReportAttemptResult(state == DefaultWebClientState::IS_DEFAULT |
| + ? AttemptResult::SUCCESS |
| + : AttemptResult::NO_ERRORS_NOT_DEFAULT); |
| + } |
| + |
| // The worker has finished everything it needs to do, so free the observer |
| // if we own it. |
| if (observer_ && observer_->IsOwnedByWorker()) { |
| @@ -250,7 +296,7 @@ void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete( |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| // Hold on to a reference because if this was called via the default browser |
| // callback in StartupBrowserCreator, clearing the callback in |
| - // FinalizeSetAsDefault would otherwise remove the last reference and delete |
| + // FinalizeSetAsDefault() would otherwise remove the last reference and delete |
| // us in the middle of this function. |
| scoped_refptr<DefaultWebClientWorker> scoped_ref(this); |
| @@ -267,7 +313,11 @@ void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete( |
| observer_->OnSetAsDefaultConcluded(succeeded); |
| } |
| - ReportAttemptResult(result); |
| + // Report failures here. Successes are reported in |
| + // OnCheckIsDefaultComplete() after checking that the change is verified. |
| + check_default_should_report_success_ = result == AttemptResult::SUCCESS; |
| + if (!check_default_should_report_success_) |
| + ReportAttemptResult(result); |
| // Start the default browser check which will notify the observer as to |
| // whether Chrome is really the default browser. This is needed because |
| @@ -280,35 +330,27 @@ void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete( |
| void ShellIntegration::DefaultWebClientWorker::ReportAttemptResult( |
| AttemptResult result) { |
| - if (!ShouldReportAttemptResults()) |
| - return; |
| - |
| - UMA_HISTOGRAM_ENUMERATION("DefaultBrowser.AsyncSetAsDefault.Result", result, |
| - AttemptResult::NUM_ATTEMPT_RESULT_TYPES); |
| - |
| - switch (result) { |
| - case SUCCESS: |
| - UMA_HISTOGRAM_MEDIUM_TIMES( |
| - "DefaultBrowser.AsyncSetAsDefault.Duration_Success", |
| - base::TimeTicks::Now() - start_time_); |
| - break; |
| - case FAILURE: |
| - UMA_HISTOGRAM_MEDIUM_TIMES( |
| - "DefaultBrowser.AsyncSetAsDefault.Duration_Failure", |
| - base::TimeTicks::Now() - start_time_); |
| - break; |
| - case ABANDONED: |
| - UMA_HISTOGRAM_MEDIUM_TIMES( |
| - "DefaultBrowser.AsyncSetAsDefault.Duration_Abandoned", |
| - base::TimeTicks::Now() - start_time_); |
| - break; |
| - case RETRY: |
| - UMA_HISTOGRAM_MEDIUM_TIMES( |
| - "DefaultBrowser.AsyncSetAsDefault.Duration_Retry", |
| - base::TimeTicks::Now() - start_time_); |
| - break; |
| - default: |
| - break; |
| + const char* histogram_prefix = GetHistogramPrefix(); |
| + |
| + // Report result. |
| + base::HistogramBase* result_histogram = base::LinearHistogram::FactoryGet( |
| + base::StringPrintf("%s.Result", histogram_prefix), 1, |
| + AttemptResult::NUM_ATTEMPT_RESULT_TYPES, |
| + AttemptResult::NUM_ATTEMPT_RESULT_TYPES + 1, |
| + base::HistogramBase::kUmaTargetedHistogramFlag); |
| + |
| + result_histogram->Add(result); |
|
grt (UTC plus 2)
2015/11/10 20:04:30
nit: do away with the local variable and move "->A
Patrick Monette
2015/11/11 22:03:35
Done.
|
| + |
| + // Report asynchronous duration. |
| + if (IsSetAsDefaultAsynchronous() && ShouldReportDurationForResult(result)) { |
| + base::HistogramBase* duration_histogram = base::Histogram::FactoryTimeGet( |
| + base::StringPrintf("%s.AsyncDuration_%s", histogram_prefix, |
| + AttemptResultToString(result)), |
| + base::TimeDelta::FromMilliseconds(10), base::TimeDelta::FromMinutes(3), |
| + 50, base::HistogramBase::kUmaTargetedHistogramFlag); |
| + |
| + const base::TimeDelta delta = base::TimeTicks::Now() - start_time_; |
| + duration_histogram->AddTime(delta); |
|
grt (UTC plus 2)
2015/11/10 20:04:30
same comment here
Patrick Monette
2015/11/11 22:03:35
Done.
|
| } |
| } |
| @@ -318,13 +360,6 @@ bool ShellIntegration::DefaultWebClientWorker::InitializeSetAsDefault() { |
| void ShellIntegration::DefaultWebClientWorker::FinalizeSetAsDefault() {} |
| -#if !defined(OS_WIN) |
| -// static |
| -bool ShellIntegration::DefaultWebClientWorker::ShouldReportAttemptResults() { |
| - return false; |
| -} |
| -#endif // !defined(OS_WIN) |
| - |
| void ShellIntegration::DefaultWebClientWorker::UpdateUI( |
| DefaultWebClientState state) { |
| if (observer_) { |