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

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: rebase 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
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..986e69426e28e48129e5614b53046b819c38eeae 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1043,23 +1043,26 @@ 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();
+ 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 +1075,56 @@ 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,
+ callback),
+ string16(),
+ string16(),
+ false);
+ return;
+#else
+ // For OS_MACOSX the pref is updated in the callback
Alexei Svitkine (slow) 2013/06/14 22:04:58 Nit: comment wrapping is weird
noms (inactive) 2013/06/18 21:38:11 Done.
+ // 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 CreateCallback& original_callback,
+ Profile* loaded_profile,
+ Profile::CreateStatus status) {
+ if (status == Profile::CREATE_STATUS_INITIALIZED) {
+ // Update the local state as promised in the ScheduleProfileForDeletion.
+ PrefService* local_state = g_browser_process->local_state();
+ local_state->SetString(prefs::kProfileLastUsed, last_non_managed_profile);
+ FinishDeletingProfile(profile_to_delete_dir);
+ } else if (status == Profile::CREATE_STATUS_LOCAL_FAIL ||
+ status == Profile::CREATE_STATUS_REMOTE_FAIL) {
+ // This means that the profile we tried to load as the next active profile
+ // has been deleted. Retry deleting this profile to redo the logic
+ // and load the next available profile.
+ ScheduleProfileForDeletion(profile_to_delete_dir, original_callback);
+ }
+}
+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);

Powered by Google App Engine
This is Rietveld 408576698