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 "apps/app_load_service.h" | 10 #include "apps/app_load_service.h" |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 void StartupBrowserCreator::AddFirstRunTab(const GURL& url) { | 265 void StartupBrowserCreator::AddFirstRunTab(const GURL& url) { |
266 first_run_tabs_.push_back(url); | 266 first_run_tabs_.push_back(url); |
267 } | 267 } |
268 | 268 |
269 // static | 269 // static |
270 bool StartupBrowserCreator::InSynchronousProfileLaunch() { | 270 bool StartupBrowserCreator::InSynchronousProfileLaunch() { |
271 return in_synchronous_profile_launch_; | 271 return in_synchronous_profile_launch_; |
272 } | 272 } |
273 | 273 |
274 bool StartupBrowserCreator::LaunchBrowser( | 274 bool StartupBrowserCreator::LaunchBrowser( |
275 const CommandLine& command_line, | 275 const base::CommandLine& command_line, |
276 Profile* profile, | 276 Profile* profile, |
277 const base::FilePath& cur_dir, | 277 const base::FilePath& cur_dir, |
278 chrome::startup::IsProcessStartup process_startup, | 278 chrome::startup::IsProcessStartup process_startup, |
279 chrome::startup::IsFirstRun is_first_run, | 279 chrome::startup::IsFirstRun is_first_run, |
280 int* return_code) { | 280 int* return_code) { |
281 | |
282 in_synchronous_profile_launch_ = | 281 in_synchronous_profile_launch_ = |
283 process_startup == chrome::startup::IS_PROCESS_STARTUP; | 282 process_startup == chrome::startup::IS_PROCESS_STARTUP; |
284 DCHECK(profile); | 283 DCHECK(profile); |
285 | 284 |
286 // Continue with the incognito profile from here on if Incognito mode | 285 // Continue with the incognito profile from here on if Incognito mode |
287 // is forced. | 286 // is forced. |
288 if (IncognitoModePrefs::ShouldLaunchIncognito(command_line, | 287 if (IncognitoModePrefs::ShouldLaunchIncognito(command_line, |
289 profile->GetPrefs())) { | 288 profile->GetPrefs())) { |
290 profile = profile->GetOffTheRecordProfile(); | 289 profile = profile->GetOffTheRecordProfile(); |
291 } else if (command_line.HasSwitch(switches::kIncognito)) { | 290 } else if (command_line.HasSwitch(switches::kIncognito)) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 PrefService* pref_service = g_browser_process->local_state(); | 345 PrefService* pref_service = g_browser_process->local_state(); |
347 was_restarted = pref_service->GetBoolean(prefs::kWasRestarted); | 346 was_restarted = pref_service->GetBoolean(prefs::kWasRestarted); |
348 pref_service->SetBoolean(prefs::kWasRestarted, false); | 347 pref_service->SetBoolean(prefs::kWasRestarted, false); |
349 was_restarted_read_ = true; | 348 was_restarted_read_ = true; |
350 } | 349 } |
351 return was_restarted; | 350 return was_restarted; |
352 } | 351 } |
353 | 352 |
354 // static | 353 // static |
355 SessionStartupPref StartupBrowserCreator::GetSessionStartupPref( | 354 SessionStartupPref StartupBrowserCreator::GetSessionStartupPref( |
356 const CommandLine& command_line, | 355 const base::CommandLine& command_line, |
357 Profile* profile) { | 356 Profile* profile) { |
358 DCHECK(profile); | 357 DCHECK(profile); |
359 PrefService* prefs = profile->GetPrefs(); | 358 PrefService* prefs = profile->GetPrefs(); |
360 SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs); | 359 SessionStartupPref pref = SessionStartupPref::GetStartupPref(prefs); |
361 | 360 |
362 // IsChromeFirstRun() looks for a sentinel file to determine whether the user | 361 // IsChromeFirstRun() looks for a sentinel file to determine whether the user |
363 // is starting Chrome for the first time. On Chrome OS, the sentinel is stored | 362 // is starting Chrome for the first time. On Chrome OS, the sentinel is stored |
364 // in a location shared by all users and the check is meaningless. Query the | 363 // in a location shared by all users and the check is meaningless. Query the |
365 // UserManager instead to determine whether the user is new. | 364 // UserManager instead to determine whether the user is new. |
366 #if defined(OS_CHROMEOS) | 365 #if defined(OS_CHROMEOS) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 return pref; | 415 return pref; |
417 } | 416 } |
418 | 417 |
419 // static | 418 // static |
420 void StartupBrowserCreator::ClearLaunchedProfilesForTesting() { | 419 void StartupBrowserCreator::ClearLaunchedProfilesForTesting() { |
421 profile_launch_observer.Get().Clear(); | 420 profile_launch_observer.Get().Clear(); |
422 } | 421 } |
423 | 422 |
424 // static | 423 // static |
425 std::vector<GURL> StartupBrowserCreator::GetURLsFromCommandLine( | 424 std::vector<GURL> StartupBrowserCreator::GetURLsFromCommandLine( |
426 const CommandLine& command_line, | 425 const base::CommandLine& command_line, |
427 const base::FilePath& cur_dir, | 426 const base::FilePath& cur_dir, |
428 Profile* profile) { | 427 Profile* profile) { |
429 std::vector<GURL> urls; | 428 std::vector<GURL> urls; |
430 | 429 |
431 const CommandLine::StringVector& params = command_line.GetArgs(); | 430 const base::CommandLine::StringVector& params = command_line.GetArgs(); |
432 for (size_t i = 0; i < params.size(); ++i) { | 431 for (size_t i = 0; i < params.size(); ++i) { |
433 base::FilePath param = base::FilePath(params[i]); | 432 base::FilePath param = base::FilePath(params[i]); |
434 // Handle Vista way of searching - "? <search-term>" | 433 // Handle Vista way of searching - "? <search-term>" |
435 if ((param.value().size() > 2) && (param.value()[0] == '?') && | 434 if ((param.value().size() > 2) && (param.value()[0] == '?') && |
436 (param.value()[1] == ' ')) { | 435 (param.value()[1] == ' ')) { |
437 GURL url(GetDefaultSearchURLForSearchTerms( | 436 GURL url(GetDefaultSearchURLForSearchTerms( |
438 TemplateURLServiceFactory::GetForProfile(profile), | 437 TemplateURLServiceFactory::GetForProfile(profile), |
439 param.LossyDisplayName().substr(2))); | 438 param.LossyDisplayName().substr(2))); |
440 if (url.is_valid()) { | 439 if (url.is_valid()) { |
441 urls.push_back(url); | 440 urls.push_back(url); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 (url.spec().compare(url::kAboutBlankURL) == 0)) { | 473 (url.spec().compare(url::kAboutBlankURL) == 0)) { |
475 urls.push_back(url); | 474 urls.push_back(url); |
476 } | 475 } |
477 } | 476 } |
478 } | 477 } |
479 return urls; | 478 return urls; |
480 } | 479 } |
481 | 480 |
482 // static | 481 // static |
483 bool StartupBrowserCreator::ProcessCmdLineImpl( | 482 bool StartupBrowserCreator::ProcessCmdLineImpl( |
484 const CommandLine& command_line, | 483 const base::CommandLine& command_line, |
485 const base::FilePath& cur_dir, | 484 const base::FilePath& cur_dir, |
486 bool process_startup, | 485 bool process_startup, |
487 Profile* last_used_profile, | 486 Profile* last_used_profile, |
488 const Profiles& last_opened_profiles, | 487 const Profiles& last_opened_profiles, |
489 int* return_code, | 488 int* return_code, |
490 StartupBrowserCreator* browser_creator) { | 489 StartupBrowserCreator* browser_creator) { |
491 VLOG(2) << "ProcessCmdLineImpl : BEGIN"; | 490 VLOG(2) << "ProcessCmdLineImpl : BEGIN"; |
492 DCHECK(last_used_profile); | 491 DCHECK(last_used_profile); |
493 if (process_startup) { | 492 if (process_startup) { |
494 if (command_line.HasSwitch(switches::kDisablePromptOnRepost)) | 493 if (command_line.HasSwitch(switches::kDisablePromptOnRepost)) |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 // background page of apps. Tracked at http://crbug.com/175381 | 623 // background page of apps. Tracked at http://crbug.com/175381 |
625 if (chrome::GetTotalBrowserCountForProfile(last_used_profile) != 0) | 624 if (chrome::GetTotalBrowserCountForProfile(last_used_profile) != 0) |
626 return true; | 625 return true; |
627 } | 626 } |
628 | 627 |
629 VLOG(2) << "ProcessCmdLineImpl: PLACE 4.B"; | 628 VLOG(2) << "ProcessCmdLineImpl: PLACE 4.B"; |
630 // Check for --load-and-launch-app. | 629 // Check for --load-and-launch-app. |
631 if (command_line.HasSwitch(apps::kLoadAndLaunchApp) && | 630 if (command_line.HasSwitch(apps::kLoadAndLaunchApp) && |
632 !IncognitoModePrefs::ShouldLaunchIncognito( | 631 !IncognitoModePrefs::ShouldLaunchIncognito( |
633 command_line, last_used_profile->GetPrefs())) { | 632 command_line, last_used_profile->GetPrefs())) { |
634 CommandLine::StringType path = command_line.GetSwitchValueNative( | 633 base::CommandLine::StringType path = |
635 apps::kLoadAndLaunchApp); | 634 command_line.GetSwitchValueNative(apps::kLoadAndLaunchApp); |
636 | 635 |
637 if (!apps::AppLoadService::Get(last_used_profile)->LoadAndLaunch( | 636 if (!apps::AppLoadService::Get(last_used_profile)->LoadAndLaunch( |
638 base::FilePath(path), command_line, cur_dir)) { | 637 base::FilePath(path), command_line, cur_dir)) { |
639 return false; | 638 return false; |
640 } | 639 } |
641 | 640 |
642 // Return early here since we don't want to open a browser window. | 641 // Return early here since we don't want to open a browser window. |
643 // The exception is when there are no browser windows, since we don't want | 642 // The exception is when there are no browser windows, since we don't want |
644 // chrome to shut down. | 643 // chrome to shut down. |
645 // TODO(jackhou): Do this properly once keep-alive is handled by the | 644 // TODO(jackhou): Do this properly once keep-alive is handled by the |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 // when Chrome was closed. In this case, pick a different open profile | 726 // when Chrome was closed. In this case, pick a different open profile |
728 // to be the active one, since the Guest profile is never added to the list | 727 // to be the active one, since the Guest profile is never added to the list |
729 // of open profiles. | 728 // of open profiles. |
730 if (switches::IsNewAvatarMenu() && last_used_profile->IsGuestSession()) { | 729 if (switches::IsNewAvatarMenu() && last_used_profile->IsGuestSession()) { |
731 DCHECK(!last_opened_profiles[0]->IsGuestSession()); | 730 DCHECK(!last_opened_profiles[0]->IsGuestSession()); |
732 last_used_profile = last_opened_profiles[0]; | 731 last_used_profile = last_opened_profiles[0]; |
733 } | 732 } |
734 | 733 |
735 // Launch the last used profile with the full command line, and the other | 734 // Launch the last used profile with the full command line, and the other |
736 // opened profiles without the URLs to launch. | 735 // opened profiles without the URLs to launch. |
737 CommandLine command_line_without_urls(command_line.GetProgram()); | 736 base::CommandLine command_line_without_urls(command_line.GetProgram()); |
738 const CommandLine::SwitchMap& switches = command_line.GetSwitches(); | 737 const base::CommandLine::SwitchMap& switches = command_line.GetSwitches(); |
739 for (CommandLine::SwitchMap::const_iterator switch_it = switches.begin(); | 738 for (base::CommandLine::SwitchMap::const_iterator switch_it = |
| 739 switches.begin(); |
740 switch_it != switches.end(); ++switch_it) { | 740 switch_it != switches.end(); ++switch_it) { |
741 command_line_without_urls.AppendSwitchNative(switch_it->first, | 741 command_line_without_urls.AppendSwitchNative(switch_it->first, |
742 switch_it->second); | 742 switch_it->second); |
743 } | 743 } |
744 VLOG(2) << "ProcessCmdLineImpl: PLACE 7.B"; | 744 VLOG(2) << "ProcessCmdLineImpl: PLACE 7.B"; |
745 // Launch the profiles in the order they became active. | 745 // Launch the profiles in the order they became active. |
746 for (Profiles::const_iterator it = last_opened_profiles.begin(); | 746 for (Profiles::const_iterator it = last_opened_profiles.begin(); |
747 it != last_opened_profiles.end(); ++it) { | 747 it != last_opened_profiles.end(); ++it) { |
748 DCHECK(!(*it)->IsGuestSession()); | 748 DCHECK(!(*it)->IsGuestSession()); |
749 // Don't launch additional profiles which would only open a new tab | 749 // Don't launch additional profiles which would only open a new tab |
(...skipping 16 matching lines...) Expand all Loading... |
766 VLOG(2) << "ProcessCmdLineImpl: PLACE 8.B"; | 766 VLOG(2) << "ProcessCmdLineImpl: PLACE 8.B"; |
767 // This must be done after all profiles have been launched so the observer | 767 // This must be done after all profiles have been launched so the observer |
768 // knows about all profiles to wait for before activating this one. | 768 // knows about all profiles to wait for before activating this one. |
769 profile_launch_observer.Get().set_profile_to_activate(last_used_profile); | 769 profile_launch_observer.Get().set_profile_to_activate(last_used_profile); |
770 } | 770 } |
771 VLOG(2) << "ProcessCmdLineImpl: END"; | 771 VLOG(2) << "ProcessCmdLineImpl: END"; |
772 return true; | 772 return true; |
773 } | 773 } |
774 | 774 |
775 // static | 775 // static |
776 bool StartupBrowserCreator::ProcessLoadApps(const CommandLine& command_line, | 776 bool StartupBrowserCreator::ProcessLoadApps( |
777 const base::FilePath& cur_dir, | 777 const base::CommandLine& command_line, |
778 Profile* profile) { | 778 const base::FilePath& cur_dir, |
779 CommandLine::StringType path_list = | 779 Profile* profile) { |
| 780 base::CommandLine::StringType path_list = |
780 command_line.GetSwitchValueNative(extensions::switches::kLoadApps); | 781 command_line.GetSwitchValueNative(extensions::switches::kLoadApps); |
781 | 782 |
782 base::StringTokenizerT<CommandLine::StringType, | 783 base::StringTokenizerT<base::CommandLine::StringType, |
783 CommandLine::StringType::const_iterator> | 784 base::CommandLine::StringType::const_iterator> |
784 tokenizer(path_list, FILE_PATH_LITERAL(",")); | 785 tokenizer(path_list, FILE_PATH_LITERAL(",")); |
785 | 786 |
786 if (!tokenizer.GetNext()) | 787 if (!tokenizer.GetNext()) |
787 return false; | 788 return false; |
788 | 789 |
789 base::FilePath app_absolute_dir = | 790 base::FilePath app_absolute_dir = |
790 base::MakeAbsoluteFilePath(base::FilePath(tokenizer.token())); | 791 base::MakeAbsoluteFilePath(base::FilePath(tokenizer.token())); |
791 if (!apps::AppLoadService::Get(profile)->LoadAndLaunch( | 792 if (!apps::AppLoadService::Get(profile)->LoadAndLaunch( |
792 app_absolute_dir, command_line, cur_dir)) { | 793 app_absolute_dir, command_line, cur_dir)) { |
793 return false; | 794 return false; |
794 } | 795 } |
795 | 796 |
796 while (tokenizer.GetNext()) { | 797 while (tokenizer.GetNext()) { |
797 app_absolute_dir = | 798 app_absolute_dir = |
798 base::MakeAbsoluteFilePath(base::FilePath(tokenizer.token())); | 799 base::MakeAbsoluteFilePath(base::FilePath(tokenizer.token())); |
799 | 800 |
800 if (!apps::AppLoadService::Get(profile)->Load(app_absolute_dir)) { | 801 if (!apps::AppLoadService::Get(profile)->Load(app_absolute_dir)) { |
801 return false; | 802 return false; |
802 } | 803 } |
803 } | 804 } |
804 | 805 |
805 return true; | 806 return true; |
806 } | 807 } |
807 | 808 |
808 // static | 809 // static |
809 void StartupBrowserCreator::ProcessCommandLineOnProfileCreated( | 810 void StartupBrowserCreator::ProcessCommandLineOnProfileCreated( |
810 const CommandLine& command_line, | 811 const base::CommandLine& command_line, |
811 const base::FilePath& cur_dir, | 812 const base::FilePath& cur_dir, |
812 Profile* profile, | 813 Profile* profile, |
813 Profile::CreateStatus status) { | 814 Profile::CreateStatus status) { |
814 if (status == Profile::CREATE_STATUS_INITIALIZED) | 815 if (status == Profile::CREATE_STATUS_INITIALIZED) |
815 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, | 816 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, |
816 NULL); | 817 NULL); |
817 } | 818 } |
818 | 819 |
819 // static | 820 // static |
820 void StartupBrowserCreator::ProcessCommandLineAlreadyRunning( | 821 void StartupBrowserCreator::ProcessCommandLineAlreadyRunning( |
821 const CommandLine& command_line, | 822 const base::CommandLine& command_line, |
822 const base::FilePath& cur_dir, | 823 const base::FilePath& cur_dir, |
823 const base::FilePath& profile_path) { | 824 const base::FilePath& profile_path) { |
824 ProfileManager* profile_manager = g_browser_process->profile_manager(); | 825 ProfileManager* profile_manager = g_browser_process->profile_manager(); |
825 Profile* profile = profile_manager->GetProfileByPath(profile_path); | 826 Profile* profile = profile_manager->GetProfileByPath(profile_path); |
826 | 827 |
827 // The profile isn't loaded yet and so needs to be loaded asynchronously. | 828 // The profile isn't loaded yet and so needs to be loaded asynchronously. |
828 if (!profile) { | 829 if (!profile) { |
829 profile_manager->CreateProfileAsync(profile_path, | 830 profile_manager->CreateProfileAsync(profile_path, |
830 base::Bind(&StartupBrowserCreator::ProcessCommandLineOnProfileCreated, | 831 base::Bind(&StartupBrowserCreator::ProcessCommandLineOnProfileCreated, |
831 command_line, cur_dir), base::string16(), base::string16(), | 832 command_line, cur_dir), base::string16(), base::string16(), |
832 std::string()); | 833 std::string()); |
833 return; | 834 return; |
834 } | 835 } |
835 | 836 |
836 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, | 837 ProcessCmdLineImpl(command_line, cur_dir, false, profile, Profiles(), NULL, |
837 NULL); | 838 NULL); |
838 } | 839 } |
839 | 840 |
840 // static | 841 // static |
841 bool StartupBrowserCreator::ActivatedProfile() { | 842 bool StartupBrowserCreator::ActivatedProfile() { |
842 return profile_launch_observer.Get().activated_profile(); | 843 return profile_launch_observer.Get().activated_profile(); |
843 } | 844 } |
844 | 845 |
845 bool HasPendingUncleanExit(Profile* profile) { | 846 bool HasPendingUncleanExit(Profile* profile) { |
846 return profile->GetLastSessionExitType() == Profile::EXIT_CRASHED && | 847 return profile->GetLastSessionExitType() == Profile::EXIT_CRASHED && |
847 !profile_launch_observer.Get().HasBeenLaunched(profile); | 848 !profile_launch_observer.Get().HasBeenLaunched(profile); |
848 } | 849 } |
849 | 850 |
850 base::FilePath GetStartupProfilePath(const base::FilePath& user_data_dir, | 851 base::FilePath GetStartupProfilePath(const base::FilePath& user_data_dir, |
851 const CommandLine& command_line) { | 852 const base::CommandLine& command_line) { |
852 if (command_line.HasSwitch(switches::kProfileDirectory)) { | 853 if (command_line.HasSwitch(switches::kProfileDirectory)) { |
853 return user_data_dir.Append( | 854 return user_data_dir.Append( |
854 command_line.GetSwitchValuePath(switches::kProfileDirectory)); | 855 command_line.GetSwitchValuePath(switches::kProfileDirectory)); |
855 } | 856 } |
856 | 857 |
857 // If we are showing the app list then chrome isn't shown so load the app | 858 // If we are showing the app list then chrome isn't shown so load the app |
858 // list's profile rather than chrome's. | 859 // list's profile rather than chrome's. |
859 if (command_line.HasSwitch(switches::kShowAppList)) { | 860 if (command_line.HasSwitch(switches::kShowAppList)) { |
860 return AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE)-> | 861 return AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE)-> |
861 GetProfilePath(user_data_dir); | 862 GetProfilePath(user_data_dir); |
862 } | 863 } |
863 | 864 |
864 return g_browser_process->profile_manager()->GetLastUsedProfileDir( | 865 return g_browser_process->profile_manager()->GetLastUsedProfileDir( |
865 user_data_dir); | 866 user_data_dir); |
866 } | 867 } |
OLD | NEW |