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

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

Issue 890873004: ProfileInfoCache: Don't delete ProfileAvatarDownloader while we're being called by it (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « chrome/browser/profiles/profile_info_cache.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "chrome/browser/profiles/profile_info_cache.h" 5 #include "chrome/browser/profiles/profile_info_cache.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/i18n/case_conversion.h" 9 #include "base/i18n/case_conversion.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
142 if (!base::PathExists(file_path)) 142 if (!base::PathExists(file_path))
143 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback); 143 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, callback);
144 } 144 }
145 145
146 void DeleteBitmap(const base::FilePath& image_path) { 146 void DeleteBitmap(const base::FilePath& image_path) {
147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
148 base::DeleteFile(image_path, false); 148 base::DeleteFile(image_path, false);
149 } 149 }
150 150
151 void DeleteDownloader(ProfileAvatarDownloader* downloader) {
noms (inactive) 2015/01/30 16:05:40 nit: add a comment as to why we would need to post
Marc Treib 2015/01/30 16:12:40 Done. This would be much nicer as an inline lambda
152 delete downloader;
153 }
154
151 } // namespace 155 } // namespace
152 156
153 ProfileInfoCache::ProfileInfoCache(PrefService* prefs, 157 ProfileInfoCache::ProfileInfoCache(PrefService* prefs,
154 const base::FilePath& user_data_dir) 158 const base::FilePath& user_data_dir)
155 : prefs_(prefs), 159 : prefs_(prefs),
156 user_data_dir_(user_data_dir) { 160 user_data_dir_(user_data_dir) {
157 // Populate the cache 161 // Populate the cache
158 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); 162 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache);
159 base::DictionaryValue* cache = update.Get(); 163 base::DictionaryValue* cache = update.Get();
160 for (base::DictionaryValue::Iterator it(*cache); 164 for (base::DictionaryValue::Iterator it(*cache);
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 const base::FilePath& image_path, 900 const base::FilePath& image_path,
897 const base::FilePath& profile_path) { 901 const base::FilePath& profile_path) {
898 cached_avatar_images_[key] = new gfx::Image(*image); 902 cached_avatar_images_[key] = new gfx::Image(*image);
899 903
900 scoped_ptr<ImageData> data(new ImageData); 904 scoped_ptr<ImageData> data(new ImageData);
901 scoped_refptr<base::RefCountedMemory> png_data = image->As1xPNGBytes(); 905 scoped_refptr<base::RefCountedMemory> png_data = image->As1xPNGBytes();
902 data->assign(png_data->front(), png_data->front() + png_data->size()); 906 data->assign(png_data->front(), png_data->front() + png_data->size());
903 907
904 // Remove the file from the list of downloads in progress. Note that this list 908 // Remove the file from the list of downloads in progress. Note that this list
905 // only contains the high resolution avatars, and not the Gaia profile images. 909 // only contains the high resolution avatars, and not the Gaia profile images.
906 if (avatar_images_downloads_in_progress_[key]) { 910 auto downloader_iter = avatar_images_downloads_in_progress_.find(key);
noms (inactive) 2015/01/30 16:05:40 YAY AUTO!!!
907 delete avatar_images_downloads_in_progress_[key]; 911 if (downloader_iter != avatar_images_downloads_in_progress_.end()) {
908 avatar_images_downloads_in_progress_[key] = NULL; 912 // We mustn't delete the avatar downloader right here, since we're being
913 // called by it.
914 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
915 base::Bind(&DeleteDownloader,
916 downloader_iter->second));
917 avatar_images_downloads_in_progress_.erase(downloader_iter);
909 } 918 }
910 919
911 if (!data->size()) { 920 if (!data->size()) {
912 LOG(ERROR) << "Failed to PNG encode the image."; 921 LOG(ERROR) << "Failed to PNG encode the image.";
913 } else { 922 } else {
914 base::Closure callback = base::Bind(&ProfileInfoCache::OnAvatarPictureSaved, 923 base::Closure callback = base::Bind(&ProfileInfoCache::OnAvatarPictureSaved,
915 AsWeakPtr(), key, profile_path); 924 AsWeakPtr(), key, profile_path);
916 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 925 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
917 base::Bind(&SaveBitmap, base::Passed(&data), image_path, callback)); 926 base::Bind(&SaveBitmap, base::Passed(&data), image_path, callback));
918 } 927 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 void ProfileInfoCache::DownloadHighResAvatar( 1050 void ProfileInfoCache::DownloadHighResAvatar(
1042 size_t icon_index, 1051 size_t icon_index,
1043 const base::FilePath& profile_path) { 1052 const base::FilePath& profile_path) {
1044 // Downloading is only supported on desktop. 1053 // Downloading is only supported on desktop.
1045 #if defined(OS_ANDROID) || defined(OS_IOS) || defined(OS_CHROMEOS) 1054 #if defined(OS_ANDROID) || defined(OS_IOS) || defined(OS_CHROMEOS)
1046 return; 1055 return;
1047 #endif 1056 #endif
1048 const std::string file_name = 1057 const std::string file_name =
1049 profiles::GetDefaultAvatarIconFileNameAtIndex(icon_index); 1058 profiles::GetDefaultAvatarIconFileNameAtIndex(icon_index);
1050 // If the file is already being downloaded, don't start another download. 1059 // If the file is already being downloaded, don't start another download.
1051 if (avatar_images_downloads_in_progress_[file_name]) 1060 if (avatar_images_downloads_in_progress_.count(file_name))
1052 return; 1061 return;
1053 1062
1054 // Start the download for this file. The cache takes ownership of the 1063 // Start the download for this file. The cache takes ownership of the
1055 // |avatar_downloader|, which will be deleted when the download completes, or 1064 // |avatar_downloader|, which will be deleted when the download completes, or
1056 // if that never happens, when the ProfileInfoCache is destroyed. 1065 // if that never happens, when the ProfileInfoCache is destroyed.
1057 ProfileAvatarDownloader* avatar_downloader = new ProfileAvatarDownloader( 1066 ProfileAvatarDownloader* avatar_downloader = new ProfileAvatarDownloader(
1058 icon_index, 1067 icon_index,
1059 profile_path, 1068 profile_path,
1060 this); 1069 this);
1061 avatar_images_downloads_in_progress_[file_name] = avatar_downloader; 1070 avatar_images_downloads_in_progress_[file_name] = avatar_downloader;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 std::vector<base::FilePath>::const_iterator it; 1170 std::vector<base::FilePath>::const_iterator it;
1162 for (it = profiles_to_rename.begin(); it != profiles_to_rename.end(); ++it) { 1171 for (it = profiles_to_rename.begin(); it != profiles_to_rename.end(); ++it) {
1163 size_t profile_index = GetIndexOfProfileWithPath(*it); 1172 size_t profile_index = GetIndexOfProfileWithPath(*it);
1164 SetProfileIsUsingDefaultNameAtIndex(profile_index, true); 1173 SetProfileIsUsingDefaultNameAtIndex(profile_index, true);
1165 // This will assign a new "Person %d" type name and re-sort the cache. 1174 // This will assign a new "Person %d" type name and re-sort the cache.
1166 SetNameOfProfileAtIndex(profile_index, ChooseNameForNewProfile( 1175 SetNameOfProfileAtIndex(profile_index, ChooseNameForNewProfile(
1167 GetAvatarIconIndexOfProfileAtIndex(profile_index))); 1176 GetAvatarIconIndexOfProfileAtIndex(profile_index)));
1168 } 1177 }
1169 #endif 1178 #endif
1170 } 1179 }
OLDNEW
« no previous file with comments | « chrome/browser/profiles/profile_info_cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698