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

Unified 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: fix recursive call and add test for it Created 7 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/browser/profiles/profile_manager.h ('k') | chrome/browser/profiles/profile_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/profile_manager.cc
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index dc5a0d1d38d0e79d9ea41e8510af4af1ffd4a782..186a532542028ae367a1d0ca5501a2de2c7e810d 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1043,23 +1043,30 @@ void ProfileManager::ScheduleProfileForDeletion(
const base::FilePath& profile_dir,
const CreateCallback& callback) {
DCHECK(IsMultipleProfilesEnabled());
-
PrefService* local_state = g_browser_process->local_state();
ProfileInfoCache& cache = GetProfileInfoCache();
+
if (profile_dir.BaseName().MaybeAsASCII() ==
local_state->GetString(prefs::kProfileLastUsed)) {
// Update the last used profile pref before closing browser windows. This
// way the correct last used profile is set for any notification observers.
- std::string last_non_managed_profile;
+ base::FilePath last_non_managed_profile_path;
for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) {
base::FilePath cur_path = cache.GetPathOfProfileAtIndex(i);
- if (cur_path != profile_dir && !cache.ProfileIsManagedAtIndex(i)) {
- last_non_managed_profile = cur_path.BaseName().MaybeAsASCII();
+ // Make sure that this profile is not pending deletion.
+ bool is_marked_for_deletion = std::find(ProfilesToDelete().begin(),
+ ProfilesToDelete().end(), cur_path) != ProfilesToDelete().end();
Alexei Svitkine (slow) 2013/06/18 21:45:57 Can you make a helper function for this, since it'
noms (inactive) 2013/06/18 22:19:56 Done.
+ if (cur_path != profile_dir && !cache.ProfileIsManagedAtIndex(i) &&
+ !is_marked_for_deletion) {
+ last_non_managed_profile_path = cur_path;
break;
}
}
+
// If we're deleting the last (non-managed) profile, then create a new
// profile in its place.
+ const std::string last_non_managed_profile =
+ last_non_managed_profile_path.BaseName().MaybeAsASCII();
if (last_non_managed_profile.empty()) {
base::FilePath new_path = GenerateNextProfileDirectoryPath();
// Make sure the last used profile path is pointing at it. This way the
@@ -1072,13 +1079,63 @@ void ProfileManager::ScheduleProfileForDeletion(
string16(),
false);
} else {
+ // On the Mac, the browser process is not killed when all browser windows
+ // are closed, so just in case we are deleting the active profile, and no
+ // other profile has been loaded, we must pre-load a next one.
+#if defined(OS_MACOSX)
+ CreateProfileAsync(last_non_managed_profile_path,
+ base::Bind(&ProfileManager::OnNewActiveProfileLoaded,
+ base::Unretained(this),
+ profile_dir,
+ last_non_managed_profile,
+ last_non_managed_profile_path,
+ callback),
+ string16(),
+ string16(),
+ false);
+ return;
+#else
+ // For OS_MACOSX the pref is updated in the callback to make sure that
+ // it isn't used before the profile is actually loaded.
local_state->SetString(prefs::kProfileLastUsed, last_non_managed_profile);
+#endif
}
}
+ FinishDeletingProfile(profile_dir);
+}
+
+void ProfileManager::OnNewActiveProfileLoaded(
+ const base::FilePath& profile_to_delete_dir,
+ const std::string& last_non_managed_profile,
+ const base::FilePath& last_non_managed_profile_path,
Alexei Svitkine (slow) 2013/06/18 21:45:57 Now that you have this, can you remove the redunda
noms (inactive) 2013/06/18 22:19:56 Done.
+ const CreateCallback& original_callback,
+ Profile* loaded_profile,
+ Profile::CreateStatus status) {
+
Alexei Svitkine (slow) 2013/06/18 21:45:57 Nit: No empty line here.
noms (inactive) 2013/06/18 22:19:56 Done.
+ // Only run the code if the profile initialization has finished completely
+ // (either completed successfully, or has failed).
+ if (status != Profile::CREATE_STATUS_CREATED) {
Alexei Svitkine (slow) 2013/06/18 21:45:57 Please check specific statuses rather than not a s
noms (inactive) 2013/06/18 22:19:56 Done.
+ if (std::find(ProfilesToDelete().begin(), ProfilesToDelete().end(),
+ last_non_managed_profile_path) != ProfilesToDelete().end()) {
+ // If the profile we tried to load as the next active profile has been
+ // deleted, then retry deleting this profile to redo the logic and load
+ // the next available profile.
+ ScheduleProfileForDeletion(profile_to_delete_dir, original_callback);
+ } else {
+ // Update the local state as promised in the ScheduleProfileForDeletion.
+ g_browser_process->local_state()->SetString(
+ prefs::kProfileLastUsed, last_non_managed_profile);
+ FinishDeletingProfile(profile_to_delete_dir);
+ }
+ }
+}
+void ProfileManager::FinishDeletingProfile(const base::FilePath& profile_dir) {
+ ProfileInfoCache& cache = GetProfileInfoCache();
// TODO(sail): Due to bug 88586 we don't delete the profile instance. Once we
// start deleting the profile instance we need to close background apps too.
Profile* profile = GetProfileByPath(profile_dir);
+
if (profile) {
BrowserList::CloseAllBrowsersWithProfile(profile);
« no previous file with comments | « chrome/browser/profiles/profile_manager.h ('k') | chrome/browser/profiles/profile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698