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

Unified Diff: chrome/browser/chromeos/login/wallpaper_manager.cc

Issue 11366143: Fix the crash in DesktopBackgroundView::OnPaint (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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
Index: chrome/browser/chromeos/login/wallpaper_manager.cc
diff --git a/chrome/browser/chromeos/login/wallpaper_manager.cc b/chrome/browser/chromeos/login/wallpaper_manager.cc
index 05f307d3d42d9c346c201f9de9b6d02366641065..43243e2d3ae43342e1dcc9dc5c4d32aad8ccce1d 100644
--- a/chrome/browser/chromeos/login/wallpaper_manager.cc
+++ b/chrome/browser/chromeos/login/wallpaper_manager.cc
@@ -484,25 +484,26 @@ void WallpaperManager::SetCustomWallpaper(const std::string& username,
bool is_persistent = ShouldPersistDataForUser(username);
- BrowserThread::PostTask(
- BrowserThread::FILE,
- FROM_HERE,
- base::Bind(&WallpaperManager::GenerateUserWallpaperThumbnail,
- base::Unretained(this), username, type, delegate,
- wallpaper.image()));
+ wallpaper.image().EnsureRepsForSupportedScaleFactors();
+ scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper.image().DeepCopy());
- if (is_persistent) {
- BrowserThread::PostTask(
+ WallpaperInfo info = {
+ wallpaper_path,
+ layout,
+ User::CUSTOMIZED,
oshima 2012/11/13 17:46:42 shouldn't this be "type"?
bshe 2012/11/13 21:18:45 Aha. You are right. Sorry.
+ base::Time::Now().LocalMidnight()
oshima 2012/11/13 17:46:42 add comment that this isn't used.
bshe 2012/11/13 21:18:45 Done.
+ };
+ BrowserThread::PostTask(
BrowserThread::FILE,
FROM_HERE,
- base::Bind(&WallpaperManager::SaveCustomWallpaper,
+ base::Bind(&WallpaperManager::ProcessCustomWallpaper,
base::Unretained(this),
username,
- FilePath(wallpaper_path),
- layout,
- wallpaper));
- }
-
+ is_persistent,
+ info,
+ delegate,
+ base::Passed(&deep_copy),
+ wallpaper.raw_image()));
oshima 2012/11/12 16:39:28 Can you remove or update TODO for raw_image()? Thi
bshe 2012/11/12 19:12:48 Good point. Added a TODO. On 2012/11/12 16:39:28,
ash::Shell::GetInstance()->desktop_background_controller()->
SetCustomWallpaper(wallpaper.image(), layout);
@@ -811,9 +812,10 @@ void WallpaperManager::CacheUserWallpaper(const std::string& email) {
}
void WallpaperManager::CacheThumbnail(const std::string& email,
- const gfx::ImageSkia& wallpaper) {
+ scoped_ptr<gfx::ImageSkia> wallpaper) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- custom_wallpaper_thumbnail_cache_[email] = GetWallpaperThumbnail(wallpaper);
+ custom_wallpaper_thumbnail_cache_[email] =
+ GetWallpaperThumbnail(*wallpaper.get());
}
void WallpaperManager::DeleteWallpaperInList(
@@ -1164,13 +1166,16 @@ void WallpaperManager::OnWallpaperDecoded(const std::string& email,
}
return;
}
+ // Generate all reps before passing to another thread.
+ wallpaper.image().EnsureRepsForSupportedScaleFactors();
+ scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper.image().DeepCopy());
BrowserThread::PostTask(
BrowserThread::FILE,
FROM_HERE,
base::Bind(&WallpaperManager::CacheThumbnail,
base::Unretained(this), email,
- wallpaper.image().DeepCopy()));
+ base::Passed(&deep_copy)));
// Only cache user wallpaper at login screen.
if (!UserManager::Get()->IsUserLoggedIn()) {
wallpaper_cache_.insert(std::make_pair(email, wallpaper.image()));
@@ -1181,6 +1186,21 @@ void WallpaperManager::OnWallpaperDecoded(const std::string& email,
}
}
+void WallpaperManager::ProcessCustomWallpaper(
+ const std::string& email,
+ bool persistent,
+ const WallpaperInfo& info,
+ base::WeakPtr<WallpaperDelegate> delegate,
+ scoped_ptr<gfx::ImageSkia> image,
+ const UserImage::RawImage& raw_image) {
+ UserImage wallpaper(*image.get(), raw_image);
+ GenerateUserWallpaperThumbnail(email, info.type, delegate, wallpaper.image());
+ if (persistent)
+ SaveCustomWallpaper(email, FilePath(info.file), info.layout, wallpaper);
+}
+
+
+
void WallpaperManager::OnWallpaperEncoded(const FilePath& path,
scoped_refptr<base::RefCountedBytes> data) {
SaveWallpaperInternal(path,

Powered by Google App Engine
This is Rietveld 408576698