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) { |
+ 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() && |
+ 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( |