| 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/ui/startup/startup_browser_creator.h" | 5 #include "chrome/browser/ui/startup/startup_browser_creator.h" |
| 6 | 6 |
| 7 #include <algorithm> // For max(). | 7 #include <algorithm> // For max(). |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 #include "chrome/browser/automation/automation_provider_list.h" | 29 #include "chrome/browser/automation/automation_provider_list.h" |
| 30 #include "chrome/browser/automation/testing_automation_provider.h" | 30 #include "chrome/browser/automation/testing_automation_provider.h" |
| 31 #include "chrome/browser/browser_process.h" | 31 #include "chrome/browser/browser_process.h" |
| 32 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" | 32 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" |
| 33 #include "chrome/browser/extensions/startup_helper.h" | 33 #include "chrome/browser/extensions/startup_helper.h" |
| 34 #include "chrome/browser/extensions/unpacked_installer.h" | 34 #include "chrome/browser/extensions/unpacked_installer.h" |
| 35 #include "chrome/browser/first_run/first_run.h" | 35 #include "chrome/browser/first_run/first_run.h" |
| 36 #include "chrome/browser/google/google_util.h" | 36 #include "chrome/browser/google/google_util.h" |
| 37 #include "chrome/browser/net/url_fixer_upper.h" | 37 #include "chrome/browser/net/url_fixer_upper.h" |
| 38 #include "chrome/browser/notifications/desktop_notification_service.h" | 38 #include "chrome/browser/notifications/desktop_notification_service.h" |
| 39 #include "chrome/browser/operation_output.h" |
| 39 #include "chrome/browser/prefs/incognito_mode_prefs.h" | 40 #include "chrome/browser/prefs/incognito_mode_prefs.h" |
| 40 #include "chrome/browser/prefs/session_startup_pref.h" | 41 #include "chrome/browser/prefs/session_startup_pref.h" |
| 41 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" | 42 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" |
| 42 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.
h" | 43 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.
h" |
| 43 #include "chrome/browser/printing/print_dialog_cloud.h" | 44 #include "chrome/browser/printing/print_dialog_cloud.h" |
| 44 #include "chrome/browser/profiles/profile.h" | 45 #include "chrome/browser/profiles/profile.h" |
| 45 #include "chrome/browser/profiles/profile_manager.h" | 46 #include "chrome/browser/profiles/profile_manager.h" |
| 46 #include "chrome/browser/search_engines/template_url.h" | 47 #include "chrome/browser/search_engines/template_url.h" |
| 47 #include "chrome/browser/search_engines/template_url_service.h" | 48 #include "chrome/browser/search_engines/template_url_service.h" |
| 48 #include "chrome/browser/search_engines/template_url_service_factory.h" | 49 #include "chrome/browser/search_engines/template_url_service_factory.h" |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 // static | 234 // static |
| 234 bool StartupBrowserCreator::was_restarted_read_ = false; | 235 bool StartupBrowserCreator::was_restarted_read_ = false; |
| 235 | 236 |
| 236 // static | 237 // static |
| 237 bool StartupBrowserCreator::in_synchronous_profile_launch_ = false; | 238 bool StartupBrowserCreator::in_synchronous_profile_launch_ = false; |
| 238 | 239 |
| 239 void StartupBrowserCreator::AddFirstRunTab(const GURL& url) { | 240 void StartupBrowserCreator::AddFirstRunTab(const GURL& url) { |
| 240 first_run_tabs_.push_back(url); | 241 first_run_tabs_.push_back(url); |
| 241 } | 242 } |
| 242 | 243 |
| 244 bool StartupBrowserCreator::Start( |
| 245 const CommandLine& cmd_line, |
| 246 const base::FilePath& cur_dir, |
| 247 Profile* last_used_profile, |
| 248 const Profiles& last_opened_profiles, |
| 249 scoped_ptr<OperationOutput> operation_output) { |
| 250 return ProcessCmdLineImpl(cmd_line, cur_dir, true, last_used_profile, |
| 251 last_opened_profiles, this, |
| 252 operation_output.Pass()); |
| 253 } |
| 254 |
| 243 // static | 255 // static |
| 244 bool StartupBrowserCreator::InSynchronousProfileLaunch() { | 256 bool StartupBrowserCreator::InSynchronousProfileLaunch() { |
| 245 return in_synchronous_profile_launch_; | 257 return in_synchronous_profile_launch_; |
| 246 } | 258 } |
| 247 | 259 |
| 248 bool StartupBrowserCreator::LaunchBrowser( | 260 bool StartupBrowserCreator::LaunchBrowser( |
| 249 const CommandLine& command_line, | 261 const CommandLine& command_line, |
| 250 Profile* profile, | 262 Profile* profile, |
| 251 const base::FilePath& cur_dir, | 263 const base::FilePath& cur_dir, |
| 252 chrome::startup::IsProcessStartup process_startup, | 264 chrome::startup::IsProcessStartup process_startup, |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 return urls; | 435 return urls; |
| 424 } | 436 } |
| 425 | 437 |
| 426 // static | 438 // static |
| 427 bool StartupBrowserCreator::ProcessCmdLineImpl( | 439 bool StartupBrowserCreator::ProcessCmdLineImpl( |
| 428 const CommandLine& command_line, | 440 const CommandLine& command_line, |
| 429 const base::FilePath& cur_dir, | 441 const base::FilePath& cur_dir, |
| 430 bool process_startup, | 442 bool process_startup, |
| 431 Profile* last_used_profile, | 443 Profile* last_used_profile, |
| 432 const Profiles& last_opened_profiles, | 444 const Profiles& last_opened_profiles, |
| 433 int* return_code, | 445 StartupBrowserCreator* browser_creator, |
| 434 StartupBrowserCreator* browser_creator) { | 446 scoped_ptr<OperationOutput> operation_output) { |
| 435 DCHECK(last_used_profile); | 447 DCHECK(last_used_profile); |
| 436 if (process_startup) { | 448 if (process_startup) { |
| 437 if (command_line.HasSwitch(switches::kDisablePromptOnRepost)) | 449 if (command_line.HasSwitch(switches::kDisablePromptOnRepost)) |
| 438 content::NavigationController::DisablePromptOnRepost(); | 450 content::NavigationController::DisablePromptOnRepost(); |
| 439 } | 451 } |
| 440 | 452 |
| 453 // TODO(erikwright): Remove before committing. |
| 454 if (command_line.HasSwitch("greetings")) { |
| 455 if (operation_output) { |
| 456 std::string hello_world("hello world!"); |
| 457 operation_output->Write(hello_world.c_str(), hello_world.length()); |
| 458 OperationOutput::Complete(operation_output.Pass(), 42); |
| 459 } |
| 460 |
| 461 return false; |
| 462 } |
| 463 |
| 441 bool silent_launch = false; | 464 bool silent_launch = false; |
| 442 | 465 |
| 443 #if defined(ENABLE_AUTOMATION) | 466 #if defined(ENABLE_AUTOMATION) |
| 444 // Look for the testing channel ID ONLY during process startup | 467 // Look for the testing channel ID ONLY during process startup |
| 445 if (process_startup && | 468 if (process_startup && |
| 446 command_line.HasSwitch(switches::kTestingChannelID)) { | 469 command_line.HasSwitch(switches::kTestingChannelID)) { |
| 447 std::string testing_channel_id = command_line.GetSwitchValueASCII( | 470 std::string testing_channel_id = command_line.GetSwitchValueASCII( |
| 448 switches::kTestingChannelID); | 471 switches::kTestingChannelID); |
| 449 // TODO(sanjeevr) Check if we need to make this a singleton for | 472 // TODO(sanjeevr) Check if we need to make this a singleton for |
| 450 // compatibility with the old testing code | 473 // compatibility with the old testing code |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; | 643 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; |
| 621 // |last_opened_profiles| will be empty in the following circumstances: | 644 // |last_opened_profiles| will be empty in the following circumstances: |
| 622 // - This is the first launch. |last_used_profile| is the initial profile. | 645 // - This is the first launch. |last_used_profile| is the initial profile. |
| 623 // - The user exited the browser by closing all windows for all | 646 // - The user exited the browser by closing all windows for all |
| 624 // profiles. |last_used_profile| is the profile which owned the last open | 647 // profiles. |last_used_profile| is the profile which owned the last open |
| 625 // window. | 648 // window. |
| 626 // - Only incognito windows were open when the browser exited. | 649 // - Only incognito windows were open when the browser exited. |
| 627 // |last_used_profile| is the last used incognito profile. Restoring it will | 650 // |last_used_profile| is the last used incognito profile. Restoring it will |
| 628 // create a browser window for the corresponding original profile. | 651 // create a browser window for the corresponding original profile. |
| 629 if (last_opened_profiles.empty()) { | 652 if (last_opened_profiles.empty()) { |
| 653 int return_code = 0; |
| 630 if (!browser_creator->LaunchBrowser(command_line, last_used_profile, | 654 if (!browser_creator->LaunchBrowser(command_line, last_used_profile, |
| 631 cur_dir, is_process_startup, | 655 cur_dir, is_process_startup, |
| 632 is_first_run, return_code)) { | 656 is_first_run, &return_code)) { |
| 657 if (operation_output) |
| 658 OperationOutput::Complete(operation_output.Pass(), return_code); |
| 633 return false; | 659 return false; |
| 634 } | 660 } |
| 635 } else { | 661 } else { |
| 636 // Launch the last used profile with the full command line, and the other | 662 // Launch the last used profile with the full command line, and the other |
| 637 // opened profiles without the URLs to launch. | 663 // opened profiles without the URLs to launch. |
| 638 CommandLine command_line_without_urls(command_line.GetProgram()); | 664 CommandLine command_line_without_urls(command_line.GetProgram()); |
| 639 const CommandLine::SwitchMap& switches = command_line.GetSwitches(); | 665 const CommandLine::SwitchMap& switches = command_line.GetSwitches(); |
| 640 for (CommandLine::SwitchMap::const_iterator switch_it = switches.begin(); | 666 for (CommandLine::SwitchMap::const_iterator switch_it = switches.begin(); |
| 641 switch_it != switches.end(); ++switch_it) { | 667 switch_it != switches.end(); ++switch_it) { |
| 642 command_line_without_urls.AppendSwitchNative(switch_it->first, | 668 command_line_without_urls.AppendSwitchNative(switch_it->first, |
| 643 switch_it->second); | 669 switch_it->second); |
| 644 } | 670 } |
| 645 // Launch the profiles in the order they became active. | 671 // Launch the profiles in the order they became active. |
| 646 for (Profiles::const_iterator it = last_opened_profiles.begin(); | 672 for (Profiles::const_iterator it = last_opened_profiles.begin(); |
| 647 it != last_opened_profiles.end(); ++it) { | 673 it != last_opened_profiles.end(); ++it) { |
| 648 // Don't launch additional profiles which would only open a new tab | 674 // Don't launch additional profiles which would only open a new tab |
| 649 // page. When restarting after an update, all profiles will reopen last | 675 // page. When restarting after an update, all profiles will reopen last |
| 650 // open pages. | 676 // open pages. |
| 651 SessionStartupPref startup_pref = | 677 SessionStartupPref startup_pref = |
| 652 GetSessionStartupPref(command_line, *it); | 678 GetSessionStartupPref(command_line, *it); |
| 653 if (*it != last_used_profile && | 679 if (*it != last_used_profile && |
| 654 startup_pref.type == SessionStartupPref::DEFAULT && | 680 startup_pref.type == SessionStartupPref::DEFAULT && |
| 655 !HasPendingUncleanExit(*it)) | 681 !HasPendingUncleanExit(*it)) |
| 656 continue; | 682 continue; |
| 683 int return_code = 0; |
| 657 if (!browser_creator->LaunchBrowser((*it == last_used_profile) ? | 684 if (!browser_creator->LaunchBrowser((*it == last_used_profile) ? |
| 658 command_line : command_line_without_urls, *it, cur_dir, | 685 command_line : command_line_without_urls, *it, cur_dir, |
| 659 is_process_startup, is_first_run, return_code)) | 686 is_process_startup, is_first_run, &return_code)) { |
| 687 if (operation_output) |
| 688 OperationOutput::Complete(operation_output.Pass(), return_code); |
| 660 return false; | 689 return false; |
| 690 } |
| 661 // We've launched at least one browser. | 691 // We've launched at least one browser. |
| 662 is_process_startup = chrome::startup::IS_NOT_PROCESS_STARTUP; | 692 is_process_startup = chrome::startup::IS_NOT_PROCESS_STARTUP; |
| 663 } | 693 } |
| 664 // This must be done after all profiles have been launched so the observer | 694 // This must be done after all profiles have been launched so the observer |
| 665 // knows about all profiles to wait for before activating this one. | 695 // knows about all profiles to wait for before activating this one. |
| 666 profile_launch_observer.Get().set_profile_to_activate(last_used_profile); | 696 profile_launch_observer.Get().set_profile_to_activate(last_used_profile); |
| 667 } | 697 } |
| 698 if (operation_output) { |
| 699 OperationOutput::Complete(operation_output.Pass(), |
| 700 content::RESULT_CODE_NORMAL_EXIT); |
| 701 } |
| 668 return true; | 702 return true; |
| 669 } | 703 } |
| 670 | 704 |
| 671 template <class AutomationProviderClass> | 705 template <class AutomationProviderClass> |
| 672 bool StartupBrowserCreator::CreateAutomationProvider( | 706 bool StartupBrowserCreator::CreateAutomationProvider( |
| 673 const std::string& channel_id, | 707 const std::string& channel_id, |
| 674 Profile* profile, | 708 Profile* profile, |
| 675 size_t expected_tabs) { | 709 size_t expected_tabs) { |
| 676 #if defined(ENABLE_AUTOMATION) | 710 #if defined(ENABLE_AUTOMATION) |
| 677 scoped_refptr<AutomationProviderClass> automation = | 711 scoped_refptr<AutomationProviderClass> automation = |
| 678 new AutomationProviderClass(profile); | 712 new AutomationProviderClass(profile); |
| 679 if (!automation->InitializeChannel(channel_id)) | 713 if (!automation->InitializeChannel(channel_id)) |
| 680 return false; | 714 return false; |
| 681 automation->SetExpectedTabCount(expected_tabs); | 715 automation->SetExpectedTabCount(expected_tabs); |
| 682 | 716 |
| 683 AutomationProviderList* list = g_browser_process->GetAutomationProviderList(); | 717 AutomationProviderList* list = g_browser_process->GetAutomationProviderList(); |
| 684 DCHECK(list); | 718 DCHECK(list); |
| 685 list->AddProvider(automation); | 719 list->AddProvider(automation); |
| 686 #endif // defined(ENABLE_AUTOMATION) | 720 #endif // defined(ENABLE_AUTOMATION) |
| 687 | 721 |
| 688 return true; | 722 return true; |
| 689 } | 723 } |
| 690 | 724 |
| 691 // static | 725 // static |
| 692 void StartupBrowserCreator::ProcessCommandLineOnProfileCreated( | 726 void StartupBrowserCreator::ProcessCommandLineOnProfileCreated( |
| 693 const CommandLine& command_line, | 727 const CommandLine& command_line, |
| 694 const base::FilePath& cur_dir, | 728 const base::FilePath& cur_dir, |
| 729 scoped_ptr<OperationOutput> operation_output, |
| 695 Profile* profile, | 730 Profile* profile, |
| 696 Profile::CreateStatus status) { | 731 Profile::CreateStatus status) { |
| 697 if (status == Profile::CREATE_STATUS_INITIALIZED) | 732 if (status == Profile::CREATE_STATUS_INITIALIZED) { |
| 698 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, | 733 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, |
| 699 NULL); | 734 operation_output.Pass()); |
| 735 } else { |
| 736 // Signal failure on operation_output? |
| 737 } |
| 700 } | 738 } |
| 701 | 739 |
| 702 // static | 740 // static |
| 703 void StartupBrowserCreator::ProcessCommandLineAlreadyRunning( | 741 void StartupBrowserCreator::ProcessCommandLineAlreadyRunning( |
| 704 const CommandLine& command_line, | 742 const CommandLine& command_line, |
| 705 const base::FilePath& cur_dir, | 743 const base::FilePath& cur_dir, |
| 706 const base::FilePath& profile_path) { | 744 const base::FilePath& profile_path, |
| 745 scoped_ptr<OperationOutput> operation_output) { |
| 707 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 746 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
| 708 Profile* profile = profile_manager->GetProfileByPath(profile_path); | 747 Profile* profile = profile_manager->GetProfileByPath(profile_path); |
| 709 | 748 |
| 710 // The profile isn't loaded yet and so needs to be loaded asynchronously. | 749 // The profile isn't loaded yet and so needs to be loaded asynchronously. |
| 711 if (!profile) { | 750 if (!profile) { |
| 712 profile_manager->CreateProfileAsync(profile_path, | 751 profile_manager->CreateProfileAsync( |
| 713 base::Bind(&StartupBrowserCreator::ProcessCommandLineOnProfileCreated, | 752 profile_path, |
| 714 command_line, cur_dir), string16(), string16(), false); | 753 base::Bind( |
| 754 &StartupBrowserCreator::ProcessCommandLineOnProfileCreated, |
| 755 command_line, cur_dir, base::Passed(operation_output.Pass())), |
| 756 string16(), string16(), false); |
| 715 return; | 757 return; |
| 716 } | 758 } |
| 717 | 759 |
| 718 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, | 760 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, |
| 719 NULL); | 761 operation_output.Pass()); |
| 720 } | 762 } |
| 721 | 763 |
| 722 // static | 764 // static |
| 723 bool StartupBrowserCreator::ActivatedProfile() { | 765 bool StartupBrowserCreator::ActivatedProfile() { |
| 724 return profile_launch_observer.Get().activated_profile(); | 766 return profile_launch_observer.Get().activated_profile(); |
| 725 } | 767 } |
| 726 | 768 |
| 727 bool HasPendingUncleanExit(Profile* profile) { | 769 bool HasPendingUncleanExit(Profile* profile) { |
| 728 return profile->GetLastSessionExitType() == Profile::EXIT_CRASHED && | 770 return profile->GetLastSessionExitType() == Profile::EXIT_CRASHED && |
| 729 !profile_launch_observer.Get().HasBeenLaunched(profile); | 771 !profile_launch_observer.Get().HasBeenLaunched(profile); |
| 730 } | 772 } |
| OLD | NEW |