| 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 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 // The file is overwritten if it exists. This function should only be called in | 243 // The file is overwritten if it exists. This function should only be called in |
| 244 // the blocking pool. | 244 // the blocking pool. |
| 245 void DumpBrowserHistograms(const base::FilePath& output_file) { | 245 void DumpBrowserHistograms(const base::FilePath& output_file) { |
| 246 base::ThreadRestrictions::AssertIOAllowed(); | 246 base::ThreadRestrictions::AssertIOAllowed(); |
| 247 | 247 |
| 248 std::string output_string(base::StatisticsRecorder::ToJSON(std::string())); | 248 std::string output_string(base::StatisticsRecorder::ToJSON(std::string())); |
| 249 base::WriteFile(output_file, output_string.data(), | 249 base::WriteFile(output_file, output_string.data(), |
| 250 static_cast<int>(output_string.size())); | 250 static_cast<int>(output_string.size())); |
| 251 } | 251 } |
| 252 | 252 |
| 253 // Shows the User Manager on startup if the last used profile must sign in or |
| 254 // if the last used profile was the guest or system profile. |
| 255 // Returns true if the User Manager was shown, false otherwise. |
| 256 bool ShowUserManagerOnStartupIfNeeded( |
| 257 Profile* last_used_profile, const base::CommandLine& command_line) { |
| 258 #if defined(OS_CHROMEOS) |
| 259 // ChromeOS never shows the User Manager on startup. |
| 260 return false; |
| 261 #else |
| 262 const ProfileInfoCache& profile_info = |
| 263 g_browser_process->profile_manager()->GetProfileInfoCache(); |
| 264 size_t profile_index = profile_info.GetIndexOfProfileWithPath( |
| 265 last_used_profile->GetPath()); |
| 266 |
| 267 if (profile_index == std::string::npos || |
| 268 !profile_info.ProfileIsSigninRequiredAtIndex(profile_index)) { |
| 269 // Signin is not required. However, guest, system or locked profiles cannot |
| 270 // be re-opened on startup. The only exception is if there's already a Guest |
| 271 // window open in a separate process (for example, launching a new browser |
| 272 // after clicking on a downloaded file in Guest mode). |
| 273 if ((!last_used_profile->IsGuestSession() && |
| 274 !last_used_profile->IsSystemProfile()) || |
| 275 (chrome::GetTotalBrowserCountForProfile( |
| 276 last_used_profile->GetOffTheRecordProfile()) > 0)) { |
| 277 return false; |
| 278 } |
| 279 } |
| 280 |
| 281 // Show the User Manager. |
| 282 profiles::UserManagerProfileSelected action = |
| 283 command_line.HasSwitch(switches::kShowAppList) ? |
| 284 profiles::USER_MANAGER_SELECT_PROFILE_APP_LAUNCHER : |
| 285 profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION; |
| 286 UserManager::Show( |
| 287 base::FilePath(), profiles::USER_MANAGER_NO_TUTORIAL, action); |
| 288 return true; |
| 289 #endif |
| 290 } |
| 291 |
| 253 } // namespace | 292 } // namespace |
| 254 | 293 |
| 255 StartupBrowserCreator::StartupBrowserCreator() | 294 StartupBrowserCreator::StartupBrowserCreator() |
| 256 : is_default_browser_dialog_suppressed_(false), | 295 : is_default_browser_dialog_suppressed_(false), |
| 257 show_main_browser_window_(true) { | 296 show_main_browser_window_(true) { |
| 258 } | 297 } |
| 259 | 298 |
| 260 StartupBrowserCreator::~StartupBrowserCreator() {} | 299 StartupBrowserCreator::~StartupBrowserCreator() {} |
| 261 | 300 |
| 262 // static | 301 // static |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; | 703 chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN; |
| 665 // |last_opened_profiles| will be empty in the following circumstances: | 704 // |last_opened_profiles| will be empty in the following circumstances: |
| 666 // - This is the first launch. |last_used_profile| is the initial profile. | 705 // - This is the first launch. |last_used_profile| is the initial profile. |
| 667 // - The user exited the browser by closing all windows for all | 706 // - The user exited the browser by closing all windows for all |
| 668 // profiles. |last_used_profile| is the profile which owned the last open | 707 // profiles. |last_used_profile| is the profile which owned the last open |
| 669 // window. | 708 // window. |
| 670 // - Only incognito windows were open when the browser exited. | 709 // - Only incognito windows were open when the browser exited. |
| 671 // |last_used_profile| is the last used incognito profile. Restoring it will | 710 // |last_used_profile| is the last used incognito profile. Restoring it will |
| 672 // create a browser window for the corresponding original profile. | 711 // create a browser window for the corresponding original profile. |
| 673 if (last_opened_profiles.empty()) { | 712 if (last_opened_profiles.empty()) { |
| 674 // If the last used profile is locked or was a guest, show the user manager. | 713 if (ShowUserManagerOnStartupIfNeeded(last_used_profile, command_line)) |
| 675 if (switches::IsNewAvatarMenu()) { | 714 return true; |
| 676 ProfileInfoCache& profile_info = | |
| 677 g_browser_process->profile_manager()->GetProfileInfoCache(); | |
| 678 size_t profile_index = profile_info.GetIndexOfProfileWithPath( | |
| 679 last_used_profile->GetPath()); | |
| 680 bool signin_required = profile_index != std::string::npos && | |
| 681 profile_info.ProfileIsSigninRequiredAtIndex(profile_index); | |
| 682 | |
| 683 // Guest, system or locked profiles cannot be re-opened on startup. The | |
| 684 // only exception is if there's already a Guest window open in a separate | |
| 685 // process (for example, launching a new browser after clicking on a | |
| 686 // downloaded file in Guest mode). | |
| 687 bool guest_or_system = last_used_profile->IsGuestSession() || | |
| 688 last_used_profile->IsSystemProfile(); | |
| 689 bool has_guest_browsers = guest_or_system && | |
| 690 chrome::GetTotalBrowserCountForProfile( | |
| 691 last_used_profile->GetOffTheRecordProfile()) > 0; | |
| 692 if (signin_required || (guest_or_system && !has_guest_browsers)) { | |
| 693 profiles::UserManagerProfileSelected action = | |
| 694 command_line.HasSwitch(switches::kShowAppList) ? | |
| 695 profiles::USER_MANAGER_SELECT_PROFILE_APP_LAUNCHER : | |
| 696 profiles::USER_MANAGER_SELECT_PROFILE_NO_ACTION; | |
| 697 UserManager::Show( | |
| 698 base::FilePath(), profiles::USER_MANAGER_NO_TUTORIAL, action); | |
| 699 return true; | |
| 700 } | |
| 701 } | |
| 702 | 715 |
| 703 Profile* profile_to_open = last_used_profile->IsGuestSession() ? | 716 Profile* profile_to_open = last_used_profile->IsGuestSession() ? |
| 704 last_used_profile->GetOffTheRecordProfile() : last_used_profile; | 717 last_used_profile->GetOffTheRecordProfile() : last_used_profile; |
| 705 | 718 |
| 706 if (!browser_creator->LaunchBrowser(command_line, profile_to_open, | 719 if (!browser_creator->LaunchBrowser(command_line, profile_to_open, |
| 707 cur_dir, is_process_startup, | 720 cur_dir, is_process_startup, |
| 708 is_first_run)) { | 721 is_first_run)) { |
| 709 return false; | 722 return false; |
| 710 } | 723 } |
| 711 } else { | 724 } else { |
| 725 #if !defined(OS_CHROMEOS) |
| 712 // Guest profiles should not be reopened on startup. This can happen if | 726 // Guest profiles should not be reopened on startup. This can happen if |
| 713 // the last used profile was a Guest, but other profiles were also open | 727 // the last used profile was a Guest, but other profiles were also open |
| 714 // when Chrome was closed. In this case, pick a different open profile | 728 // when Chrome was closed. In this case, pick a different open profile |
| 715 // to be the active one, since the Guest profile is never added to the list | 729 // to be the active one, since the Guest profile is never added to the list |
| 716 // of open profiles. | 730 // of open profiles. |
| 717 if (switches::IsNewAvatarMenu() && last_used_profile->IsGuestSession()) { | 731 if (last_used_profile->IsGuestSession()) { |
| 718 DCHECK(!last_opened_profiles[0]->IsGuestSession()); | 732 DCHECK(!last_opened_profiles[0]->IsGuestSession()); |
| 719 last_used_profile = last_opened_profiles[0]; | 733 last_used_profile = last_opened_profiles[0]; |
| 720 } | 734 } |
| 735 #endif |
| 721 | 736 |
| 722 // Launch the last used profile with the full command line, and the other | 737 // Launch the last used profile with the full command line, and the other |
| 723 // opened profiles without the URLs to launch. | 738 // opened profiles without the URLs to launch. |
| 724 base::CommandLine command_line_without_urls(command_line.GetProgram()); | 739 base::CommandLine command_line_without_urls(command_line.GetProgram()); |
| 725 const base::CommandLine::SwitchMap& switches = command_line.GetSwitches(); | 740 const base::CommandLine::SwitchMap& switches = command_line.GetSwitches(); |
| 726 for (base::CommandLine::SwitchMap::const_iterator switch_it = | 741 for (base::CommandLine::SwitchMap::const_iterator switch_it = |
| 727 switches.begin(); | 742 switches.begin(); |
| 728 switch_it != switches.end(); ++switch_it) { | 743 switch_it != switches.end(); ++switch_it) { |
| 729 command_line_without_urls.AppendSwitchNative(switch_it->first, | 744 command_line_without_urls.AppendSwitchNative(switch_it->first, |
| 730 switch_it->second); | 745 switch_it->second); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 // If we are showing the app list then chrome isn't shown so load the app | 857 // If we are showing the app list then chrome isn't shown so load the app |
| 843 // list's profile rather than chrome's. | 858 // list's profile rather than chrome's. |
| 844 if (command_line.HasSwitch(switches::kShowAppList)) { | 859 if (command_line.HasSwitch(switches::kShowAppList)) { |
| 845 return AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE)-> | 860 return AppListService::Get(chrome::HOST_DESKTOP_TYPE_NATIVE)-> |
| 846 GetProfilePath(user_data_dir); | 861 GetProfilePath(user_data_dir); |
| 847 } | 862 } |
| 848 | 863 |
| 849 return g_browser_process->profile_manager()->GetLastUsedProfileDir( | 864 return g_browser_process->profile_manager()->GetLastUsedProfileDir( |
| 850 user_data_dir); | 865 user_data_dir); |
| 851 } | 866 } |
| OLD | NEW |