| 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/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 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 } | 638 } |
| 639 return *profile_info_cache_.get(); | 639 return *profile_info_cache_.get(); |
| 640 } | 640 } |
| 641 | 641 |
| 642 ProfileShortcutManager* ProfileManager::profile_shortcut_manager() { | 642 ProfileShortcutManager* ProfileManager::profile_shortcut_manager() { |
| 643 return profile_shortcut_manager_.get(); | 643 return profile_shortcut_manager_.get(); |
| 644 } | 644 } |
| 645 | 645 |
| 646 void ProfileManager::ScheduleProfileForDeletion( | 646 void ProfileManager::ScheduleProfileForDeletion( |
| 647 const base::FilePath& profile_dir, | 647 const base::FilePath& profile_dir, |
| 648 bool suppress_profile_creation, |
| 648 const CreateCallback& callback) { | 649 const CreateCallback& callback) { |
| 649 DCHECK(profiles::IsMultipleProfilesEnabled()); | 650 DCHECK(profiles::IsMultipleProfilesEnabled()); |
| 650 | 651 |
| 651 // Cancel all in-progress downloads before deleting the profile to prevent a | 652 // Cancel all in-progress downloads before deleting the profile to prevent a |
| 652 // "Do you want to exit Google Chrome and cancel the downloads?" prompt | 653 // "Do you want to exit Google Chrome and cancel the downloads?" prompt |
| 653 // (crbug.com/336725). | 654 // (crbug.com/336725). |
| 654 Profile* profile = GetProfileByPath(profile_dir); | 655 Profile* profile = GetProfileByPath(profile_dir); |
| 655 if (profile) { | 656 if (profile) { |
| 656 DownloadService* service = | 657 DownloadService* service = |
| 657 DownloadServiceFactory::GetForBrowserContext(profile); | 658 DownloadServiceFactory::GetForBrowserContext(profile); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 668 // Make sure that this profile is not pending deletion, and is not | 669 // Make sure that this profile is not pending deletion, and is not |
| 669 // legacy-supervised. | 670 // legacy-supervised. |
| 670 if (cur_path != profile_dir && | 671 if (cur_path != profile_dir && |
| 671 !cache.ProfileIsLegacySupervisedAtIndex(i) && | 672 !cache.ProfileIsLegacySupervisedAtIndex(i) && |
| 672 !IsProfileMarkedForDeletion(cur_path)) { | 673 !IsProfileMarkedForDeletion(cur_path)) { |
| 673 last_non_supervised_profile_path = cur_path; | 674 last_non_supervised_profile_path = cur_path; |
| 674 break; | 675 break; |
| 675 } | 676 } |
| 676 } | 677 } |
| 677 | 678 |
| 678 base::FilePath new_path; | 679 base::FilePath new_path = last_non_supervised_profile_path; |
| 679 if (last_non_supervised_profile_path.empty()) { | 680 if (new_path.empty()) { |
| 680 // If we are using --new-avatar-menu, then assign the default | 681 // If we are using --new-avatar-menu, then assign the default |
| 681 // placeholder avatar and name. Otherwise, use random ones. | 682 // placeholder avatar and name. Otherwise, use random ones. |
| 682 bool is_new_avatar_menu = switches::IsNewAvatarMenu(); | 683 base::string16 new_avatar_url; |
| 683 int avatar_index = profiles::GetPlaceholderAvatarIndex(); | 684 base::string16 new_profile_name; |
| 684 base::string16 new_avatar_url = is_new_avatar_menu ? | 685 if (switches::IsNewAvatarMenu()) { |
| 685 base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(avatar_index)) : | 686 int avatar_index = profiles::GetPlaceholderAvatarIndex(); |
| 686 base::string16(); | 687 new_avatar_url = |
| 687 base::string16 new_profile_name = is_new_avatar_menu ? | 688 base::UTF8ToUTF16(profiles::GetDefaultAvatarIconUrl(avatar_index)); |
| 688 cache.ChooseNameForNewProfile(avatar_index) : base::string16(); | 689 new_profile_name = cache.ChooseNameForNewProfile(avatar_index); |
| 690 } |
| 689 | 691 |
| 690 new_path = GenerateNextProfileDirectoryPath(); | 692 new_path = GenerateNextProfileDirectoryPath(); |
| 691 CreateProfileAsync(new_path, | 693 if (!suppress_profile_creation) { |
| 692 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, | 694 CreateProfileAsync(new_path, |
| 693 base::Unretained(this), | 695 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, |
| 694 profile_dir, | 696 base::Unretained(this), |
| 695 new_path, | 697 profile_dir, |
| 696 callback), | 698 new_path, |
| 697 new_profile_name, | 699 callback), |
| 698 new_avatar_url, | 700 new_profile_name, |
| 699 std::string()); | 701 new_avatar_url, |
| 702 std::string()); |
| 700 | 703 |
| 701 ProfileMetrics::LogProfileAddNewUser( | 704 ProfileMetrics::LogProfileAddNewUser( |
| 702 ProfileMetrics::ADD_NEW_USER_LAST_DELETED); | 705 ProfileMetrics::ADD_NEW_USER_LAST_DELETED); |
| 703 return; | 706 return; |
| 707 } |
| 704 } | 708 } |
| 705 | 709 |
| 706 #if defined(OS_MACOSX) | 710 #if defined(OS_MACOSX) |
| 707 // On the Mac, the browser process is not killed when all browser windows are | 711 // On the Mac, the browser process is not killed when all browser windows are |
| 708 // closed, so just in case we are deleting the active profile, and no other | 712 // closed, so just in case we are deleting the active profile, and no other |
| 709 // profile has been loaded, we must pre-load a next one. | 713 // profile has been loaded, we must pre-load a next one. |
| 710 const std::string last_used_profile = | 714 const std::string last_used_profile = |
| 711 g_browser_process->local_state()->GetString(prefs::kProfileLastUsed); | 715 g_browser_process->local_state()->GetString(prefs::kProfileLastUsed); |
| 712 if (last_used_profile == profile_dir.BaseName().MaybeAsASCII() || | 716 if ((last_used_profile == profile_dir.BaseName().MaybeAsASCII() || |
| 713 last_used_profile == GetGuestProfilePath().BaseName().MaybeAsASCII()) { | 717 last_used_profile == GetGuestProfilePath().BaseName().MaybeAsASCII()) && |
| 718 !suppress_profile_creation) { |
| 719 DCHECK(!last_non_supervised_profile_path.empty()); |
| 714 CreateProfileAsync(last_non_supervised_profile_path, | 720 CreateProfileAsync(last_non_supervised_profile_path, |
| 715 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, | 721 base::Bind(&ProfileManager::OnNewActiveProfileLoaded, |
| 716 base::Unretained(this), | 722 base::Unretained(this), |
| 717 profile_dir, | 723 profile_dir, |
| 718 last_non_supervised_profile_path, | 724 last_non_supervised_profile_path, |
| 719 callback), | 725 callback), |
| 720 base::string16(), | 726 base::string16(), |
| 721 base::string16(), | 727 base::string16(), |
| 722 std::string()); | 728 std::string()); |
| 723 return; | 729 return; |
| 724 } | 730 } |
| 725 #endif // defined(OS_MACOSX) | 731 #endif // defined(OS_MACOSX) |
| 726 | 732 |
| 727 FinishDeletingProfile(profile_dir, last_non_supervised_profile_path); | 733 FinishDeletingProfile(profile_dir, new_path); |
| 728 } | |
| 729 | |
| 730 // static | |
| 731 void ProfileManager::CleanUpStaleProfiles( | |
| 732 const std::vector<base::FilePath>& profile_paths) { | |
| 733 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | |
| 734 | |
| 735 for (std::vector<base::FilePath>::const_iterator it = profile_paths.begin(); | |
| 736 it != profile_paths.end(); ++it) { | |
| 737 NukeProfileFromDisk(*it); | |
| 738 } | |
| 739 } | 734 } |
| 740 | 735 |
| 741 void ProfileManager::AutoloadProfiles() { | 736 void ProfileManager::AutoloadProfiles() { |
| 742 // If running in the background is disabled for the browser, do not autoload | 737 // If running in the background is disabled for the browser, do not autoload |
| 743 // any profiles. | 738 // any profiles. |
| 744 PrefService* local_state = g_browser_process->local_state(); | 739 PrefService* local_state = g_browser_process->local_state(); |
| 745 if (!local_state->HasPrefPath(prefs::kBackgroundModeEnabled) || | 740 if (!local_state->HasPrefPath(prefs::kBackgroundModeEnabled) || |
| 746 !local_state->GetBoolean(prefs::kBackgroundModeEnabled)) { | 741 !local_state->GetBoolean(prefs::kBackgroundModeEnabled)) { |
| 747 return; | 742 return; |
| 748 } | 743 } |
| (...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 // Not the last window for this profile. | 1365 // Not the last window for this profile. |
| 1371 return; | 1366 return; |
| 1372 } | 1367 } |
| 1373 | 1368 |
| 1374 // If the last browser of a profile that is scheduled for deletion is closed | 1369 // If the last browser of a profile that is scheduled for deletion is closed |
| 1375 // do that now. | 1370 // do that now. |
| 1376 base::FilePath path = profile->GetPath(); | 1371 base::FilePath path = profile->GetPath(); |
| 1377 if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) && | 1372 if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) && |
| 1378 !IsProfileMarkedForDeletion(path)) { | 1373 !IsProfileMarkedForDeletion(path)) { |
| 1379 g_browser_process->profile_manager()->ScheduleProfileForDeletion( | 1374 g_browser_process->profile_manager()->ScheduleProfileForDeletion( |
| 1380 path, ProfileManager::CreateCallback()); | 1375 path, false /* suppress_profile_creation */, |
| 1376 ProfileManager::CreateCallback()); |
| 1381 } | 1377 } |
| 1382 } | 1378 } |
| 1383 | 1379 |
| 1384 void ProfileManager::BrowserListObserver::OnBrowserSetLastActive( | 1380 void ProfileManager::BrowserListObserver::OnBrowserSetLastActive( |
| 1385 Browser* browser) { | 1381 Browser* browser) { |
| 1386 // If all browsers are being closed (e.g. the user is in the process of | 1382 // If all browsers are being closed (e.g. the user is in the process of |
| 1387 // shutting down), this event will be fired after each browser is | 1383 // shutting down), this event will be fired after each browser is |
| 1388 // closed. This does not represent a user intention to change the active | 1384 // closed. This does not represent a user intention to change the active |
| 1389 // browser so is not handled here. | 1385 // browser so is not handled here. |
| 1390 if (profile_manager_->closing_all_browsers_) | 1386 if (profile_manager_->closing_all_browsers_) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1411 status != Profile::CREATE_STATUS_REMOTE_FAIL); | 1407 status != Profile::CREATE_STATUS_REMOTE_FAIL); |
| 1412 | 1408 |
| 1413 // Only run the code if the profile initialization has finished completely. | 1409 // Only run the code if the profile initialization has finished completely. |
| 1414 if (status != Profile::CREATE_STATUS_INITIALIZED) | 1410 if (status != Profile::CREATE_STATUS_INITIALIZED) |
| 1415 return; | 1411 return; |
| 1416 | 1412 |
| 1417 if (IsProfileMarkedForDeletion(new_active_profile_path)) { | 1413 if (IsProfileMarkedForDeletion(new_active_profile_path)) { |
| 1418 // If the profile we tried to load as the next active profile has been | 1414 // If the profile we tried to load as the next active profile has been |
| 1419 // deleted, then retry deleting this profile to redo the logic to load | 1415 // deleted, then retry deleting this profile to redo the logic to load |
| 1420 // the next available profile. | 1416 // the next available profile. |
| 1421 ScheduleProfileForDeletion(profile_to_delete_path, original_callback); | 1417 ScheduleProfileForDeletion(profile_to_delete_path, |
| 1418 false /* suppress_profile_creation */, |
| 1419 original_callback); |
| 1422 return; | 1420 return; |
| 1423 } | 1421 } |
| 1424 | 1422 |
| 1425 FinishDeletingProfile(profile_to_delete_path, new_active_profile_path); | 1423 FinishDeletingProfile(profile_to_delete_path, new_active_profile_path); |
| 1426 if (!original_callback.is_null()) | 1424 if (!original_callback.is_null()) |
| 1427 original_callback.Run(loaded_profile, status); | 1425 original_callback.Run(loaded_profile, status); |
| 1428 } | 1426 } |
| 1429 | 1427 |
| 1430 ProfileManagerWithoutInit::ProfileManagerWithoutInit( | 1428 ProfileManagerWithoutInit::ProfileManagerWithoutInit( |
| 1431 const base::FilePath& user_data_dir) : ProfileManager(user_data_dir) { | 1429 const base::FilePath& user_data_dir) : ProfileManager(user_data_dir) { |
| 1432 } | 1430 } |
| OLD | NEW |