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

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

Issue 10823217: Create/Delete windows profile shortcuts (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 4 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
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 <set> 5 #include <set>
6 6
7 #include "chrome/browser/profiles/profile_manager.h" 7 #include "chrome/browser/profiles/profile_manager.h"
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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 std::vector<Profile*> ProfileManager::GetLastOpenedProfiles() { 232 std::vector<Profile*> ProfileManager::GetLastOpenedProfiles() {
233 ProfileManager* profile_manager = g_browser_process->profile_manager(); 233 ProfileManager* profile_manager = g_browser_process->profile_manager();
234 return profile_manager->GetLastOpenedProfiles( 234 return profile_manager->GetLastOpenedProfiles(
235 profile_manager->user_data_dir_); 235 profile_manager->user_data_dir_);
236 } 236 }
237 237
238 ProfileManager::ProfileManager(const FilePath& user_data_dir) 238 ProfileManager::ProfileManager(const FilePath& user_data_dir)
239 : user_data_dir_(user_data_dir), 239 : user_data_dir_(user_data_dir),
240 logged_in_(false), 240 logged_in_(false),
241 will_import_(false), 241 will_import_(false),
242 profile_shortcut_manager_(NULL),
242 #if !defined(OS_ANDROID) 243 #if !defined(OS_ANDROID)
243 ALLOW_THIS_IN_INITIALIZER_LIST( 244 ALLOW_THIS_IN_INITIALIZER_LIST(
244 browser_list_observer_(this)), 245 browser_list_observer_(this)),
245 #endif 246 #endif
246 closing_all_browsers_(false) { 247 closing_all_browsers_(false) {
247 #if defined(OS_CHROMEOS) 248 #if defined(OS_CHROMEOS)
248 registrar_.Add( 249 registrar_.Add(
249 this, 250 this,
250 chrome::NOTIFICATION_LOGIN_USER_CHANGED, 251 chrome::NOTIFICATION_LOGIN_USER_CHANGED,
251 content::NotificationService::AllSources()); 252 content::NotificationService::AllSources());
252 #endif 253 #endif
253 registrar_.Add( 254 registrar_.Add(
254 this, 255 this,
255 chrome::NOTIFICATION_BROWSER_OPENED, 256 chrome::NOTIFICATION_BROWSER_OPENED,
256 content::NotificationService::AllSources()); 257 content::NotificationService::AllSources());
257 registrar_.Add( 258 registrar_.Add(
258 this, 259 this,
259 chrome::NOTIFICATION_BROWSER_CLOSED, 260 chrome::NOTIFICATION_BROWSER_CLOSED,
260 content::NotificationService::AllSources()); 261 content::NotificationService::AllSources());
261 registrar_.Add( 262 registrar_.Add(
262 this, 263 this,
263 chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, 264 chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST,
264 content::NotificationService::AllSources()); 265 content::NotificationService::AllSources());
265 registrar_.Add( 266 registrar_.Add(
266 this, 267 this,
267 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED, 268 chrome::NOTIFICATION_BROWSER_CLOSE_CANCELLED,
268 content::NotificationService::AllSources()); 269 content::NotificationService::AllSources());
270
271 if (ProfileShortcutManager::IsFeatureEnabled())
272 profile_shortcut_manager_.reset(ProfileShortcutManager::Create());
SteveT 2012/08/15 18:29:41 Should be 2 space indent after the if.
Halli 2012/08/15 19:29:59 Done.
269 } 273 }
270 274
271 ProfileManager::~ProfileManager() { 275 ProfileManager::~ProfileManager() {
272 #if defined(OS_WIN)
273 if (profile_shortcut_manager_.get())
274 profile_info_cache_->RemoveObserver(profile_shortcut_manager_.get());
275 #endif
276 } 276 }
277 277
278 FilePath ProfileManager::GetDefaultProfileDir( 278 FilePath ProfileManager::GetDefaultProfileDir(
279 const FilePath& user_data_dir) { 279 const FilePath& user_data_dir) {
280 FilePath default_profile_dir(user_data_dir); 280 FilePath default_profile_dir(user_data_dir);
281 default_profile_dir = 281 default_profile_dir =
282 default_profile_dir.AppendASCII(chrome::kInitialProfile); 282 default_profile_dir.AppendASCII(chrome::kInitialProfile);
283 return default_profile_dir; 283 return default_profile_dir;
284 } 284 }
285 285
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 RegisterProfile(CreateProfileAsyncHelper(profile_path, this), false); 447 RegisterProfile(CreateProfileAsyncHelper(profile_path, this), false);
448 ProfileInfoCache& cache = GetProfileInfoCache(); 448 ProfileInfoCache& cache = GetProfileInfoCache();
449 // Get the icon index from the user's icon url 449 // Get the icon index from the user's icon url
450 size_t icon_index; 450 size_t icon_index;
451 std::string icon_url_std = UTF16ToASCII(icon_url); 451 std::string icon_url_std = UTF16ToASCII(icon_url);
452 if (cache.IsDefaultAvatarIconUrl(icon_url_std, &icon_index)) { 452 if (cache.IsDefaultAvatarIconUrl(icon_url_std, &icon_index)) {
453 // add profile to cache with user selected name and avatar 453 // add profile to cache with user selected name and avatar
454 cache.AddProfileToCache(profile_path, name, string16(), icon_index); 454 cache.AddProfileToCache(profile_path, name, string16(), icon_index);
455 } 455 }
456 info->callbacks.push_back(callback); 456 info->callbacks.push_back(callback);
457 if (profile_shortcut_manager_ != NULL && !name.empty() &&
SteveT 2012/08/15 18:29:41 nit: if (profile_shortcut_manager_ != NULL && ...
Halli 2012/08/15 19:29:59 Done.
458 !icon_url.empty()) {
459 BrowserThread::PostTask(
460 BrowserThread::FILE, FROM_HERE,
461 base::Bind(&ProfileShortcutManager::CreateChromeDesktopShortcut,
462 base::Unretained(profile_shortcut_manager_.get()), profile_path, name,
463 ResourceBundle::GetSharedInstance().GetNativeImageNamed(
464 cache.GetDefaultAvatarIconResourceIDAtIndex(icon_index))));
465 }
457 } 466 }
458 } 467 }
459 468
460 // static 469 // static
461 void ProfileManager::CreateDefaultProfileAsync(const CreateCallback& callback) { 470 void ProfileManager::CreateDefaultProfileAsync(const CreateCallback& callback) {
462 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 471 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
463 ProfileManager* profile_manager = g_browser_process->profile_manager(); 472 ProfileManager* profile_manager = g_browser_process->profile_manager();
464 473
465 FilePath default_profile_dir = profile_manager->user_data_dir_; 474 FilePath default_profile_dir = profile_manager->user_data_dir_;
466 // TODO(mirandac): current directory will not always be default in the future 475 // TODO(mirandac): current directory will not always be default in the future
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 last_active->GetPath().BaseName().MaybeAsASCII()); 675 last_active->GetPath().BaseName().MaybeAsASCII());
667 } 676 }
668 } 677 }
669 #endif // !defined(OS_ANDROID) 678 #endif // !defined(OS_ANDROID)
670 679
671 void ProfileManager::DoFinalInit(Profile* profile, bool go_off_the_record) { 680 void ProfileManager::DoFinalInit(Profile* profile, bool go_off_the_record) {
672 DoFinalInitForServices(profile, go_off_the_record); 681 DoFinalInitForServices(profile, go_off_the_record);
673 InitProfileUserPrefs(profile); 682 InitProfileUserPrefs(profile);
674 AddProfileToCache(profile); 683 AddProfileToCache(profile);
675 DoFinalInitLogging(profile); 684 DoFinalInitLogging(profile);
676 #if defined(OS_WIN)
677 CreateDesktopShortcut(profile);
678 #endif
679 685
680 ProfileMetrics::LogNumberOfProfiles(this, ProfileMetrics::ADD_PROFILE_EVENT); 686 ProfileMetrics::LogNumberOfProfiles(this, ProfileMetrics::ADD_PROFILE_EVENT);
681 content::NotificationService::current()->Notify( 687 content::NotificationService::current()->Notify(
682 chrome::NOTIFICATION_PROFILE_ADDED, 688 chrome::NOTIFICATION_PROFILE_ADDED,
683 content::Source<Profile>(profile), 689 content::Source<Profile>(profile),
684 content::NotificationService::NoDetails()); 690 content::NotificationService::NoDetails());
685 691
686 } 692 }
687 693
688 void ProfileManager::DoFinalInitForServices(Profile* profile, 694 void ProfileManager::DoFinalInitForServices(Profile* profile,
(...skipping 29 matching lines...) Expand all
718 return Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS); 724 return Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS);
719 } 725 }
720 726
721 Profile* ProfileManager::CreateProfileAsyncHelper(const FilePath& path, 727 Profile* ProfileManager::CreateProfileAsyncHelper(const FilePath& path,
722 Delegate* delegate) { 728 Delegate* delegate) {
723 return Profile::CreateProfile(path, 729 return Profile::CreateProfile(path,
724 delegate, 730 delegate,
725 Profile::CREATE_MODE_ASYNCHRONOUS); 731 Profile::CREATE_MODE_ASYNCHRONOUS);
726 } 732 }
727 733
728 #if defined(OS_WIN)
729 ProfileShortcutManagerWin* ProfileManager::CreateShortcutManager() {
730 return new ProfileShortcutManagerWin();
731 }
732 #endif
733
734 void ProfileManager::OnProfileCreated(Profile* profile, 734 void ProfileManager::OnProfileCreated(Profile* profile,
735 bool success, 735 bool success,
736 bool is_new_profile) { 736 bool is_new_profile) {
737 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 737 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
738 738
739 ProfilesInfoMap::iterator iter = profiles_info_.find(profile->GetPath()); 739 ProfilesInfoMap::iterator iter = profiles_info_.find(profile->GetPath());
740 DCHECK(iter != profiles_info_.end()); 740 DCHECK(iter != profiles_info_.end());
741 ProfileInfo* info = iter->second.get(); 741 ProfileInfo* info = iter->second.get();
742 742
743 std::vector<CreateCallback> callbacks; 743 std::vector<CreateCallback> callbacks;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 return false; 824 return false;
825 } else { 825 } else {
826 return pair1.first < pair2.first; 826 return pair1.first < pair2.first;
827 } 827 }
828 } 828 }
829 829
830 ProfileInfoCache& ProfileManager::GetProfileInfoCache() { 830 ProfileInfoCache& ProfileManager::GetProfileInfoCache() {
831 if (!profile_info_cache_.get()) { 831 if (!profile_info_cache_.get()) {
832 profile_info_cache_.reset(new ProfileInfoCache( 832 profile_info_cache_.reset(new ProfileInfoCache(
833 g_browser_process->local_state(), user_data_dir_)); 833 g_browser_process->local_state(), user_data_dir_));
834 #if defined(OS_WIN)
835 BrowserDistribution* dist = BrowserDistribution::GetDistribution();
836 ProfileShortcutManagerWin* shortcut_manager = CreateShortcutManager();
837 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
838 if (dist && dist->CanCreateDesktopShortcuts() && shortcut_manager &&
839 !command_line.HasSwitch(switches::kDisableDesktopShortcuts)) {
840 profile_shortcut_manager_.reset(shortcut_manager);
841 profile_info_cache_->AddObserver(profile_shortcut_manager_.get());
842 }
843 #endif
844 } 834 }
845 return *profile_info_cache_.get(); 835 return *profile_info_cache_.get();
846 } 836 }
847 837
848 void ProfileManager::AddProfileToCache(Profile* profile) { 838 void ProfileManager::AddProfileToCache(Profile* profile) {
849 ProfileInfoCache& cache = GetProfileInfoCache(); 839 ProfileInfoCache& cache = GetProfileInfoCache();
850 if (profile->GetPath().DirName() != cache.GetUserDataDir()) 840 if (profile->GetPath().DirName() != cache.GetUserDataDir())
851 return; 841 return;
852 842
853 if (cache.GetIndexOfProfileWithPath(profile->GetPath()) != std::string::npos) 843 if (cache.GetIndexOfProfileWithPath(profile->GetPath()) != std::string::npos)
854 return; 844 return;
855 845
856 string16 username = UTF8ToUTF16(profile->GetPrefs()->GetString( 846 string16 username = UTF8ToUTF16(profile->GetPrefs()->GetString(
857 prefs::kGoogleServicesUsername)); 847 prefs::kGoogleServicesUsername));
858 848
859 // Profile name and avatar are set by InitProfileUserPrefs and stored in the 849 // Profile name and avatar are set by InitProfileUserPrefs and stored in the
860 // profile. Use those values to setup the cache entry. 850 // profile. Use those values to setup the cache entry.
861 string16 profile_name = UTF8ToUTF16(profile->GetPrefs()->GetString( 851 string16 profile_name = UTF8ToUTF16(profile->GetPrefs()->GetString(
862 prefs::kProfileName)); 852 prefs::kProfileName));
863 853
864 size_t icon_index = profile->GetPrefs()->GetInteger( 854 size_t icon_index = profile->GetPrefs()->GetInteger(
865 prefs::kProfileAvatarIndex); 855 prefs::kProfileAvatarIndex);
866 856
867 cache.AddProfileToCache(profile->GetPath(), 857 cache.AddProfileToCache(profile->GetPath(),
868 profile_name, 858 profile_name,
869 username, 859 username,
870 icon_index); 860 icon_index);
871 } 861 }
872 862
873 #if defined(OS_WIN)
874 void ProfileManager::CreateDesktopShortcut(Profile* profile) {
875 // TODO(sail): Disable creating new shortcuts for now.
876 return;
877
878 // Some distributions and tests cannot create desktop shortcuts, in which case
879 // profile_shortcut_manager_ will not be set.
880 if (!profile_shortcut_manager_.get())
881 return;
882
883 bool shortcut_created =
884 profile->GetPrefs()->GetBoolean(prefs::kProfileShortcutCreated);
885 if (!shortcut_created && GetNumberOfProfiles() > 1) {
886 profile_shortcut_manager_->AddProfileShortcut(profile->GetPath());
887
888 // We only ever create the shortcut for a profile once, so set a pref
889 // reminding us to skip this in the future.
890 profile->GetPrefs()->SetBoolean(prefs::kProfileShortcutCreated, true);
891 }
892 }
893 #endif
894
895 void ProfileManager::InitProfileUserPrefs(Profile* profile) { 863 void ProfileManager::InitProfileUserPrefs(Profile* profile) {
896 ProfileInfoCache& cache = GetProfileInfoCache(); 864 ProfileInfoCache& cache = GetProfileInfoCache();
897 865
898 if (profile->GetPath().DirName() != cache.GetUserDataDir()) 866 if (profile->GetPath().DirName() != cache.GetUserDataDir())
899 return; 867 return;
900 868
901 // Initialize the user preferences (name and avatar) only if the profile 869 // Initialize the user preferences (name and avatar) only if the profile
902 // doesn't have default preferenc values for them. 870 // doesn't have default preferenc values for them.
903 if (HasAnyDefaultUserPrefs(profile)) { 871 if (HasAnyDefaultUserPrefs(profile)) {
904 size_t profile_cache_index = 872 size_t profile_cache_index =
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 if (ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService( 943 if (ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService(
976 profile)) { 944 profile)) {
977 ProfileSyncServiceFactory::GetInstance()->GetForProfile( 945 ProfileSyncServiceFactory::GetInstance()->GetForProfile(
978 profile)->DisableForUser(); 946 profile)->DisableForUser();
979 } 947 }
980 } 948 }
981 949
982 QueueProfileDirectoryForDeletion(profile_dir); 950 QueueProfileDirectoryForDeletion(profile_dir);
983 cache.DeleteProfileFromCache(profile_dir); 951 cache.DeleteProfileFromCache(profile_dir);
984 952
953 // Delete possible shortcuts for this profile
954 if (profile_shortcut_manager_ != NULL)
SteveT 2012/08/15 18:29:41 nit: if (profile_shortcut_manager_ != NULL) -> if
Halli 2012/08/15 19:29:59 Done.
955 profile_shortcut_manager_->DeleteChromeDesktopShortcut(profile_dir);
SteveT 2012/08/15 18:29:41 Two space indent after if.
Halli 2012/08/15 19:29:59 Done.
956
985 ProfileMetrics::LogNumberOfProfiles(this, 957 ProfileMetrics::LogNumberOfProfiles(this,
986 ProfileMetrics::DELETE_PROFILE_EVENT); 958 ProfileMetrics::DELETE_PROFILE_EVENT);
987 } 959 }
988 960
989 // static 961 // static
990 bool ProfileManager::IsMultipleProfilesEnabled() { 962 bool ProfileManager::IsMultipleProfilesEnabled() {
991 #if defined(OS_CHROMEOS) 963 #if defined(OS_CHROMEOS)
992 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kMultiProfiles)) 964 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kMultiProfiles))
993 return false; 965 return false;
994 #endif 966 #endif
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 void ProfileManager::RunCallbacks(const std::vector<CreateCallback>& callbacks, 1002 void ProfileManager::RunCallbacks(const std::vector<CreateCallback>& callbacks,
1031 Profile* profile, 1003 Profile* profile,
1032 Profile::CreateStatus status) { 1004 Profile::CreateStatus status) {
1033 for (size_t i = 0; i < callbacks.size(); ++i) 1005 for (size_t i = 0; i < callbacks.size(); ++i)
1034 callbacks[i].Run(profile, status); 1006 callbacks[i].Run(profile, status);
1035 } 1007 }
1036 1008
1037 ProfileManager::ProfileInfo::~ProfileInfo() { 1009 ProfileManager::ProfileInfo::~ProfileInfo() {
1038 ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release()); 1010 ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release());
1039 } 1011 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698