Chromium Code Reviews| Index: ash/desktop_background/desktop_background_controller.cc |
| diff --git a/ash/desktop_background/desktop_background_controller.cc b/ash/desktop_background/desktop_background_controller.cc |
| index d1c67a93f0db256e4869c6aaf645fcb014347b39..81174c2db2b08739bf5ce6027ea2485d376ba982 100644 |
| --- a/ash/desktop_background/desktop_background_controller.cc |
| +++ b/ash/desktop_background/desktop_background_controller.cc |
| @@ -70,9 +70,25 @@ class DesktopBackgroundController::WallpaperLoader |
| resource_layout_(resource_layout) { |
| } |
| - static void LoadOnWorkerPoolThread(scoped_refptr<WallpaperLoader> loader) { |
|
Daniel Erat
2013/12/26 20:52:00
i don't know why this was a static method; making
|
| + void LoadOnWorkerPoolThread() { |
| DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - loader->LoadWallpaper(); |
| + if (cancel_flag_.IsSet()) |
| + return; |
| + |
| + if (!file_path_.empty()) |
| + file_bitmap_ = LoadSkBitmapFromJPEGFile(file_path_); |
| + |
| + if (cancel_flag_.IsSet()) |
| + return; |
| + |
| + if (file_bitmap_) { |
| + gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(*file_bitmap_); |
| + wallpaper_resizer_.reset(new WallpaperResizer( |
| + image, GetMaxDisplaySizeInNative(), file_layout_)); |
| + } else { |
| + wallpaper_resizer_.reset(new WallpaperResizer( |
| + resource_id_, GetMaxDisplaySizeInNative(), resource_layout_)); |
| + } |
| } |
| const base::FilePath& file_path() const { return file_path_; } |
| @@ -82,6 +98,10 @@ class DesktopBackgroundController::WallpaperLoader |
| cancel_flag_.Set(); |
| } |
| + bool IsCanceled() { |
| + return cancel_flag_.IsSet(); |
| + } |
| + |
| WallpaperResizer* ReleaseWallpaperResizer() { |
| return wallpaper_resizer_.release(); |
| } |
| @@ -108,26 +128,6 @@ class DesktopBackgroundController::WallpaperLoader |
| return bitmap.Pass(); |
| } |
| - void LoadWallpaper() { |
| - if (cancel_flag_.IsSet()) |
| - return; |
| - |
| - if (!file_path_.empty()) |
| - file_bitmap_ = LoadSkBitmapFromJPEGFile(file_path_); |
| - |
| - if (cancel_flag_.IsSet()) |
| - return; |
| - |
| - if (file_bitmap_) { |
| - gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(*file_bitmap_); |
| - wallpaper_resizer_.reset(new WallpaperResizer( |
| - image, GetMaxDisplaySizeInNative(), file_layout_)); |
| - } else { |
| - wallpaper_resizer_.reset(new WallpaperResizer( |
| - resource_id_, GetMaxDisplaySizeInNative(), resource_layout_)); |
| - } |
| - } |
| - |
| ~WallpaperLoader() {} |
| base::CancellationFlag cancel_flag_; |
| @@ -163,7 +163,7 @@ DesktopBackgroundController::DesktopBackgroundController() |
| } |
| DesktopBackgroundController::~DesktopBackgroundController() { |
| - CancelPendingWallpaperOperation(); |
| + CancelDefaultWallpaperLoader(); |
| Shell::GetInstance()->display_controller()->RemoveObserver(this); |
| } |
| @@ -232,15 +232,16 @@ bool DesktopBackgroundController::SetDefaultWallpaper(bool is_guest) { |
| if (DefaultWallpaperIsAlreadyLoadingOrLoaded(file_path, resource_id)) |
| return false; |
| - CancelPendingWallpaperOperation(); |
| - wallpaper_loader_ = new WallpaperLoader( |
| + CancelDefaultWallpaperLoader(); |
| + default_wallpaper_loader_ = new WallpaperLoader( |
| file_path, file_layout, resource_id, resource_layout); |
| base::WorkerPool::PostTaskAndReply( |
| FROM_HERE, |
| - base::Bind(&WallpaperLoader::LoadOnWorkerPoolThread, wallpaper_loader_), |
| + base::Bind(&WallpaperLoader::LoadOnWorkerPoolThread, |
| + default_wallpaper_loader_), |
| base::Bind(&DesktopBackgroundController::OnDefaultWallpaperLoadCompleted, |
| weak_ptr_factory_.GetWeakPtr(), |
| - wallpaper_loader_), |
| + default_wallpaper_loader_), |
| true /* task_is_slow */); |
| return true; |
| } |
| @@ -248,7 +249,8 @@ bool DesktopBackgroundController::SetDefaultWallpaper(bool is_guest) { |
| void DesktopBackgroundController::SetCustomWallpaper( |
| const gfx::ImageSkia& image, |
| WallpaperLayout layout) { |
| - CancelPendingWallpaperOperation(); |
| + CancelDefaultWallpaperLoader(); |
| + |
| if (CustomWallpaperIsAlreadyLoaded(image)) |
| return; |
| @@ -264,10 +266,10 @@ void DesktopBackgroundController::SetCustomWallpaper( |
| SetDesktopBackgroundImageMode(); |
| } |
| -void DesktopBackgroundController::CancelPendingWallpaperOperation() { |
| +void DesktopBackgroundController::CancelDefaultWallpaperLoader() { |
| // Set canceled flag of previous request to skip unneeded loading. |
| - if (wallpaper_loader_.get()) |
| - wallpaper_loader_->Cancel(); |
| + if (default_wallpaper_loader_.get()) |
| + default_wallpaper_loader_->Cancel(); |
| // Cancel reply callback for previous request. |
| weak_ptr_factory_.InvalidateWeakPtrs(); |
| @@ -318,10 +320,12 @@ void DesktopBackgroundController::OnDisplayConfigurationChanged() { |
| } |
| bool DesktopBackgroundController::DefaultWallpaperIsAlreadyLoadingOrLoaded( |
| - const base::FilePath& image_file, int image_resource_id) const { |
| - return (wallpaper_loader_.get() && |
| - wallpaper_loader_->file_path() == image_file && |
| - wallpaper_loader_->resource_id() == image_resource_id) || |
| + const base::FilePath& image_file, |
| + int image_resource_id) const { |
| + return (default_wallpaper_loader_.get() && |
| + !default_wallpaper_loader_->IsCanceled() && |
|
Daniel Erat
2013/12/26 20:52:00
this is the fix
|
| + default_wallpaper_loader_->file_path() == image_file && |
| + default_wallpaper_loader_->resource_id() == image_resource_id) || |
| (current_wallpaper_.get() && |
| current_default_wallpaper_path_ == image_file && |
| current_default_wallpaper_resource_id_ == image_resource_id); |
| @@ -350,8 +354,8 @@ void DesktopBackgroundController::OnDefaultWallpaperLoadCompleted( |
| SetDesktopBackgroundImageMode(); |
| - DCHECK(loader.get() == wallpaper_loader_.get()); |
| - wallpaper_loader_ = NULL; |
| + DCHECK(loader.get() == default_wallpaper_loader_.get()); |
| + default_wallpaper_loader_ = NULL; |
| } |
| void DesktopBackgroundController::InstallDesktopController( |