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

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

Issue 8502033: Add Windows desktop shortcut for multiple profiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Remove remnants of first test solution Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_info_cache.h" 5 #include "chrome/browser/profiles/profile_info_cache.h"
6 6
7 #include "base/format_macros.h" 7 #include "base/format_macros.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/rand_util.h" 10 #include "base/rand_util.h"
11 #include "base/string_number_conversions.h" 11 #include "base/string_number_conversions.h"
12 #include "base/stringprintf.h" 12 #include "base/stringprintf.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "base/values.h" 14 #include "base/values.h"
15 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/prefs/pref_service.h" 16 #include "chrome/browser/prefs/pref_service.h"
16 #include "chrome/browser/prefs/scoped_user_pref_update.h" 17 #include "chrome/browser/prefs/scoped_user_pref_update.h"
17 #include "chrome/common/chrome_notification_types.h" 18 #include "chrome/common/chrome_notification_types.h"
18 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
19 #include "content/public/browser/notification_service.h" 20 #include "content/public/browser/notification_service.h"
20 #include "grit/generated_resources.h" 21 #include "grit/generated_resources.h"
21 #include "grit/theme_resources.h" 22 #include "grit/theme_resources.h"
22 #include "ui/base/l10n/l10n_util.h" 23 #include "ui/base/l10n/l10n_util.h"
23 #include "ui/base/resource/resource_bundle.h" 24 #include "ui/base/resource/resource_bundle.h"
24 25
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 IDS_DEFAULT_AVATAR_NAME_18, 80 IDS_DEFAULT_AVATAR_NAME_18,
80 IDS_DEFAULT_AVATAR_NAME_19, 81 IDS_DEFAULT_AVATAR_NAME_19,
81 IDS_DEFAULT_AVATAR_NAME_20, 82 IDS_DEFAULT_AVATAR_NAME_20,
82 IDS_DEFAULT_AVATAR_NAME_21, 83 IDS_DEFAULT_AVATAR_NAME_21,
83 IDS_DEFAULT_AVATAR_NAME_22, 84 IDS_DEFAULT_AVATAR_NAME_22,
84 IDS_DEFAULT_AVATAR_NAME_23, 85 IDS_DEFAULT_AVATAR_NAME_23,
85 IDS_DEFAULT_AVATAR_NAME_24, 86 IDS_DEFAULT_AVATAR_NAME_24,
86 IDS_DEFAULT_AVATAR_NAME_25 87 IDS_DEFAULT_AVATAR_NAME_25
87 }; 88 };
88 89
89 } // namespace 90 } // namespace
90 91
91 ProfileInfoCache::ProfileInfoCache(PrefService* prefs, 92 ProfileInfoCache::ProfileInfoCache(PrefService* prefs,
92 const FilePath& user_data_dir) 93 const FilePath& user_data_dir)
93 : prefs_(prefs), 94 : prefs_(prefs),
94 user_data_dir_(user_data_dir) { 95 user_data_dir_(user_data_dir) {
95 // Populate the cache 96 // Populate the cache
96 const DictionaryValue* cache = 97 const DictionaryValue* cache =
97 prefs_->GetDictionary(prefs::kProfileInfoCache); 98 prefs_->GetDictionary(prefs::kProfileInfoCache);
98 for (DictionaryValue::key_iterator it = cache->begin_keys(); 99 for (DictionaryValue::key_iterator it = cache->begin_keys();
99 it != cache->end_keys(); ++it) { 100 it != cache->end_keys(); ++it) {
(...skipping 20 matching lines...) Expand all
120 scoped_ptr<DictionaryValue> info(new DictionaryValue); 121 scoped_ptr<DictionaryValue> info(new DictionaryValue);
121 info->SetString(kNameKey, name); 122 info->SetString(kNameKey, name);
122 info->SetString(kUserNameKey, username); 123 info->SetString(kUserNameKey, username);
123 info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index)); 124 info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index));
124 // Default value for whether background apps are running is false. 125 // Default value for whether background apps are running is false.
125 info->SetBoolean(kBackgroundAppsKey, false); 126 info->SetBoolean(kBackgroundAppsKey, false);
126 cache->Set(key, info.release()); 127 cache->Set(key, info.release());
127 128
128 sorted_keys_.insert(FindPositionForProfile(key, name), key); 129 sorted_keys_.insert(FindPositionForProfile(key, name), key);
129 130
131 FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
132 observer_list_,
133 OnProfileAdded(name, UTF8ToUTF16(key)));
134
130 content::NotificationService::current()->Notify( 135 content::NotificationService::current()->Notify(
131 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, 136 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
132 content::NotificationService::AllSources(), 137 content::NotificationService::AllSources(),
133 content::NotificationService::NoDetails()); 138 content::NotificationService::NoDetails());
134 } 139 }
135 140
141 void ProfileInfoCache::AddObserver(ProfileInfoCacheObserver* obs) {
142 observer_list_.AddObserver(obs);
143 }
144
145 void ProfileInfoCache::RemoveObserver(ProfileInfoCacheObserver* obs) {
146 observer_list_.RemoveObserver(obs);
147 }
148
136 void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) { 149 void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) {
137 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); 150 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
138 DictionaryValue* cache = update.Get(); 151 DictionaryValue* cache = update.Get();
152 if (!cache)
grt (UTC plus 2) 2011/11/21 15:21:18 if any kind of check is needed here (i'm not sure
Miranda Callahan 2011/11/21 15:40:38 Yes, this was based on a discussion w/robertshield
153 NOTREACHED();
154 std::string key = CacheKeyFromProfilePath(profile_path);
155 DictionaryValue* info = NULL;
156 cache->GetDictionary(key, &info);
157 DCHECK(info);
158 string16 name;
159 info->GetString(kNameKey, &name);
139 160
140 std::string key = CacheKeyFromProfilePath(profile_path); 161 FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
162 observer_list_,
163 OnProfileRemoved(name));
164
141 cache->Remove(key, NULL); 165 cache->Remove(key, NULL);
142 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); 166 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key));
143 167
144 content::NotificationService::current()->Notify( 168 content::NotificationService::current()->Notify(
145 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, 169 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
146 content::NotificationService::AllSources(), 170 content::NotificationService::AllSources(),
147 content::NotificationService::NoDetails()); 171 content::NotificationService::NoDetails());
148 } 172 }
149 173
150 size_t ProfileInfoCache::GetNumberOfProfiles() const { 174 size_t ProfileInfoCache::GetNumberOfProfiles() const {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 if (IsDefaultAvatarIconUrl(icon_url, &icon_index)) 232 if (IsDefaultAvatarIconUrl(icon_url, &icon_index))
209 return icon_index; 233 return icon_index;
210 234
211 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; 235 DLOG(WARNING) << "Unknown avatar icon: " << icon_url;
212 return GetDefaultAvatarIconResourceIDAtIndex(0); 236 return GetDefaultAvatarIconResourceIDAtIndex(0);
213 } 237 }
214 238
215 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, 239 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index,
216 const string16& name) { 240 const string16& name) {
217 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); 241 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
242 string16 old_name;
243 info->GetString(kNameKey, &old_name);
218 info->SetString(kNameKey, name); 244 info->SetString(kNameKey, name);
219 // This takes ownership of |info|. 245 // This takes ownership of |info|.
220 SetInfoForProfileAtIndex(index, info.release()); 246 SetInfoForProfileAtIndex(index, info.release());
221 247
222 // Remove and reinsert key in |sorted_keys_| to alphasort. 248 // Remove and reinsert key in |sorted_keys_| to alphasort.
223 std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index)); 249 std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index));
224 std::vector<std::string>::iterator key_it = 250 std::vector<std::string>::iterator key_it =
225 std::find(sorted_keys_.begin(), sorted_keys_.end(), key); 251 std::find(sorted_keys_.begin(), sorted_keys_.end(), key);
226 DCHECK(key_it != sorted_keys_.end()); 252 DCHECK(key_it != sorted_keys_.end());
227 sorted_keys_.erase(key_it); 253 sorted_keys_.erase(key_it);
228 sorted_keys_.insert(FindPositionForProfile(key, name), key); 254 sorted_keys_.insert(FindPositionForProfile(key, name), key);
229 255
256 FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
257 observer_list_,
258 OnProfileNameChanged(old_name, name));
259
230 content::NotificationService::current()->Notify( 260 content::NotificationService::current()->Notify(
231 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, 261 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
232 content::NotificationService::AllSources(), 262 content::NotificationService::AllSources(),
233 content::NotificationService::NoDetails()); 263 content::NotificationService::NoDetails());
234 } 264 }
235 265
236 void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index, 266 void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index,
237 const string16& user_name) { 267 const string16& user_name) {
238 string16 old_user_name; 268 string16 old_user_name;
239 const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index); 269 const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index);
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 return false; 408 return false;
379 } 409 }
380 410
381 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex( 411 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex(
382 size_t index) const { 412 size_t index) const {
383 DCHECK_LT(index, GetNumberOfProfiles()); 413 DCHECK_LT(index, GetNumberOfProfiles());
384 const DictionaryValue* cache = 414 const DictionaryValue* cache =
385 prefs_->GetDictionary(prefs::kProfileInfoCache); 415 prefs_->GetDictionary(prefs::kProfileInfoCache);
386 DictionaryValue* info = NULL; 416 DictionaryValue* info = NULL;
387 cache->GetDictionary(sorted_keys_[index], &info); 417 cache->GetDictionary(sorted_keys_[index], &info);
418 if (!info)
grt (UTC plus 2) 2011/11/21 15:21:18 same
419 NOTREACHED();
388 return info; 420 return info;
389 } 421 }
390 422
391 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index, 423 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index,
392 DictionaryValue* info) { 424 DictionaryValue* info) {
393 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); 425 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
394 DictionaryValue* cache = update.Get(); 426 DictionaryValue* cache = update.Get();
395 cache->Set(sorted_keys_[index], info); 427 cache->Set(sorted_keys_[index], info);
396 428
397 content::NotificationService::current()->Notify( 429 content::NotificationService::current()->Notify(
(...skipping 18 matching lines...) Expand all
416 return sorted_keys_.begin() + i; 448 return sorted_keys_.begin() + i;
417 if (name_compare == 0) { 449 if (name_compare == 0) {
418 int key_compare = search_key.compare(sorted_keys_[i]); 450 int key_compare = search_key.compare(sorted_keys_[i]);
419 if (key_compare < 0) 451 if (key_compare < 0)
420 return sorted_keys_.begin() + i; 452 return sorted_keys_.begin() + i;
421 } 453 }
422 } 454 }
423 return sorted_keys_.end(); 455 return sorted_keys_.end();
424 } 456 }
425 457
458 // static
459 std::vector<string16> ProfileInfoCache::GetProfileNames() {
460 std::vector<string16> names;
461 PrefService* local_state = g_browser_process->local_state();
462 const DictionaryValue* cache = local_state->GetDictionary(
463 prefs::kProfileInfoCache);
464 string16 name;
465 for (base::DictionaryValue::key_iterator it = cache->begin_keys();
466 it != cache->end_keys();
467 ++it) {
468 base::DictionaryValue* info = NULL;
469 cache->GetDictionary(*it, &info);
470 info->GetString(kNameKey, &name);
471 names.push_back(name);
472 }
473 return names;
474 }
475
476 // static
426 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) { 477 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) {
427 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache); 478 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache);
428 } 479 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698