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

Side by Side Diff: chrome/browser/profiles/profile_manager.cc

Issue 14923004: [Mac] AppController needs to update its "last profile" pointer when the active profile is deleted (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Drive-by fixes Created 7 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
« no previous file with comments | « chrome/browser/profiles/profile_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/profiles/profile_manager.h" 5 #include "chrome/browser/profiles/profile_manager.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 return go_off_the_record; 1061 return go_off_the_record;
1062 } 1062 }
1063 1063
1064 // TODO(robertshield): ProfileManager should not be opening windows and should 1064 // TODO(robertshield): ProfileManager should not be opening windows and should
1065 // not have to care about HostDesktopType. See http://crbug.com/153864 1065 // not have to care about HostDesktopType. See http://crbug.com/153864
1066 void ProfileManager::ScheduleProfileForDeletion( 1066 void ProfileManager::ScheduleProfileForDeletion(
1067 const base::FilePath& profile_dir, 1067 const base::FilePath& profile_dir,
1068 chrome::HostDesktopType desktop_type) { 1068 chrome::HostDesktopType desktop_type) {
1069 DCHECK(IsMultipleProfilesEnabled()); 1069 DCHECK(IsMultipleProfilesEnabled());
1070 1070
1071 bool new_last_profile_being_loaded = false;
Alexei Svitkine (slow) 2013/05/14 15:34:12 Instead of keeping track of this here, just do an
noms (inactive) 2013/06/05 18:16:38 Done.
1072 size_t last_non_managed_profile_index;
1073
1071 PrefService* local_state = g_browser_process->local_state(); 1074 PrefService* local_state = g_browser_process->local_state();
1072 ProfileInfoCache& cache = GetProfileInfoCache(); 1075 ProfileInfoCache& cache = GetProfileInfoCache();
1073 if (profile_dir.BaseName().MaybeAsASCII() == 1076 if (profile_dir.BaseName().MaybeAsASCII() ==
1074 local_state->GetString(prefs::kProfileLastUsed)) { 1077 local_state->GetString(prefs::kProfileLastUsed)) {
1075 // Update the last used profile pref before closing browser windows. This 1078 // Update the last used profile pref before closing browser windows. This
1076 // way the correct last used profile is set for any notification observers. 1079 // way the correct last used profile is set for any notification observers.
1077 std::string last_non_managed_profile; 1080 std::string last_non_managed_profile;
1078 for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) { 1081 for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) {
1079 base::FilePath cur_path = cache.GetPathOfProfileAtIndex(i); 1082 base::FilePath cur_path = cache.GetPathOfProfileAtIndex(i);
1080 if (cur_path != profile_dir && !cache.ProfileIsManagedAtIndex(i)) { 1083 if (cur_path != profile_dir && !cache.ProfileIsManagedAtIndex(i)) {
1081 last_non_managed_profile = cur_path.BaseName().MaybeAsASCII(); 1084 last_non_managed_profile = cur_path.BaseName().MaybeAsASCII();
1085 last_non_managed_profile_index = i;
1082 break; 1086 break;
1083 } 1087 }
1084 } 1088 }
1085 // If we're deleting the last (non-managed) profile, then create a new 1089 // If we're deleting the last (non-managed) profile, then create a new
1086 // profile in its place. 1090 // profile in its place.
1087 if (last_non_managed_profile.empty()) { 1091 if (last_non_managed_profile.empty()) {
1088 base::FilePath new_path = GenerateNextProfileDirectoryPath(); 1092 base::FilePath new_path = GenerateNextProfileDirectoryPath();
1089 // Make sure the last used profile path is pointing at it. This way the 1093 // Make sure the last used profile path is pointing at it. This way the
1090 // correct last used profile is set for any notification observers. 1094 // correct last used profile is set for any notification observers.
1091 local_state->SetString(prefs::kProfileLastUsed, 1095 local_state->SetString(prefs::kProfileLastUsed,
1092 new_path.BaseName().MaybeAsASCII()); 1096 new_path.BaseName().MaybeAsASCII());
1093 // TODO(robertshield): This desktop type needs to come from the invoker, 1097 // TODO(robertshield): This desktop type needs to come from the invoker,
1094 // currently that involves plumbing this through web UI. 1098 // currently that involves plumbing this through web UI.
1095 chrome::HostDesktopType desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE; 1099 chrome::HostDesktopType desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE;
1096 CreateProfileAsync(new_path, 1100 CreateProfileAsync(new_path,
1097 base::Bind(&OnOpenWindowForNewProfile, 1101 base::Bind(&OnOpenWindowForNewProfile,
1098 desktop_type, 1102 desktop_type,
1099 CreateCallback()), 1103 CreateCallback()),
1100 string16(), 1104 string16(),
1101 string16(), 1105 string16(),
1102 false); 1106 false);
1103 } else { 1107 } else {
1104 local_state->SetString(prefs::kProfileLastUsed, last_non_managed_profile); 1108 local_state->SetString(prefs::kProfileLastUsed, last_non_managed_profile);
1109
1110 // On the Mac, the browser process is not killed when all browser windows
1111 // are closed, so just in case we are deleting the active profile, and no
1112 // other profile has been loaded, we must pre-load a next one.
1113 #if defined(OS_MACOSX)
1114 new_last_profile_being_loaded = true;
1115 base::FilePath path = profile_info_cache_->GetPathOfProfileAtIndex(
1116 last_non_managed_profile_index);
Alexei Svitkine (slow) 2013/05/14 15:34:12 If you're just going to query the path of that pro
noms (inactive) 2013/06/05 18:16:38 Done.
1117 CreateProfileAsync(path,
1118 base::Bind(&ProfileManager::OnNewActiveProfileLoaded,
Alexei Svitkine (slow) 2013/05/14 15:34:12 Hmm, this may be tricky. I think you should loop i
noms (inactive) 2013/06/05 18:16:38 Done most of the comments. Working on the tests.
1119 base::Unretained(this),
1120 profile_dir),
1121 string16(),
1122 string16(),
1123 false);
1124 #endif
1105 } 1125 }
1106 } 1126 }
1107 1127
1128 if (!new_last_profile_being_loaded)
1129 FinishDeletingProfile(profile_dir);
1130 }
1131
1132 void ProfileManager::OnNewActiveProfileLoaded(const base::FilePath& profile_dir,
1133 Profile* profile,
1134 Profile::CreateStatus status) {
1135 // Ensure we only call the callback once per profile creation.
1136 if (status == Profile::CREATE_STATUS_INITIALIZED)
1137 FinishDeletingProfile(profile_dir);
1138 }
1139
1140 void ProfileManager::FinishDeletingProfile(const base::FilePath& profile_dir) {
1141 ProfileInfoCache& cache = GetProfileInfoCache();
1108 // TODO(sail): Due to bug 88586 we don't delete the profile instance. Once we 1142 // TODO(sail): Due to bug 88586 we don't delete the profile instance. Once we
1109 // start deleting the profile instance we need to close background apps too. 1143 // start deleting the profile instance we need to close background apps too.
1110 Profile* profile = GetProfileByPath(profile_dir); 1144 Profile* profile = GetProfileByPath(profile_dir);
1111 if (profile) { 1145 if (profile) {
1112 BrowserList::CloseAllBrowsersWithProfile(profile); 1146 BrowserList::CloseAllBrowsersWithProfile(profile);
1113 1147
1114 // Disable sync for doomed profile. 1148 // Disable sync for doomed profile.
1115 if (ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService( 1149 if (ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService(
1116 profile)) { 1150 profile)) {
1117 ProfileSyncServiceFactory::GetInstance()->GetForProfile( 1151 ProfileSyncServiceFactory::GetInstance()->GetForProfile(
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1185 ProfileManager::ProfileInfo::ProfileInfo( 1219 ProfileManager::ProfileInfo::ProfileInfo(
1186 Profile* profile, 1220 Profile* profile,
1187 bool created) 1221 bool created)
1188 : profile(profile), 1222 : profile(profile),
1189 created(created) { 1223 created(created) {
1190 } 1224 }
1191 1225
1192 ProfileManager::ProfileInfo::~ProfileInfo() { 1226 ProfileManager::ProfileInfo::~ProfileInfo() {
1193 ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release()); 1227 ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release());
1194 } 1228 }
OLDNEW
« no previous file with comments | « chrome/browser/profiles/profile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698