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

Unified Diff: chrome/browser/chrome_browser_main.cc

Issue 2047483003: Add fallback behavior if the last used profile cannot initialize (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bug-614753-fix
Patch Set: Rebase Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/app/generated_resources.grd ('k') | chrome/browser/ui/profile_error_dialog.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chrome_browser_main.cc
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 372835ac723201c3e81d8f1a66323a613054e845..769ea852ccd6dcfa83356c250b62d8f2e2cebd69 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -47,6 +47,7 @@
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/chrome_browser_main_extra_parts.h"
+#include "chrome/browser/component_updater/cld_component_installer.h"
WC Leung 2016/06/15 17:44:09 Didn't know why this line didn't go away in my reb
#include "chrome/browser/component_updater/ev_whitelist_component_installer.h"
#include "chrome/browser/component_updater/file_type_policies_component_installer.h"
#include "chrome/browser/component_updater/origin_trials_component_installer.h"
@@ -88,6 +89,8 @@
#include "chrome/browser/ui/app_modal/chrome_javascript_native_dialog_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/profile_error_dialog.h"
+#include "chrome/browser/ui/simple_message_box.h"
#include "chrome/browser/ui/startup/bad_flags_prompt.h"
#include "chrome/browser/ui/startup/default_browser_prompt.h"
#include "chrome/browser/ui/startup/startup_browser_creator.h"
@@ -391,7 +394,7 @@ Profile* CreatePrimaryProfile(const content::MainFunctionParams& parameters,
profile_list->Clear();
}
- Profile* profile = NULL;
+ Profile* profile = nullptr;
#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
// On ChromeOS and Android the ProfileManager will use the same path as the
// one we got passed. GetActiveUserProfile will therefore use the correct path
@@ -403,25 +406,87 @@ Profile* CreatePrimaryProfile(const content::MainFunctionParams& parameters,
base::FilePath profile_path =
GetStartupProfilePath(user_data_dir, parsed_command_line);
- profile = g_browser_process->profile_manager()->GetProfile(
- profile_path);
+ ProfileManager* profile_manager = g_browser_process->profile_manager();
+ profile = profile_manager->GetProfile(profile_path);
- // If we're using the --new-profile-management flag and this profile is
- // signed out, then we should show the user manager instead. By switching
- // the active profile to the guest profile we ensure that no
- // browser windows will be opened for the guest profile.
+ // If we're using the --new-profile-management flag and this profile is signed
+ // out, then we should show the user manager instead. By switching the active
+ // profile to the guest profile we ensure that no browser windows will be
+ // opened for the guest profile. The initialization of guest profile is
+ // possible to fail.
if (switches::IsNewProfileManagement() &&
profile &&
!profile->IsGuestSession()) {
ProfileAttributesEntry* entry;
- bool has_entry = g_browser_process->profile_manager()->
- GetProfileAttributesStorage().
- GetProfileAttributesWithPath(profile_path, &entry);
+ bool has_entry = g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .GetProfileAttributesWithPath(profile_path, &entry);
if (has_entry && entry->IsSigninRequired()) {
- profile = g_browser_process->profile_manager()->GetProfile(
- ProfileManager::GetGuestProfilePath());
+ profile = profile_manager->GetProfile(
+ ProfileManager::GetGuestProfilePath());
}
}
+
+ // If the user specified a profile and it fails to initialize, do not start
+ // chromium.
+ if (profiles::IsMultipleProfilesEnabled() &&
+ parsed_command_line.HasSwitch(switches::kProfileDirectory) &&
+ !profile) {
+ ShowProfileErrorDialog(PROFILE_ERROR_CREATE_FAILURE_SPECIFIED,
+ IDS_COULDNT_OPEN_SPECIFIED_PROFILE_ERROR);
+ return nullptr;
+ }
+
+ // If the last used profile is unable to initialize, see if any of other last
+ // opened profiles can initialize successfully. At this stage we assume
+ // creation of all new profile (including guest profile) to fail.
+ if (!profile) {
+ std::vector<Profile*> last_opened_profiles =
+ ProfileManager::GetLastOpenedProfiles();
+ // Get the first profile that is not signed out..
+ if (last_opened_profiles.size()) {
+ for (Profile* last_opened_profile : last_opened_profiles) {
+ ProfileAttributesEntry* entry;
+ bool has_entry =
+ g_browser_process->profile_manager()
+ ->GetProfileAttributesStorage()
+ .GetProfileAttributesWithPath(profile->GetPath(),
+ &entry);
+ if (!has_entry || !entry->IsSigninRequired()) {
+ profile = last_opened_profile;
+ break;
+ }
+ }
+ }
+ }
+
+ // If it still fails, try to create a guest profile. Show the user manager
+ // if this is successful.
+ if (!profile) {
+ profile = profile_manager->GetProfile(
+ ProfileManager::GetGuestProfilePath());
+ }
+
+ // If still fails, try to open any non-signin profile.
+ if (!profile) {
+ std::vector<ProfileAttributesEntry*> entries =
+ profile_manager->GetProfileAttributesStorage()
+ .GetAllProfilesAttributes();
+ for (ProfileAttributesEntry* entry : entries) {
+ if (!entry->IsSigninRequired()) {
+ profile = profile_manager->GetProfile(entry->GetPath());
+ if (profile)
+ break;
+ }
+ }
+ }
+
+ // If it continues to fail, we have to show an error message and give up.
+ if (!profile) {
+ ShowProfileErrorDialog(PROFILE_ERROR_CREATE_FAILURE_ALL,
+ IDS_COULDNT_OPEN_ANY_PROFILE_ERROR);
+ return nullptr;
+ }
#endif // defined(OS_CHROMEOS) || defined(OS_ANDROID)
if (profile) {
UMA_HISTOGRAM_LONG_TIMES(
@@ -429,14 +494,12 @@ Profile* CreatePrimaryProfile(const content::MainFunctionParams& parameters,
return profile;
}
-#if !defined(OS_WIN)
// TODO(port): fix this. See comments near the definition of
// user_data_dir. It is better to CHECK-fail here than it is to
// silently exit because of missing code in the above test.
CHECK(profile) << "Cannot get default profile.";
-#endif // !defined(OS_WIN)
- return NULL;
+ return nullptr;
}
#if defined(OS_MACOSX)
« no previous file with comments | « chrome/app/generated_resources.grd ('k') | chrome/browser/ui/profile_error_dialog.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698