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

Unified Diff: chrome/browser/profiles/profile_info_cache.cc

Issue 8539043: Refactor ProfileInfoCache (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/profiles/profile_info_cache.h ('k') | chrome/browser/profiles/profile_info_entry.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/profiles/profile_info_cache.cc
diff --git a/chrome/browser/profiles/profile_info_cache.cc b/chrome/browser/profiles/profile_info_cache.cc
index c0966da348b2ab04e09c279767c0bc8a1308188f..4ef8bfc69ea68aa35900a51cfac8e34a105a0e72 100644
--- a/chrome/browser/profiles/profile_info_cache.cc
+++ b/chrome/browser/profiles/profile_info_cache.cc
@@ -4,89 +4,15 @@
#include "chrome/browser/profiles/profile_info_cache.h"
-#include "base/format_macros.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
-#include "base/rand_util.h"
-#include "base/string_number_conversions.h"
-#include "base/stringprintf.h"
-#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prefs/scoped_user_pref_update.h"
+#include "chrome/browser/profiles/profile_info_util.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_service.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-
-namespace {
-
-const char kNameKey[] = "name";
-const char kUserNameKey[] = "user_name";
-const char kAvatarIconKey[] = "avatar_icon";
-const char kBackgroundAppsKey[] = "background_apps";
-const char kDefaultUrlPrefix[] = "chrome://theme/IDR_PROFILE_AVATAR_";
-
-const int kDefaultAvatarIconResources[] = {
- IDR_PROFILE_AVATAR_0,
- IDR_PROFILE_AVATAR_1,
- IDR_PROFILE_AVATAR_2,
- IDR_PROFILE_AVATAR_3,
- IDR_PROFILE_AVATAR_4,
- IDR_PROFILE_AVATAR_5,
- IDR_PROFILE_AVATAR_6,
- IDR_PROFILE_AVATAR_7,
- IDR_PROFILE_AVATAR_8,
- IDR_PROFILE_AVATAR_9,
- IDR_PROFILE_AVATAR_10,
- IDR_PROFILE_AVATAR_11,
- IDR_PROFILE_AVATAR_12,
- IDR_PROFILE_AVATAR_13,
- IDR_PROFILE_AVATAR_14,
- IDR_PROFILE_AVATAR_15,
- IDR_PROFILE_AVATAR_16,
- IDR_PROFILE_AVATAR_17,
- IDR_PROFILE_AVATAR_18,
- IDR_PROFILE_AVATAR_19,
- IDR_PROFILE_AVATAR_20,
- IDR_PROFILE_AVATAR_21,
- IDR_PROFILE_AVATAR_22,
- IDR_PROFILE_AVATAR_23,
- IDR_PROFILE_AVATAR_24,
- IDR_PROFILE_AVATAR_25,
-};
-
-const size_t kDefaultAvatarIconsCount = arraysize(kDefaultAvatarIconResources);
-
-// The first 8 icons are generic.
-const size_t kGenericIconCount = 8;
-
-// First eight are generic icons, which use IDS_NUMBERED_PROFILE_NAME.
-const int kDefaultNames[] = {
- IDS_DEFAULT_AVATAR_NAME_8,
- IDS_DEFAULT_AVATAR_NAME_9,
- IDS_DEFAULT_AVATAR_NAME_10,
- IDS_DEFAULT_AVATAR_NAME_11,
- IDS_DEFAULT_AVATAR_NAME_12,
- IDS_DEFAULT_AVATAR_NAME_13,
- IDS_DEFAULT_AVATAR_NAME_14,
- IDS_DEFAULT_AVATAR_NAME_15,
- IDS_DEFAULT_AVATAR_NAME_16,
- IDS_DEFAULT_AVATAR_NAME_17,
- IDS_DEFAULT_AVATAR_NAME_18,
- IDS_DEFAULT_AVATAR_NAME_19,
- IDS_DEFAULT_AVATAR_NAME_20,
- IDS_DEFAULT_AVATAR_NAME_21,
- IDS_DEFAULT_AVATAR_NAME_22,
- IDS_DEFAULT_AVATAR_NAME_23,
- IDS_DEFAULT_AVATAR_NAME_24,
- IDS_DEFAULT_AVATAR_NAME_25
-};
-
-} // namespace
ProfileInfoCache::ProfileInfoCache(PrefService* prefs,
const FilePath& user_data_dir)
@@ -99,47 +25,52 @@ ProfileInfoCache::ProfileInfoCache(PrefService* prefs,
it != cache->end_keys(); ++it) {
std::string key = *it;
DictionaryValue* info = NULL;
- cache->GetDictionary(key, &info);
- string16 name;
- info->GetString(kNameKey, &name);
- sorted_keys_.insert(FindPositionForProfile(key, name), key);
+ if (cache->GetDictionary(key, &info)) {
+ FilePath path = user_data_dir.AppendASCII(key);
+ cached_entries_[key] = ProfileInfoEntry(path, *info);
+ }
}
}
ProfileInfoCache::~ProfileInfoCache() {
}
-void ProfileInfoCache::AddProfileToCache(const FilePath& profile_path,
- const string16& name,
- const string16& username,
- size_t icon_index) {
- std::string key = CacheKeyFromProfilePath(profile_path);
- DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
- DictionaryValue* cache = update.Get();
+size_t ProfileInfoCache::GetNumberOfProfiles() const {
+ return cached_entries_.size();
+}
- scoped_ptr<DictionaryValue> info(new DictionaryValue);
- info->SetString(kNameKey, name);
- info->SetString(kUserNameKey, username);
- info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index));
- // Default value for whether background apps are running is false.
- info->SetBoolean(kBackgroundAppsKey, false);
- cache->Set(key, info.release());
+std::vector<ProfileInfoEntry> ProfileInfoCache::GetProfilesSortedByName()
+ const {
+ std::vector<ProfileInfoEntry> entries;
+ for (std::map<std::string, ProfileInfoEntry>::const_iterator it =
+ cached_entries_.begin(); it != cached_entries_.end(); ++it) {
+ entries.push_back(it->second);
+ }
+ std::sort(entries.begin(), entries.end());
+ return entries;
+}
- sorted_keys_.insert(FindPositionForProfile(key, name), key);
+bool ProfileInfoCache::GetInfoForProfile(const FilePath& path,
+ ProfileInfoEntry* entry) const {
+ // If the info is not in the cache then the profile was deleted.
+ std::string key = CacheKeyFromProfilePath(path);
+ std::map<std::string, ProfileInfoEntry>::const_iterator it =
+ cached_entries_.find(key);
+ if (it == cached_entries_.end())
+ return false;
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
- content::NotificationService::AllSources(),
- content::NotificationService::NoDetails());
+ *entry = it->second;
+ return true;
}
void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) {
+ std::string key = CacheKeyFromProfilePath(profile_path);
+ if (cached_entries_.count(key))
+ cached_entries_.erase(key);
+
DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
DictionaryValue* cache = update.Get();
-
- std::string key = CacheKeyFromProfilePath(profile_path);
cache->Remove(key, NULL);
- sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key));
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
@@ -147,85 +78,13 @@ void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) {
content::NotificationService::NoDetails());
}
-size_t ProfileInfoCache::GetNumberOfProfiles() const {
- return sorted_keys_.size();
-}
-
-size_t ProfileInfoCache::GetIndexOfProfileWithPath(
- const FilePath& profile_path) const {
- if (profile_path.DirName() != user_data_dir_)
- return std::string::npos;
- std::string search_key = CacheKeyFromProfilePath(profile_path);
- for (size_t i = 0; i < sorted_keys_.size(); ++i) {
- if (sorted_keys_[i] == search_key)
- return i;
- }
- return std::string::npos;
-}
-
-string16 ProfileInfoCache::GetNameOfProfileAtIndex(size_t index) const {
- string16 name;
- GetInfoForProfileAtIndex(index)->GetString(kNameKey, &name);
- return name;
-}
-
-FilePath ProfileInfoCache::GetPathOfProfileAtIndex(size_t index) const {
- FilePath::StringType base_name;
-#if defined(OS_POSIX)
- base_name = sorted_keys_[index];
-#elif defined(OS_WIN)
- base_name = ASCIIToWide(sorted_keys_[index]);
-#endif
- return user_data_dir_.Append(base_name);
-}
-
-string16 ProfileInfoCache::GetUserNameOfProfileAtIndex(size_t index) const {
- string16 user_name;
- GetInfoForProfileAtIndex(index)->GetString(kUserNameKey, &user_name);
- return user_name;
-}
-
-const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex(
- size_t index) const {
- int resource_id = GetDefaultAvatarIconResourceIDAtIndex(
- GetAvatarIconIndexOfProfileAtIndex(index));
- return ResourceBundle::GetSharedInstance().GetImageNamed(resource_id);
-}
-
-bool ProfileInfoCache::GetBackgroundStatusOfProfileAtIndex(
- size_t index) const {
- bool background_app_status;
- GetInfoForProfileAtIndex(index)->GetBoolean(kBackgroundAppsKey,
- &background_app_status);
- return background_app_status;
-}
-
-size_t ProfileInfoCache::GetAvatarIconIndexOfProfileAtIndex(size_t index)
- const {
- std::string icon_url;
- GetInfoForProfileAtIndex(index)->GetString(kAvatarIconKey, &icon_url);
- size_t icon_index = 0;
- if (IsDefaultAvatarIconUrl(icon_url, &icon_index))
- return icon_index;
-
- DLOG(WARNING) << "Unknown avatar icon: " << icon_url;
- return GetDefaultAvatarIconResourceIDAtIndex(0);
-}
+void ProfileInfoCache::SetInfoForProfile(const ProfileInfoEntry& info) {
+ std::string key = CacheKeyFromProfilePath(info.path());
+ cached_entries_[key] = info;
-void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index,
- const string16& name) {
- scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
- info->SetString(kNameKey, name);
- // This takes ownership of |info|.
- SetInfoForProfileAtIndex(index, info.release());
-
- // Remove and reinsert key in |sorted_keys_| to alphasort.
- std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index));
- std::vector<std::string>::iterator key_it =
- std::find(sorted_keys_.begin(), sorted_keys_.end(), key);
- DCHECK(key_it != sorted_keys_.end());
- sorted_keys_.erase(key_it);
- sorted_keys_.insert(FindPositionForProfile(key, name), key);
+ DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
+ DictionaryValue* cache = update.Get();
+ cache->Set(key, info.GetEntryAsDictionary());
content::NotificationService::current()->Notify(
chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
@@ -233,173 +92,10 @@ void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index,
content::NotificationService::NoDetails());
}
-void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index,
- const string16& user_name) {
- string16 old_user_name;
- const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index);
- old_info->GetString(kUserNameKey, &old_user_name);
- if (old_user_name == user_name)
- return;
-
- scoped_ptr<DictionaryValue> info(old_info->DeepCopy());
- info->SetString(kUserNameKey, user_name);
- // This takes ownership of |info|.
- SetInfoForProfileAtIndex(index, info.release());
-}
-
-void ProfileInfoCache::SetAvatarIconOfProfileAtIndex(size_t index,
- size_t icon_index) {
- scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
- info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index));
- // This takes ownership of |info|.
- SetInfoForProfileAtIndex(index, info.release());
-}
-
-void ProfileInfoCache::SetBackgroundStatusOfProfileAtIndex(
- size_t index,
- bool running_background_apps) {
- if (GetBackgroundStatusOfProfileAtIndex(index) == running_background_apps)
- return;
- scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
- info->SetBoolean(kBackgroundAppsKey, running_background_apps);
- // This takes ownership of |info|.
- SetInfoForProfileAtIndex(index, info.release());
-}
-
-string16 ProfileInfoCache::ChooseNameForNewProfile(size_t icon_index) {
- string16 name;
- for (int name_index = 1; ; ++name_index) {
- if (icon_index < kGenericIconCount) {
- name = l10n_util::GetStringFUTF16Int(IDS_NUMBERED_PROFILE_NAME,
- name_index);
- } else {
- name = l10n_util::GetStringUTF16(
- kDefaultNames[icon_index - kGenericIconCount]);
- if (name_index > 1)
- name.append(UTF8ToUTF16(base::IntToString(name_index)));
- }
-
- // Loop through previously named profiles to ensure we're not duplicating.
- bool name_found = false;
- for (size_t i = 0; i < GetNumberOfProfiles(); ++i) {
- if (GetNameOfProfileAtIndex(i) == name) {
- name_found = true;
- break;
- }
- }
- if (!name_found)
- return name;
- }
-}
-
-bool ProfileInfoCache::IconIndexIsUnique(size_t icon_index) const {
- for (size_t i = 0; i < GetNumberOfProfiles(); ++i) {
- if (GetAvatarIconIndexOfProfileAtIndex(i) == icon_index)
- return false;
- }
- return true;
-}
-
-bool ProfileInfoCache::ChooseAvatarIconIndexForNewProfile(
- bool allow_generic_icon,
- bool must_be_unique,
- size_t* out_icon_index) const {
- size_t start = allow_generic_icon ? 0 : kGenericIconCount;
- size_t end = GetDefaultAvatarIconCount();
- size_t count = end - start;
-
- int rand = base::RandInt(0, count);
- for (size_t i = 0; i < count; ++i) {
- size_t icon_index = start + (rand + i) % count;
- if (!must_be_unique || IconIndexIsUnique(icon_index)) {
- *out_icon_index = icon_index;
- return true;
- }
- }
-
- return false;
-}
-
-size_t ProfileInfoCache::ChooseAvatarIconIndexForNewProfile() const {
- size_t icon_index = 0;
- // Try to find a unique, non-generic icon.
- if (ChooseAvatarIconIndexForNewProfile(false, true, &icon_index))
- return icon_index;
- // Try to find any unique icon.
- if (ChooseAvatarIconIndexForNewProfile(true, true, &icon_index))
- return icon_index;
- // Settle for any random icon, even if it's not unique.
- if (ChooseAvatarIconIndexForNewProfile(true, false, &icon_index))
- return icon_index;
-
- NOTREACHED();
- return 0;
-}
-
const FilePath& ProfileInfoCache::GetUserDataDir() const {
return user_data_dir_;
}
-// static
-size_t ProfileInfoCache::GetDefaultAvatarIconCount() {
- return kDefaultAvatarIconsCount;
-}
-
-// static
-int ProfileInfoCache::GetDefaultAvatarIconResourceIDAtIndex(size_t index) {
- DCHECK_LT(index, GetDefaultAvatarIconCount());
- return kDefaultAvatarIconResources[index];
-}
-
-// static
-std::string ProfileInfoCache::GetDefaultAvatarIconUrl(size_t index) {
- DCHECK_LT(index, kDefaultAvatarIconsCount);
- return StringPrintf("%s%" PRIuS, kDefaultUrlPrefix, index);
-}
-
-// static
-bool ProfileInfoCache::IsDefaultAvatarIconUrl(const std::string& url,
- size_t* icon_index) {
- DCHECK(icon_index);
- if (url.find(kDefaultUrlPrefix) != 0)
- return false;
-
- int int_value = -1;
- if (base::StringToInt(url.begin() + strlen(kDefaultUrlPrefix),
- url.end(),
- &int_value)) {
- if (int_value < 0 ||
- int_value >= static_cast<int>(kDefaultAvatarIconsCount))
- return false;
- *icon_index = int_value;
- return true;
- }
-
- return false;
-}
-
-const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex(
- size_t index) const {
- DCHECK_LT(index, GetNumberOfProfiles());
- const DictionaryValue* cache =
- prefs_->GetDictionary(prefs::kProfileInfoCache);
- DictionaryValue* info = NULL;
- cache->GetDictionary(sorted_keys_[index], &info);
- return info;
-}
-
-void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index,
- DictionaryValue* info) {
- DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
- DictionaryValue* cache = update.Get();
- cache->Set(sorted_keys_[index], info);
-
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
- content::NotificationService::AllSources(),
- content::NotificationService::NoDetails());
-}
-
std::string ProfileInfoCache::CacheKeyFromProfilePath(
const FilePath& profile_path) const {
DCHECK(user_data_dir_ == profile_path.DirName());
@@ -407,22 +103,6 @@ std::string ProfileInfoCache::CacheKeyFromProfilePath(
return base_name.MaybeAsASCII();
}
-std::vector<std::string>::iterator ProfileInfoCache::FindPositionForProfile(
- std::string search_key,
- const string16& search_name) {
- for (size_t i = 0; i < GetNumberOfProfiles(); ++i) {
- int name_compare = search_name.compare(GetNameOfProfileAtIndex(i));
- if (name_compare < 0)
- return sorted_keys_.begin() + i;
- if (name_compare == 0) {
- int key_compare = search_key.compare(sorted_keys_[i]);
- if (key_compare < 0)
- return sorted_keys_.begin() + i;
- }
- }
- return sorted_keys_.end();
-}
-
void ProfileInfoCache::RegisterPrefs(PrefService* prefs) {
prefs->RegisterDictionaryPref(prefs::kProfileInfoCache);
}
« no previous file with comments | « chrome/browser/profiles/profile_info_cache.h ('k') | chrome/browser/profiles/profile_info_entry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698