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

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

Issue 2888693003: Remove the usage of BrowserThread::FILE in the shell_integration* files (Closed)
Patch Set: Add SequenceChecker and make all calls to SetAsDefault share a sequence Created 3 years, 7 months 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
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_win.h" 5 #include "chrome/browser/shell_integration_win.h"
6 6
7 #include <windows.h> 7 #include <windows.h>
8 #include <objbase.h> 8 #include <objbase.h>
9 #include <shlwapi.h> 9 #include <shlwapi.h>
10 #include <shobjidl.h> 10 #include <shobjidl.h>
(...skipping 14 matching lines...) Expand all
25 #include "base/memory/ptr_util.h" 25 #include "base/memory/ptr_util.h"
26 #include "base/memory/weak_ptr.h" 26 #include "base/memory/weak_ptr.h"
27 #include "base/message_loop/message_loop.h" 27 #include "base/message_loop/message_loop.h"
28 #include "base/metrics/histogram_macros.h" 28 #include "base/metrics/histogram_macros.h"
29 #include "base/metrics/user_metrics.h" 29 #include "base/metrics/user_metrics.h"
30 #include "base/metrics/user_metrics_action.h" 30 #include "base/metrics/user_metrics_action.h"
31 #include "base/path_service.h" 31 #include "base/path_service.h"
32 #include "base/strings/string_util.h" 32 #include "base/strings/string_util.h"
33 #include "base/strings/stringprintf.h" 33 #include "base/strings/stringprintf.h"
34 #include "base/strings/utf_string_conversions.h" 34 #include "base/strings/utf_string_conversions.h"
35 #include "base/task_scheduler/post_task.h"
35 #include "base/time/time.h" 36 #include "base/time/time.h"
36 #include "base/timer/timer.h" 37 #include "base/timer/timer.h"
37 #include "base/win/registry.h" 38 #include "base/win/registry.h"
38 #include "base/win/scoped_comptr.h" 39 #include "base/win/scoped_comptr.h"
39 #include "base/win/scoped_propvariant.h" 40 #include "base/win/scoped_propvariant.h"
40 #include "base/win/shortcut.h" 41 #include "base/win/shortcut.h"
41 #include "base/win/windows_version.h" 42 #include "base/win/windows_version.h"
42 #include "chrome/browser/policy/policy_path_parser.h" 43 #include "chrome/browser/policy/policy_path_parser.h"
43 #include "chrome/browser/shell_integration.h" 44 #include "chrome/browser/shell_integration.h"
44 #include "chrome/browser/web_applications/web_app.h" 45 #include "chrome/browser/web_applications/web_app.h"
45 #include "chrome/browser/win/settings_app_monitor.h" 46 #include "chrome/browser/win/settings_app_monitor.h"
46 #include "chrome/common/chrome_constants.h" 47 #include "chrome/common/chrome_constants.h"
47 #include "chrome/common/chrome_paths_internal.h" 48 #include "chrome/common/chrome_paths_internal.h"
48 #include "chrome/common/chrome_switches.h" 49 #include "chrome/common/chrome_switches.h"
49 #include "chrome/common/shell_handler_win.mojom.h" 50 #include "chrome/common/shell_handler_win.mojom.h"
50 #include "chrome/grit/generated_resources.h" 51 #include "chrome/grit/generated_resources.h"
51 #include "chrome/install_static/install_util.h" 52 #include "chrome/install_static/install_util.h"
52 #include "chrome/installer/util/browser_distribution.h" 53 #include "chrome/installer/util/browser_distribution.h"
53 #include "chrome/installer/util/install_util.h" 54 #include "chrome/installer/util/install_util.h"
54 #include "chrome/installer/util/scoped_user_protocol_entry.h" 55 #include "chrome/installer/util/scoped_user_protocol_entry.h"
55 #include "chrome/installer/util/shell_util.h" 56 #include "chrome/installer/util/shell_util.h"
56 #include "components/variations/variations_associated_data.h" 57 #include "components/variations/variations_associated_data.h"
57 #include "content/public/browser/browser_thread.h"
58 #include "content/public/browser/utility_process_mojo_client.h" 58 #include "content/public/browser/utility_process_mojo_client.h"
59 #include "ui/base/l10n/l10n_util.h" 59 #include "ui/base/l10n/l10n_util.h"
60 60
61 using content::BrowserThread;
62
63 namespace shell_integration { 61 namespace shell_integration {
64 62
65 namespace { 63 namespace {
66 64
67 // Helper function for GetAppId to generates profile id 65 // Helper function for GetAppId to generates profile id
68 // from profile path. "profile_id" is composed of sanitized basenames of 66 // from profile path. "profile_id" is composed of sanitized basenames of
69 // user data dir and profile dir joined by a ".". 67 // user data dir and profile dir joined by a ".".
70 base::string16 GetProfileIdFromPath(const base::FilePath& profile_path) { 68 base::string16 GetProfileIdFromPath(const base::FilePath& profile_path) {
71 // Return empty string if profile_path is empty 69 // Return empty string if profile_path is empty
72 if (profile_path.empty()) 70 if (profile_path.empty())
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 app_name = GetAppListAppName(); 141 app_name = GetAppListAppName();
144 } else { 142 } else {
145 app_name = ShellUtil::GetBrowserModelId(is_per_user_install); 143 app_name = ShellUtil::GetBrowserModelId(is_per_user_install);
146 } 144 }
147 DCHECK(!app_name.empty()); 145 DCHECK(!app_name.empty());
148 146
149 return win::GetAppModelIdForProfile(app_name, profile_path); 147 return win::GetAppModelIdForProfile(app_name, profile_path);
150 } 148 }
151 149
152 void MigrateTaskbarPinsCallback() { 150 void MigrateTaskbarPinsCallback() {
153 // This should run on the file thread. 151 base::ThreadRestrictions::AssertIOAllowed();
154 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
155 152
156 // Get full path of chrome. 153 // Get full path of chrome.
157 base::FilePath chrome_exe; 154 base::FilePath chrome_exe;
158 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) 155 if (!PathService::Get(base::FILE_EXE, &chrome_exe))
159 return; 156 return;
160 157
161 base::FilePath pins_path; 158 base::FilePath pins_path;
162 if (!PathService::Get(base::DIR_TASKBAR_PINS, &pins_path)) { 159 if (!PathService::Get(base::DIR_TASKBAR_PINS, &pins_path)) {
163 NOTREACHED(); 160 NOTREACHED();
164 return; 161 return;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 // This helper class manages both the timer and the registry watchers and makes 318 // This helper class manages both the timer and the registry watchers and makes
322 // sure the callback for the end of the settings interaction is only run once. 319 // sure the callback for the end of the settings interaction is only run once.
323 // This class also manages its own lifetime. 320 // This class also manages its own lifetime.
324 class OpenSystemSettingsHelper { 321 class OpenSystemSettingsHelper {
325 public: 322 public:
326 // Begin the monitoring and will call |on_finished_callback| when done. 323 // Begin the monitoring and will call |on_finished_callback| when done.
327 // Takes in a null-terminated array of |protocols| whose registry keys must be 324 // Takes in a null-terminated array of |protocols| whose registry keys must be
328 // watched. The array must contain at least one element. 325 // watched. The array must contain at least one element.
329 static void Begin(const wchar_t* const protocols[], 326 static void Begin(const wchar_t* const protocols[],
330 const base::Closure& on_finished_callback) { 327 const base::Closure& on_finished_callback) {
331 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 328 base::ThreadRestrictions::AssertIOAllowed();
332 329
333 delete instance_; 330 delete instance_;
334 instance_ = new OpenSystemSettingsHelper(protocols, on_finished_callback); 331 instance_ = new OpenSystemSettingsHelper(protocols, on_finished_callback);
335 } 332 }
336 333
337 private: 334 private:
338 // The reason the settings interaction concluded. Do not modify the ordering 335 // The reason the settings interaction concluded. Do not modify the ordering
339 // because it is used for UMA. 336 // because it is used for UMA.
340 enum ConcludeReason { REGISTRY_WATCHER, TIMEOUT, NUM_CONCLUDE_REASON_TYPES }; 337 enum ConcludeReason { REGISTRY_WATCHER, TIMEOUT, NUM_CONCLUDE_REASON_TYPES };
341 338
(...skipping 15 matching lines...) Expand all
357 } 354 }
358 // Only the watchers that were succesfully initialized are counted. 355 // Only the watchers that were succesfully initialized are counted.
359 registry_watcher_count_ = registry_key_watchers_.size(); 356 registry_watcher_count_ = registry_key_watchers_.size();
360 357
361 timer_.Start( 358 timer_.Start(
362 FROM_HERE, base::TimeDelta::FromMinutes(2), 359 FROM_HERE, base::TimeDelta::FromMinutes(2),
363 base::Bind(&OpenSystemSettingsHelper::ConcludeInteraction, 360 base::Bind(&OpenSystemSettingsHelper::ConcludeInteraction,
364 weak_ptr_factory_.GetWeakPtr(), ConcludeReason::TIMEOUT)); 361 weak_ptr_factory_.GetWeakPtr(), ConcludeReason::TIMEOUT));
365 } 362 }
366 363
364 ~OpenSystemSettingsHelper() {
365 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
366 }
367
367 // Called when a change is detected on one of the registry keys being watched. 368 // Called when a change is detected on one of the registry keys being watched.
368 // Note: All types of modification to the registry key will trigger this 369 // Note: All types of modification to the registry key will trigger this
369 // function even if the value change is the only one that matters. This 370 // function even if the value change is the only one that matters. This
370 // is good enough for now. 371 // is good enough for now.
371 void OnRegistryKeyChanged() { 372 void OnRegistryKeyChanged() {
372 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 373 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
373
374 // Make sure all the registry watchers have fired. 374 // Make sure all the registry watchers have fired.
375 if (--registry_watcher_count_ == 0) { 375 if (--registry_watcher_count_ == 0) {
376 UMA_HISTOGRAM_MEDIUM_TIMES( 376 UMA_HISTOGRAM_MEDIUM_TIMES(
377 "DefaultBrowser.SettingsInteraction.RegistryWatcherDuration", 377 "DefaultBrowser.SettingsInteraction.RegistryWatcherDuration",
378 base::TimeTicks::Now() - start_time_); 378 base::TimeTicks::Now() - start_time_);
379 379
380 ConcludeInteraction(ConcludeReason::REGISTRY_WATCHER); 380 ConcludeInteraction(ConcludeReason::REGISTRY_WATCHER);
381 } 381 }
382 } 382 }
383 383
384 // Ends the monitoring with the system settings. Will call 384 // Ends the monitoring with the system settings. Will call
385 // |on_finished_callback_| and then dispose of this class instance to make 385 // |on_finished_callback_| and then dispose of this class instance to make
386 // sure the callback won't get called subsequently. 386 // sure the callback won't get called subsequently.
387 void ConcludeInteraction(ConcludeReason conclude_reason) { 387 void ConcludeInteraction(ConcludeReason conclude_reason) {
388 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 388 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
389 389
390 UMA_HISTOGRAM_ENUMERATION( 390 UMA_HISTOGRAM_ENUMERATION(
391 "DefaultBrowser.SettingsInteraction.ConcludeReason", conclude_reason, 391 "DefaultBrowser.SettingsInteraction.ConcludeReason", conclude_reason,
392 NUM_CONCLUDE_REASON_TYPES); 392 NUM_CONCLUDE_REASON_TYPES);
393 on_finished_callback_.Run(); 393 on_finished_callback_.Run();
394 delete instance_; 394 delete instance_;
395 instance_ = nullptr; 395 instance_ = nullptr;
396 } 396 }
397 397
398 // Helper function to create a registry watcher for a given |key_path|. Do 398 // Helper function to create a registry watcher for a given |key_path|. Do
399 // nothing on initialization failure. 399 // nothing on initialization failure.
400 void AddRegistryKeyWatcher(const wchar_t* key_path) { 400 void AddRegistryKeyWatcher(const wchar_t* key_path) {
401 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
402
401 auto reg_key = base::MakeUnique<base::win::RegKey>(HKEY_CURRENT_USER, 403 auto reg_key = base::MakeUnique<base::win::RegKey>(HKEY_CURRENT_USER,
402 key_path, KEY_NOTIFY); 404 key_path, KEY_NOTIFY);
403 405
404 if (reg_key->Valid() && 406 if (reg_key->Valid() &&
405 reg_key->StartWatching( 407 reg_key->StartWatching(
406 base::Bind(&OpenSystemSettingsHelper::OnRegistryKeyChanged, 408 base::Bind(&OpenSystemSettingsHelper::OnRegistryKeyChanged,
407 weak_ptr_factory_.GetWeakPtr()))) { 409 weak_ptr_factory_.GetWeakPtr()))) {
408 registry_key_watchers_.push_back(std::move(reg_key)); 410 registry_key_watchers_.push_back(std::move(reg_key));
409 } 411 }
410 } 412 }
(...skipping 15 matching lines...) Expand all
426 // There can be multiple registry key watchers as some settings modify 428 // There can be multiple registry key watchers as some settings modify
427 // multiple protocol associations. e.g. Changing the default browser modifies 429 // multiple protocol associations. e.g. Changing the default browser modifies
428 // the http and https associations. 430 // the http and https associations.
429 std::vector<std::unique_ptr<base::win::RegKey>> registry_key_watchers_; 431 std::vector<std::unique_ptr<base::win::RegKey>> registry_key_watchers_;
430 432
431 base::OneShotTimer timer_; 433 base::OneShotTimer timer_;
432 434
433 // Records the time it takes for the final registry watcher to get signaled. 435 // Records the time it takes for the final registry watcher to get signaled.
434 base::TimeTicks start_time_; 436 base::TimeTicks start_time_;
435 437
438 SEQUENCE_CHECKER(sequence_checker_);
439
436 // Weak ptrs are used to bind this class to the callbacks of the timer and the 440 // Weak ptrs are used to bind this class to the callbacks of the timer and the
437 // registry watcher. This makes it possible to self-delete after one of the 441 // registry watcher. This makes it possible to self-delete after one of the
438 // callbacks is executed to cancel the remaining ones. 442 // callbacks is executed to cancel the remaining ones.
439 base::WeakPtrFactory<OpenSystemSettingsHelper> weak_ptr_factory_; 443 base::WeakPtrFactory<OpenSystemSettingsHelper> weak_ptr_factory_;
440 444
441 DISALLOW_COPY_AND_ASSIGN(OpenSystemSettingsHelper); 445 DISALLOW_COPY_AND_ASSIGN(OpenSystemSettingsHelper);
442 }; 446 };
443 447
444 OpenSystemSettingsHelper* OpenSystemSettingsHelper::instance_ = nullptr; 448 OpenSystemSettingsHelper* OpenSystemSettingsHelper::instance_ = nullptr;
445 449
(...skipping 11 matching lines...) Expand all
457 const ResultCallback& result_callback); 461 const ResultCallback& result_callback);
458 462
459 void OnConnectionError(); 463 void OnConnectionError();
460 void OnIsPinnedToTaskbarResult(bool succeeded, bool is_pinned_to_taskbar); 464 void OnIsPinnedToTaskbarResult(bool succeeded, bool is_pinned_to_taskbar);
461 465
462 content::UtilityProcessMojoClient<chrome::mojom::ShellHandler> shell_handler_; 466 content::UtilityProcessMojoClient<chrome::mojom::ShellHandler> shell_handler_;
463 467
464 ErrorCallback error_callback_; 468 ErrorCallback error_callback_;
465 ResultCallback result_callback_; 469 ResultCallback result_callback_;
466 470
471 SEQUENCE_CHECKER(sequence_checker_);
472
467 DISALLOW_COPY_AND_ASSIGN(IsPinnedToTaskbarHelper); 473 DISALLOW_COPY_AND_ASSIGN(IsPinnedToTaskbarHelper);
468 }; 474 };
469 475
470 // static 476 // static
471 void IsPinnedToTaskbarHelper::GetState(const ErrorCallback& error_callback, 477 void IsPinnedToTaskbarHelper::GetState(const ErrorCallback& error_callback,
472 const ResultCallback& result_callback) { 478 const ResultCallback& result_callback) {
473 // Self-deleting when the ShellHandler completes. 479 // Self-deleting when the ShellHandler completes.
474 new IsPinnedToTaskbarHelper(error_callback, result_callback); 480 new IsPinnedToTaskbarHelper(error_callback, result_callback);
475 } 481 }
476 482
(...skipping 13 matching lines...) Expand all
490 &IsPinnedToTaskbarHelper::OnConnectionError, base::Unretained(this))); 496 &IsPinnedToTaskbarHelper::OnConnectionError, base::Unretained(this)));
491 shell_handler_.set_disable_sandbox(); 497 shell_handler_.set_disable_sandbox();
492 shell_handler_.Start(); 498 shell_handler_.Start();
493 499
494 shell_handler_.service()->IsPinnedToTaskbar( 500 shell_handler_.service()->IsPinnedToTaskbar(
495 base::Bind(&IsPinnedToTaskbarHelper::OnIsPinnedToTaskbarResult, 501 base::Bind(&IsPinnedToTaskbarHelper::OnIsPinnedToTaskbarResult,
496 base::Unretained(this))); 502 base::Unretained(this)));
497 } 503 }
498 504
499 void IsPinnedToTaskbarHelper::OnConnectionError() { 505 void IsPinnedToTaskbarHelper::OnConnectionError() {
506 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
507
500 error_callback_.Run(); 508 error_callback_.Run();
501 delete this; 509 delete this;
502 } 510 }
503 511
504 void IsPinnedToTaskbarHelper::OnIsPinnedToTaskbarResult( 512 void IsPinnedToTaskbarHelper::OnIsPinnedToTaskbarResult(
505 bool succeeded, 513 bool succeeded,
506 bool is_pinned_to_taskbar) { 514 bool is_pinned_to_taskbar) {
515 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
516
507 result_callback_.Run(succeeded, is_pinned_to_taskbar); 517 result_callback_.Run(succeeded, is_pinned_to_taskbar);
508 delete this; 518 delete this;
509 } 519 }
510 520
511 } // namespace 521 } // namespace
512 522
513 bool SetAsDefaultBrowser() { 523 bool SetAsDefaultBrowser() {
524 base::ThreadRestrictions::AssertIOAllowed();
525
514 base::FilePath chrome_exe; 526 base::FilePath chrome_exe;
515 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 527 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
516 LOG(ERROR) << "Error getting app exe path"; 528 LOG(ERROR) << "Error getting app exe path";
517 return false; 529 return false;
518 } 530 }
519 531
520 // From UI currently we only allow setting default browser for current user. 532 // From UI currently we only allow setting default browser for current user.
521 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 533 BrowserDistribution* dist = BrowserDistribution::GetDistribution();
522 if (!ShellUtil::MakeChromeDefault(dist, ShellUtil::CURRENT_USER, chrome_exe, 534 if (!ShellUtil::MakeChromeDefault(dist, ShellUtil::CURRENT_USER, chrome_exe,
523 true /* elevate_if_not_admin */)) { 535 true /* elevate_if_not_admin */)) {
524 LOG(ERROR) << "Chrome could not be set as default browser."; 536 LOG(ERROR) << "Chrome could not be set as default browser.";
525 return false; 537 return false;
526 } 538 }
527 539
528 VLOG(1) << "Chrome registered as default browser."; 540 VLOG(1) << "Chrome registered as default browser.";
529 return true; 541 return true;
530 } 542 }
531 543
532 bool SetAsDefaultProtocolClient(const std::string& protocol) { 544 bool SetAsDefaultProtocolClient(const std::string& protocol) {
545 base::ThreadRestrictions::AssertIOAllowed();
546
533 if (protocol.empty()) 547 if (protocol.empty())
534 return false; 548 return false;
535 549
536 base::FilePath chrome_exe; 550 base::FilePath chrome_exe;
537 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 551 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
538 LOG(ERROR) << "Error getting app exe path"; 552 LOG(ERROR) << "Error getting app exe path";
539 return false; 553 return false;
540 } 554 }
541 555
542 base::string16 wprotocol(base::UTF8ToUTF16(protocol)); 556 base::string16 wprotocol(base::UTF8ToUTF16(protocol));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 632
619 DefaultWebClientState IsDefaultProtocolClient(const std::string& protocol) { 633 DefaultWebClientState IsDefaultProtocolClient(const std::string& protocol) {
620 return GetDefaultWebClientStateFromShellUtilDefaultState( 634 return GetDefaultWebClientStateFromShellUtilDefaultState(
621 ShellUtil::GetChromeDefaultProtocolClientState( 635 ShellUtil::GetChromeDefaultProtocolClientState(
622 base::UTF8ToUTF16(protocol))); 636 base::UTF8ToUTF16(protocol)));
623 } 637 }
624 638
625 namespace win { 639 namespace win {
626 640
627 bool SetAsDefaultBrowserUsingIntentPicker() { 641 bool SetAsDefaultBrowserUsingIntentPicker() {
642 base::ThreadRestrictions::AssertIOAllowed();
643
628 base::FilePath chrome_exe; 644 base::FilePath chrome_exe;
629 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 645 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
630 NOTREACHED() << "Error getting app exe path"; 646 NOTREACHED() << "Error getting app exe path";
631 return false; 647 return false;
632 } 648 }
633 649
634 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 650 BrowserDistribution* dist = BrowserDistribution::GetDistribution();
635 if (!ShellUtil::ShowMakeChromeDefaultSystemUI(dist, chrome_exe)) { 651 if (!ShellUtil::ShowMakeChromeDefaultSystemUI(dist, chrome_exe)) {
636 LOG(ERROR) << "Failed to launch the set-default-browser Windows UI."; 652 LOG(ERROR) << "Failed to launch the set-default-browser Windows UI.";
637 return false; 653 return false;
638 } 654 }
639 655
640 VLOG(1) << "Set-default-browser Windows UI completed."; 656 VLOG(1) << "Set-default-browser Windows UI completed.";
641 return true; 657 return true;
642 } 658 }
643 659
644 void SetAsDefaultBrowserUsingSystemSettings( 660 void SetAsDefaultBrowserUsingSystemSettings(
645 const base::Closure& on_finished_callback) { 661 const base::Closure& on_finished_callback) {
646 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 662 base::ThreadRestrictions::AssertIOAllowed();
647 663
648 base::FilePath chrome_exe; 664 base::FilePath chrome_exe;
649 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 665 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
650 NOTREACHED() << "Error getting app exe path"; 666 NOTREACHED() << "Error getting app exe path";
651 on_finished_callback.Run(); 667 on_finished_callback.Run();
652 return; 668 return;
653 } 669 }
654 670
655 // Create an action recorder that will open the settings app once it has 671 // Create an action recorder that will open the settings app once it has
656 // initialized. 672 // initialized.
657 std::unique_ptr<DefaultBrowserActionRecorder> recorder( 673 std::unique_ptr<DefaultBrowserActionRecorder> recorder(
658 new DefaultBrowserActionRecorder(base::Bind( 674 new DefaultBrowserActionRecorder(base::Bind(
659 base::IgnoreResult(&ShellUtil::ShowMakeChromeDefaultSystemUI), 675 base::IgnoreResult(&ShellUtil::ShowMakeChromeDefaultSystemUI),
660 base::Unretained(BrowserDistribution::GetDistribution()), 676 base::Unretained(BrowserDistribution::GetDistribution()),
661 chrome_exe))); 677 chrome_exe)));
662 678
663 // The helper manages its own lifetime. Bind the action recorder 679 // The helper manages its own lifetime. Bind the action recorder
664 // into the finished callback to keep it alive throughout the 680 // into the finished callback to keep it alive throughout the
665 // interaction. 681 // interaction.
666 static const wchar_t* const kProtocols[] = {L"http", L"https", nullptr}; 682 static const wchar_t* const kProtocols[] = {L"http", L"https", nullptr};
667 OpenSystemSettingsHelper::Begin( 683 OpenSystemSettingsHelper::Begin(
668 kProtocols, base::Bind(&OnSettingsAppFinished, base::Passed(&recorder), 684 kProtocols, base::Bind(&OnSettingsAppFinished, base::Passed(&recorder),
669 on_finished_callback)); 685 on_finished_callback));
670 } 686 }
671 687
672 bool SetAsDefaultProtocolClientUsingIntentPicker(const std::string& protocol) { 688 bool SetAsDefaultProtocolClientUsingIntentPicker(const std::string& protocol) {
689 base::ThreadRestrictions::AssertIOAllowed();
690
673 base::FilePath chrome_exe; 691 base::FilePath chrome_exe;
674 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 692 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
675 NOTREACHED() << "Error getting app exe path"; 693 NOTREACHED() << "Error getting app exe path";
676 return false; 694 return false;
677 } 695 }
678 696
679 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 697 BrowserDistribution* dist = BrowserDistribution::GetDistribution();
680 base::string16 wprotocol(base::UTF8ToUTF16(protocol)); 698 base::string16 wprotocol(base::UTF8ToUTF16(protocol));
681 if (!ShellUtil::ShowMakeChromeDefaultProtocolClientSystemUI(dist, chrome_exe, 699 if (!ShellUtil::ShowMakeChromeDefaultProtocolClientSystemUI(dist, chrome_exe,
682 wprotocol)) { 700 wprotocol)) {
683 LOG(ERROR) << "Failed to launch the set-default-client Windows UI."; 701 LOG(ERROR) << "Failed to launch the set-default-client Windows UI.";
684 return false; 702 return false;
685 } 703 }
686 704
687 VLOG(1) << "Set-default-client Windows UI completed."; 705 VLOG(1) << "Set-default-client Windows UI completed.";
688 return true; 706 return true;
689 } 707 }
690 708
691 void SetAsDefaultProtocolClientUsingSystemSettings( 709 void SetAsDefaultProtocolClientUsingSystemSettings(
692 const std::string& protocol, 710 const std::string& protocol,
693 const base::Closure& on_finished_callback) { 711 const base::Closure& on_finished_callback) {
694 DCHECK_CURRENTLY_ON(BrowserThread::FILE); 712 base::ThreadRestrictions::AssertIOAllowed();
695 713
696 base::FilePath chrome_exe; 714 base::FilePath chrome_exe;
697 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { 715 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) {
698 NOTREACHED() << "Error getting app exe path"; 716 NOTREACHED() << "Error getting app exe path";
699 on_finished_callback.Run(); 717 on_finished_callback.Run();
700 return; 718 return;
701 } 719 }
702 720
703 // The helper manages its own lifetime. 721 // The helper manages its own lifetime.
704 base::string16 wprotocol(base::UTF8ToUTF16(protocol)); 722 base::string16 wprotocol(base::UTF8ToUTF16(protocol));
(...skipping 17 matching lines...) Expand all
722 740
723 base::string16 GetChromiumModelIdForProfile( 741 base::string16 GetChromiumModelIdForProfile(
724 const base::FilePath& profile_path) { 742 const base::FilePath& profile_path) {
725 return GetAppModelIdForProfile( 743 return GetAppModelIdForProfile(
726 ShellUtil::GetBrowserModelId(InstallUtil::IsPerUserInstall()), 744 ShellUtil::GetBrowserModelId(InstallUtil::IsPerUserInstall()),
727 profile_path); 745 profile_path);
728 } 746 }
729 747
730 void MigrateTaskbarPins() { 748 void MigrateTaskbarPins() {
731 if (base::win::GetVersion() < base::win::VERSION_WIN7) 749 if (base::win::GetVersion() < base::win::VERSION_WIN7)
732 return; 750 return;
gab 2017/05/26 18:44:06 Can we remove this check while you're here, we onl
Patrick Monette 2017/05/29 18:54:14 Will do in another CL
733 751
734 // This needs to happen eventually (e.g. so that the appid is fixed and the 752 // This needs to happen (e.g. so that the appid is fixed and the
735 // run-time Chrome icon is merged with the taskbar shortcut), but this is not 753 // run-time Chrome icon is merged with the taskbar shortcut), but it is not an
736 // urgent and shouldn't delay Chrome startup. 754 // urgent task.
737 static const int64_t kMigrateTaskbarPinsDelaySeconds = 15; 755 base::PostTaskWithTraits(FROM_HERE,
738 BrowserThread::PostDelayedTask( 756 {base::MayBlock(), base::TaskPriority::BACKGROUND},
739 BrowserThread::FILE, FROM_HERE, 757 base::Bind(&MigrateTaskbarPinsCallback));
740 base::Bind(&MigrateTaskbarPinsCallback),
741 base::TimeDelta::FromSeconds(kMigrateTaskbarPinsDelaySeconds));
742 } 758 }
743 759
744 void GetIsPinnedToTaskbarState( 760 void GetIsPinnedToTaskbarState(
745 const ConnectionErrorCallback& on_error_callback, 761 const ConnectionErrorCallback& on_error_callback,
746 const IsPinnedToTaskbarCallback& result_callback) { 762 const IsPinnedToTaskbarCallback& result_callback) {
747 IsPinnedToTaskbarHelper::GetState(on_error_callback, result_callback); 763 IsPinnedToTaskbarHelper::GetState(on_error_callback, result_callback);
748 } 764 }
749 765
750 int MigrateShortcutsInPathInternal(const base::FilePath& chrome_exe, 766 int MigrateShortcutsInPathInternal(const base::FilePath& chrome_exe,
751 const base::FilePath& path) { 767 const base::FilePath& path) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 base::win::SHORTCUT_UPDATE_EXISTING)) { 866 base::win::SHORTCUT_UPDATE_EXISTING)) {
851 ++shortcuts_migrated; 867 ++shortcuts_migrated;
852 } 868 }
853 } 869 }
854 return shortcuts_migrated; 870 return shortcuts_migrated;
855 } 871 }
856 872
857 } // namespace win 873 } // namespace win
858 874
859 } // namespace shell_integration 875 } // namespace shell_integration
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698