| 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 4e6803e2ceb57727fbdd9386df1918ab01c384ac..afbda882e5de226aca50d3c25b04d508b6d3b766 100644
|
| --- a/chrome/browser/profiles/profile_info_cache.cc
|
| +++ b/chrome/browser/profiles/profile_info_cache.cc
|
| @@ -135,6 +135,13 @@ void ReadBitmap(const base::FilePath& image_path,
|
| *out_image = new gfx::Image(image);
|
| }
|
|
|
| +void RunCallbackIfFileMissing(const base::FilePath& file_path,
|
| + const base::Closure& callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| + if (!base::PathExists(file_path))
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
|
| +}
|
| +
|
| void DeleteBitmap(const base::FilePath& image_path) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| base::DeleteFile(image_path, false);
|
| @@ -214,7 +221,7 @@ void ProfileInfoCache::AddProfileToCache(
|
| sorted_keys_.insert(FindPositionForProfile(key, name), key);
|
|
|
| if (switches::IsNewAvatarMenu())
|
| - DownloadHighResAvatar(icon_index, profile_path);
|
| + DownloadHighResAvatarIfNeeded(icon_index, profile_path);
|
|
|
| FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
|
| observer_list_,
|
| @@ -536,9 +543,8 @@ void ProfileInfoCache::SetAvatarIconOfProfileAtIndex(size_t index,
|
|
|
| base::FilePath profile_path = GetPathOfProfileAtIndex(index);
|
|
|
| - // If needed, start downloading the high-res avatar.
|
| if (switches::IsNewAvatarMenu())
|
| - DownloadHighResAvatar(icon_index, profile_path);
|
| + DownloadHighResAvatarIfNeeded(icon_index, profile_path);
|
|
|
| FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
|
| observer_list_,
|
| @@ -693,7 +699,6 @@ void ProfileInfoCache::SetIsUsingGAIAPictureOfProfileAtIndex(size_t index,
|
| // This takes ownership of |info|.
|
| SetInfoForProfileAtIndex(index, info.release());
|
|
|
| - // Retrieve some info to update observers who care about avatar changes.
|
| base::FilePath profile_path = GetPathOfProfileAtIndex(index);
|
| FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
|
| observer_list_,
|
| @@ -848,7 +853,7 @@ void ProfileInfoCache::RegisterPrefs(PrefRegistrySimple* registry) {
|
| registry->RegisterDictionaryPref(prefs::kProfileInfoCache);
|
| }
|
|
|
| -void ProfileInfoCache::DownloadHighResAvatar(
|
| +void ProfileInfoCache::DownloadHighResAvatarIfNeeded(
|
| size_t icon_index,
|
| const base::FilePath& profile_path) {
|
| // Downloading is only supported on desktop.
|
| @@ -856,25 +861,15 @@ void ProfileInfoCache::DownloadHighResAvatar(
|
| return;
|
| #endif
|
|
|
| - // TODO(noms): We should check whether the file already exists on disk
|
| - // before trying to re-download it. For now, since this is behind a flag and
|
| - // the resources are still changing, re-download it every time the profile
|
| - // avatar changes, to make sure we have the latest copy.
|
| - std::string file_name = profiles::GetDefaultAvatarIconFileNameAtIndex(
|
| - icon_index);
|
| - // If the file is already being downloaded, don't start another download.
|
| - if (avatar_images_downloads_in_progress_[file_name])
|
| - return;
|
| -
|
| - // Start the download for this file. The cache takes ownership of the
|
| - // |avatar_downloader|, which will be deleted when the download completes, or
|
| - // if that never happens, when the ProfileInfoCache is destroyed.
|
| - ProfileAvatarDownloader* avatar_downloader = new ProfileAvatarDownloader(
|
| - icon_index,
|
| - profile_path,
|
| - this);
|
| - avatar_images_downloads_in_progress_[file_name] = avatar_downloader;
|
| - avatar_downloader->Start();
|
| + const base::FilePath& file_path =
|
| + profiles::GetPathOfHighResAvatarAtIndex(icon_index);
|
| + base::Closure callback =
|
| + base::Bind(&ProfileInfoCache::DownloadHighResAvatar,
|
| + AsWeakPtr(),
|
| + icon_index,
|
| + profile_path);
|
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&RunCallbackIfFileMissing, file_path, callback));
|
| }
|
|
|
| void ProfileInfoCache::SaveAvatarImageAtPath(
|
| @@ -888,12 +883,18 @@ void ProfileInfoCache::SaveAvatarImageAtPath(
|
| scoped_refptr<base::RefCountedMemory> png_data = image->As1xPNGBytes();
|
| data->assign(png_data->front(), png_data->front() + png_data->size());
|
|
|
| + // Remove the file from the list of downloads in progress. Note that this list
|
| + // only contains the high resolution avatars, and not the Gaia profile images.
|
| + if (avatar_images_downloads_in_progress_[key]) {
|
| + delete avatar_images_downloads_in_progress_[key];
|
| + avatar_images_downloads_in_progress_[key] = NULL;
|
| + }
|
| +
|
| if (!data->size()) {
|
| LOG(ERROR) << "Failed to PNG encode the image.";
|
| } else {
|
| base::Closure callback = base::Bind(&ProfileInfoCache::OnAvatarPictureSaved,
|
| AsWeakPtr(), key, profile_path);
|
| -
|
| BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
|
| base::Bind(&SaveBitmap, base::Passed(&data), image_path, callback));
|
| }
|
| @@ -1015,6 +1016,30 @@ const gfx::Image* ProfileInfoCache::GetHighResAvatarOfProfileAtIndex(
|
| key, image_path);
|
| }
|
|
|
| +void ProfileInfoCache::DownloadHighResAvatar(
|
| + size_t icon_index,
|
| + const base::FilePath& profile_path) {
|
| + // Downloading is only supported on desktop.
|
| +#if defined(OS_ANDROID) || defined(OS_IOS) || defined(OS_CHROMEOS)
|
| + return;
|
| +#endif
|
| + const std::string file_name =
|
| + profiles::GetDefaultAvatarIconFileNameAtIndex(icon_index);
|
| + // If the file is already being downloaded, don't start another download.
|
| + if (avatar_images_downloads_in_progress_[file_name])
|
| + return;
|
| +
|
| + // Start the download for this file. The cache takes ownership of the
|
| + // |avatar_downloader|, which will be deleted when the download completes, or
|
| + // if that never happens, when the ProfileInfoCache is destroyed.
|
| + ProfileAvatarDownloader* avatar_downloader = new ProfileAvatarDownloader(
|
| + icon_index,
|
| + profile_path,
|
| + this);
|
| + avatar_images_downloads_in_progress_[file_name] = avatar_downloader;
|
| + avatar_downloader->Start();
|
| +}
|
| +
|
| const gfx::Image* ProfileInfoCache::LoadAvatarPictureFromPath(
|
| const base::FilePath& profile_path,
|
| const std::string& key,
|
| @@ -1063,7 +1088,7 @@ void ProfileInfoCache::OnAvatarPictureLoaded(const base::FilePath& profile_path,
|
|
|
| FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
|
| observer_list_,
|
| - OnProfileAvatarChanged(profile_path));
|
| + OnProfileHighResAvatarLoaded(profile_path));
|
| }
|
|
|
| void ProfileInfoCache::OnAvatarPictureSaved(
|
| @@ -1077,16 +1102,8 @@ void ProfileInfoCache::OnAvatarPictureSaved(
|
| content::NotificationService::NoDetails());
|
|
|
| FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
|
| - observer_list_,
|
| - OnProfileAvatarChanged(profile_path));
|
| -
|
| - // Remove the file from the list of downloads in progress. Note that this list
|
| - // only contains the high resolution avatars, and not the Gaia profile images.
|
| - if (!avatar_images_downloads_in_progress_[file_name])
|
| - return;
|
| -
|
| - delete avatar_images_downloads_in_progress_[file_name];
|
| - avatar_images_downloads_in_progress_[file_name] = NULL;
|
| + observer_list_,
|
| + OnProfileHighResAvatarLoaded(profile_path));
|
| }
|
|
|
| void ProfileInfoCache::MigrateLegacyProfileNamesAndDownloadAvatars() {
|
| @@ -1110,9 +1127,8 @@ void ProfileInfoCache::MigrateLegacyProfileNamesAndDownloadAvatars() {
|
| l10n_util::GetStringUTF16(IDS_LEGACY_DEFAULT_PROFILE_NAME));
|
|
|
| for (size_t i = 0; i < GetNumberOfProfiles(); i++) {
|
| - // If needed, start downloading the high-res avatar for this profile.
|
| - DownloadHighResAvatar(GetAvatarIconIndexOfProfileAtIndex(i),
|
| - GetPathOfProfileAtIndex(i));
|
| + DownloadHighResAvatarIfNeeded(GetAvatarIconIndexOfProfileAtIndex(i),
|
| + GetPathOfProfileAtIndex(i));
|
|
|
| base::string16 name = base::i18n::ToLower(GetNameOfProfileAtIndex(i));
|
| if (name == default_profile_name || name == default_legacy_profile_name)
|
|
|