Chromium Code Reviews| OLD | NEW |
|---|---|
| 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" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 169 | 169 |
| 170 /////////////////////////////////////////////////////////////////////////////// | 170 /////////////////////////////////////////////////////////////////////////////// |
| 171 // ShellIntegration::DefaultWebClientWorker | 171 // ShellIntegration::DefaultWebClientWorker |
| 172 // | 172 // |
| 173 | 173 |
| 174 ShellIntegration::DefaultWebClientWorker::DefaultWebClientWorker( | 174 ShellIntegration::DefaultWebClientWorker::DefaultWebClientWorker( |
| 175 DefaultWebClientObserver* observer) | 175 DefaultWebClientObserver* observer) |
| 176 : observer_(observer) {} | 176 : observer_(observer) {} |
| 177 | 177 |
| 178 void ShellIntegration::DefaultWebClientWorker::StartCheckIsDefault() { | 178 void ShellIntegration::DefaultWebClientWorker::StartCheckIsDefault() { |
| 179 if (observer_) { | 179 if (observer_) { |
|
grt (UTC plus 2)
2015/11/03 21:12:21
nit: omit braces
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 180 observer_->SetDefaultWebClientUIState(STATE_PROCESSING); | 180 observer_->SetDefaultWebClientUIState(STATE_PROCESSING); |
| 181 BrowserThread::PostTask( | |
| 182 BrowserThread::FILE, FROM_HERE, | |
| 183 base::Bind(&DefaultWebClientWorker::CheckIsDefault, this)); | |
| 184 } | 181 } |
| 182 BrowserThread::PostTask( | |
| 183 BrowserThread::FILE, FROM_HERE, | |
| 184 base::Bind(&DefaultWebClientWorker::CheckIsDefault, this)); | |
| 185 } | 185 } |
| 186 | 186 |
| 187 void ShellIntegration::DefaultWebClientWorker::StartSetAsDefault() { | 187 void ShellIntegration::DefaultWebClientWorker::StartSetAsDefault() { |
| 188 // Cancel the already running process if another start is requested. | 188 // Cancel the already running process if another start is requested. |
| 189 if (set_as_default_in_progress_) { | 189 if (set_as_default_in_progress_) { |
| 190 if (set_as_default_initialized_) { | 190 if (set_as_default_initialized_) { |
| 191 FinalizeSetAsDefault(); | 191 FinalizeSetAsDefault(); |
| 192 set_as_default_initialized_ = false; | 192 set_as_default_initialized_ = false; |
| 193 } | 193 } |
| 194 | 194 |
| 195 ReportAttemptResult(AttemptResult::RETRY); | 195 ReportAttemptResult(AttemptResult::RETRY); |
| 196 } | 196 } |
| 197 | 197 |
| 198 set_as_default_in_progress_ = true; | 198 set_as_default_in_progress_ = true; |
| 199 bool interactive_permitted = false; | 199 bool interactive_permitted = true; |
| 200 if (observer_) { | 200 if (observer_) { |
| 201 observer_->SetDefaultWebClientUIState(STATE_PROCESSING); | 201 observer_->SetDefaultWebClientUIState(STATE_PROCESSING); |
| 202 interactive_permitted = observer_->IsInteractiveSetDefaultPermitted(); | 202 interactive_permitted = observer_->IsInteractiveSetDefaultPermitted(); |
| 203 } | |
| 203 | 204 |
| 204 // The initialization is only useful when there is an observer. | 205 set_as_default_initialized_ = InitializeSetAsDefault(); |
| 205 set_as_default_initialized_ = InitializeSetAsDefault(); | |
| 206 } | |
| 207 | 206 |
| 208 // Remember the start time. | 207 // Remember the start time. |
| 209 start_time_ = base::TimeTicks::Now(); | 208 start_time_ = base::TimeTicks::Now(); |
| 210 | 209 |
| 211 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, | 210 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| 212 base::Bind(&DefaultWebClientWorker::SetAsDefault, | 211 base::Bind(&DefaultWebClientWorker::SetAsDefault, |
| 213 this, interactive_permitted)); | 212 this, interactive_permitted)); |
| 214 } | 213 } |
| 215 | 214 |
| 216 void ShellIntegration::DefaultWebClientWorker::ObserverDestroyed() { | 215 void ShellIntegration::DefaultWebClientWorker::ObserverDestroyed() { |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 230 | 229 |
| 231 /////////////////////////////////////////////////////////////////////////////// | 230 /////////////////////////////////////////////////////////////////////////////// |
| 232 // DefaultWebClientWorker, private: | 231 // DefaultWebClientWorker, private: |
| 233 | 232 |
| 234 ShellIntegration::DefaultWebClientWorker::~DefaultWebClientWorker() {} | 233 ShellIntegration::DefaultWebClientWorker::~DefaultWebClientWorker() {} |
| 235 | 234 |
| 236 void ShellIntegration::DefaultWebClientWorker::OnCheckIsDefaultComplete( | 235 void ShellIntegration::DefaultWebClientWorker::OnCheckIsDefaultComplete( |
| 237 DefaultWebClientState state) { | 236 DefaultWebClientState state) { |
| 238 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 237 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 239 UpdateUI(state); | 238 UpdateUI(state); |
| 239 | |
| 240 #if defined(OS_WIN) | |
|
grt (UTC plus 2)
2015/11/03 21:12:21
how about doing this for all platforms?
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 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 #endif // defined(OS_WIN) | |
| 249 | |
| 240 // The worker has finished everything it needs to do, so free the observer | 250 // The worker has finished everything it needs to do, so free the observer |
| 241 // if we own it. | 251 // if we own it. |
| 242 if (observer_ && observer_->IsOwnedByWorker()) { | 252 if (observer_ && observer_->IsOwnedByWorker()) { |
| 243 delete observer_; | 253 delete observer_; |
| 244 observer_ = nullptr; | 254 observer_ = nullptr; |
| 245 } | 255 } |
| 246 } | 256 } |
| 247 | 257 |
| 248 void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete( | 258 void ShellIntegration::DefaultWebClientWorker::OnSetAsDefaultAttemptComplete( |
| 249 AttemptResult result) { | 259 AttemptResult result) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 260 if (set_as_default_initialized_) { | 270 if (set_as_default_initialized_) { |
| 261 FinalizeSetAsDefault(); | 271 FinalizeSetAsDefault(); |
| 262 set_as_default_initialized_ = false; | 272 set_as_default_initialized_ = false; |
| 263 } | 273 } |
| 264 if (observer_) { | 274 if (observer_) { |
| 265 bool succeeded = result == AttemptResult::SUCCESS || | 275 bool succeeded = result == AttemptResult::SUCCESS || |
| 266 result == AttemptResult::ALREADY_DEFAULT; | 276 result == AttemptResult::ALREADY_DEFAULT; |
| 267 observer_->OnSetAsDefaultConcluded(succeeded); | 277 observer_->OnSetAsDefaultConcluded(succeeded); |
| 268 } | 278 } |
| 269 | 279 |
| 270 ReportAttemptResult(result); | 280 // We don't report a success yet because we have to make sure Chrome is the |
|
grt (UTC plus 2)
2015/11/03 21:12:21
nit: avoid "we" in comments. how about "Report fai
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 281 // default browser first. | |
| 282 check_default_should_report_success_ = result == AttemptResult::SUCCESS; | |
| 283 if (!check_default_should_report_success_) { | |
|
grt (UTC plus 2)
2015/11/03 21:12:21
nit: omit braces
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 284 ReportAttemptResult(result); | |
| 285 } | |
| 271 | 286 |
| 272 // Start the default browser check which will notify the observer as to | 287 // Start the default browser check which will notify the observer as to |
| 273 // whether Chrome is really the default browser. This is needed because | 288 // whether Chrome is really the default browser. This is needed because |
| 274 // detecting that the process was successful is not 100% sure. | 289 // detecting that the process was successful is not 100% sure. |
| 275 // For example, on Windows 10+, the user might have unchecked the "Always | 290 // For example, on Windows 10+, the user might have unchecked the "Always |
| 276 // use this app" checkbox which can't be detected. | 291 // use this app" checkbox which can't be detected. |
| 277 StartCheckIsDefault(); | 292 StartCheckIsDefault(); |
| 278 } | 293 } |
| 279 } | 294 } |
| 280 | 295 |
| 281 void ShellIntegration::DefaultWebClientWorker::ReportAttemptResult( | 296 void ShellIntegration::DefaultWebClientWorker::ReportAttemptResult( |
|
grt (UTC plus 2)
2015/11/03 21:12:22
this records results for both DefaultBrowserWorker
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 282 AttemptResult result) { | 297 AttemptResult result) { |
| 283 if (!ShouldReportAttemptResults()) | 298 if (!ShouldReportAttemptResults()) |
| 284 return; | 299 return; |
| 285 | 300 |
| 286 UMA_HISTOGRAM_ENUMERATION("DefaultBrowser.AsyncSetAsDefault.Result", result, | 301 UMA_HISTOGRAM_ENUMERATION("SetDefaultBrowser.Result", result, |
|
grt (UTC plus 2)
2015/11/03 21:12:21
how about recording this for all platforms? is the
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 287 AttemptResult::NUM_ATTEMPT_RESULT_TYPES); | 302 AttemptResult::NUM_ATTEMPT_RESULT_TYPES); |
| 288 | 303 |
| 289 switch (result) { | 304 if (IsSetAsDefaultAsynchronous()) { |
| 290 case SUCCESS: | 305 switch (result) { |
|
grt (UTC plus 2)
2015/11/03 21:12:21
const base::TimeTicks delta = base::TimeTicks::Now
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 291 UMA_HISTOGRAM_MEDIUM_TIMES( | 306 case SUCCESS: |
| 292 "DefaultBrowser.AsyncSetAsDefault.Duration_Success", | 307 UMA_HISTOGRAM_MEDIUM_TIMES("SetDefaultBrowser.AsyncDuration_Success", |
| 293 base::TimeTicks::Now() - start_time_); | 308 base::TimeTicks::Now() - start_time_); |
|
grt (UTC plus 2)
2015/11/03 21:12:21
delta
Patrick Monette
2015/11/10 19:22:47
Done.
| |
| 294 break; | 309 break; |
| 295 case FAILURE: | 310 case FAILURE: |
| 296 UMA_HISTOGRAM_MEDIUM_TIMES( | 311 UMA_HISTOGRAM_MEDIUM_TIMES("SetDefaultBrowser.AsyncDuration_Failure", |
| 297 "DefaultBrowser.AsyncSetAsDefault.Duration_Failure", | 312 base::TimeTicks::Now() - start_time_); |
| 298 base::TimeTicks::Now() - start_time_); | 313 break; |
| 299 break; | 314 case ABANDONED: |
| 300 case ABANDONED: | 315 UMA_HISTOGRAM_MEDIUM_TIMES("SetDefaultBrowser.AsyncDuration_Abandoned", |
| 301 UMA_HISTOGRAM_MEDIUM_TIMES( | 316 base::TimeTicks::Now() - start_time_); |
| 302 "DefaultBrowser.AsyncSetAsDefault.Duration_Abandoned", | 317 break; |
| 303 base::TimeTicks::Now() - start_time_); | 318 case RETRY: |
| 304 break; | 319 UMA_HISTOGRAM_MEDIUM_TIMES("SetDefaultBrowser.AsyncDuration_Retry", |
| 305 case RETRY: | 320 base::TimeTicks::Now() - start_time_); |
| 306 UMA_HISTOGRAM_MEDIUM_TIMES( | 321 break; |
| 307 "DefaultBrowser.AsyncSetAsDefault.Duration_Retry", | 322 case NO_ERRORS_NOT_DEFAULT: |
| 308 base::TimeTicks::Now() - start_time_); | 323 UMA_HISTOGRAM_MEDIUM_TIMES( |
| 309 break; | 324 "SetDefaultBrowser.AsyncDuration_NoErrorsNotDefault", |
| 310 default: | 325 base::TimeTicks::Now() - start_time_); |
| 311 break; | 326 break; |
| 327 default: | |
| 328 break; | |
| 329 } | |
| 312 } | 330 } |
| 313 } | 331 } |
| 314 | 332 |
| 315 bool ShellIntegration::DefaultWebClientWorker::InitializeSetAsDefault() { | 333 bool ShellIntegration::DefaultWebClientWorker::InitializeSetAsDefault() { |
| 316 return true; | 334 return true; |
| 317 } | 335 } |
| 318 | 336 |
| 319 void ShellIntegration::DefaultWebClientWorker::FinalizeSetAsDefault() {} | 337 void ShellIntegration::DefaultWebClientWorker::FinalizeSetAsDefault() {} |
| 320 | 338 |
| 321 #if !defined(OS_WIN) | |
| 322 // static | 339 // static |
| 323 bool ShellIntegration::DefaultWebClientWorker::ShouldReportAttemptResults() { | 340 bool ShellIntegration::DefaultWebClientWorker::ShouldReportAttemptResults() { |
| 341 #if defined(OS_WIN) | |
| 342 return true; | |
| 343 #else // !defined(OS_WIN) | |
| 324 return false; | 344 return false; |
| 345 #endif | |
| 325 } | 346 } |
| 326 #endif // !defined(OS_WIN) | |
| 327 | 347 |
| 328 void ShellIntegration::DefaultWebClientWorker::UpdateUI( | 348 void ShellIntegration::DefaultWebClientWorker::UpdateUI( |
| 329 DefaultWebClientState state) { | 349 DefaultWebClientState state) { |
| 330 if (observer_) { | 350 if (observer_) { |
| 331 switch (state) { | 351 switch (state) { |
| 332 case NOT_DEFAULT: | 352 case NOT_DEFAULT: |
| 333 observer_->SetDefaultWebClientUIState(STATE_NOT_DEFAULT); | 353 observer_->SetDefaultWebClientUIState(STATE_NOT_DEFAULT); |
| 334 break; | 354 break; |
| 335 case IS_DEFAULT: | 355 case IS_DEFAULT: |
| 336 observer_->SetDefaultWebClientUIState(STATE_IS_DEFAULT); | 356 observer_->SetDefaultWebClientUIState(STATE_IS_DEFAULT); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 450 break; | 470 break; |
| 451 case SET_DEFAULT_ASYNCHRONOUS: | 471 case SET_DEFAULT_ASYNCHRONOUS: |
| 452 NOTREACHED(); | 472 NOTREACHED(); |
| 453 break; | 473 break; |
| 454 } | 474 } |
| 455 BrowserThread::PostTask( | 475 BrowserThread::PostTask( |
| 456 BrowserThread::UI, FROM_HERE, | 476 BrowserThread::UI, FROM_HERE, |
| 457 base::Bind(&DefaultProtocolClientWorker::OnSetAsDefaultAttemptComplete, | 477 base::Bind(&DefaultProtocolClientWorker::OnSetAsDefaultAttemptComplete, |
| 458 this, result)); | 478 this, result)); |
| 459 } | 479 } |
| OLD | NEW |