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

Side by Side Diff: ash/desktop_background/desktop_background_controller.cc

Issue 110463004: ash: Fix DesktopBackgroundController getting stuck. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 12 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 | Annotate | Revision Log
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 "ash/desktop_background/desktop_background_controller.h" 5 #include "ash/desktop_background/desktop_background_controller.h"
6 6
7 #include "ash/ash_switches.h" 7 #include "ash/ash_switches.h"
8 #include "ash/desktop_background/desktop_background_controller_observer.h" 8 #include "ash/desktop_background/desktop_background_controller_observer.h"
9 #include "ash/desktop_background/desktop_background_view.h" 9 #include "ash/desktop_background/desktop_background_view.h"
10 #include "ash/desktop_background/desktop_background_widget_controller.h" 10 #include "ash/desktop_background/desktop_background_widget_controller.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 WallpaperLoader(const base::FilePath& file_path, 63 WallpaperLoader(const base::FilePath& file_path,
64 WallpaperLayout file_layout, 64 WallpaperLayout file_layout,
65 int resource_id, 65 int resource_id,
66 WallpaperLayout resource_layout) 66 WallpaperLayout resource_layout)
67 : file_path_(file_path), 67 : file_path_(file_path),
68 file_layout_(file_layout), 68 file_layout_(file_layout),
69 resource_id_(resource_id), 69 resource_id_(resource_id),
70 resource_layout_(resource_layout) { 70 resource_layout_(resource_layout) {
71 } 71 }
72 72
73 static void LoadOnWorkerPoolThread(scoped_refptr<WallpaperLoader> loader) { 73 void LoadOnWorkerPoolThread() {
Daniel Erat 2013/12/26 20:52:00 i don't know why this was a static method; making
74 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI)); 74 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
75 loader->LoadWallpaper(); 75 if (cancel_flag_.IsSet())
76 return;
77
78 if (!file_path_.empty())
79 file_bitmap_ = LoadSkBitmapFromJPEGFile(file_path_);
80
81 if (cancel_flag_.IsSet())
82 return;
83
84 if (file_bitmap_) {
85 gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(*file_bitmap_);
86 wallpaper_resizer_.reset(new WallpaperResizer(
87 image, GetMaxDisplaySizeInNative(), file_layout_));
88 } else {
89 wallpaper_resizer_.reset(new WallpaperResizer(
90 resource_id_, GetMaxDisplaySizeInNative(), resource_layout_));
91 }
76 } 92 }
77 93
78 const base::FilePath& file_path() const { return file_path_; } 94 const base::FilePath& file_path() const { return file_path_; }
79 int resource_id() const { return resource_id_; } 95 int resource_id() const { return resource_id_; }
80 96
81 void Cancel() { 97 void Cancel() {
82 cancel_flag_.Set(); 98 cancel_flag_.Set();
83 } 99 }
84 100
101 bool IsCanceled() {
102 return cancel_flag_.IsSet();
103 }
104
85 WallpaperResizer* ReleaseWallpaperResizer() { 105 WallpaperResizer* ReleaseWallpaperResizer() {
86 return wallpaper_resizer_.release(); 106 return wallpaper_resizer_.release();
87 } 107 }
88 108
89 private: 109 private:
90 friend class base::RefCountedThreadSafe< 110 friend class base::RefCountedThreadSafe<
91 DesktopBackgroundController::WallpaperLoader>; 111 DesktopBackgroundController::WallpaperLoader>;
92 112
93 // Loads a JPEG image from |path|, a trusted file -- note that the image 113 // Loads a JPEG image from |path|, a trusted file -- note that the image
94 // is not loaded in a sandboxed process. Returns an empty pointer on 114 // is not loaded in a sandboxed process. Returns an empty pointer on
95 // error. 115 // error.
96 static scoped_ptr<SkBitmap> LoadSkBitmapFromJPEGFile( 116 static scoped_ptr<SkBitmap> LoadSkBitmapFromJPEGFile(
97 const base::FilePath& path) { 117 const base::FilePath& path) {
98 std::string data; 118 std::string data;
99 if (!base::ReadFileToString(path, &data)) { 119 if (!base::ReadFileToString(path, &data)) {
100 LOG(ERROR) << "Unable to read data from " << path.value(); 120 LOG(ERROR) << "Unable to read data from " << path.value();
101 return scoped_ptr<SkBitmap>(); 121 return scoped_ptr<SkBitmap>();
102 } 122 }
103 123
104 scoped_ptr<SkBitmap> bitmap(gfx::JPEGCodec::Decode( 124 scoped_ptr<SkBitmap> bitmap(gfx::JPEGCodec::Decode(
105 reinterpret_cast<const unsigned char*>(data.data()), data.size())); 125 reinterpret_cast<const unsigned char*>(data.data()), data.size()));
106 if (!bitmap) 126 if (!bitmap)
107 LOG(ERROR) << "Unable to decode JPEG data from " << path.value(); 127 LOG(ERROR) << "Unable to decode JPEG data from " << path.value();
108 return bitmap.Pass(); 128 return bitmap.Pass();
109 } 129 }
110 130
111 void LoadWallpaper() {
112 if (cancel_flag_.IsSet())
113 return;
114
115 if (!file_path_.empty())
116 file_bitmap_ = LoadSkBitmapFromJPEGFile(file_path_);
117
118 if (cancel_flag_.IsSet())
119 return;
120
121 if (file_bitmap_) {
122 gfx::ImageSkia image = gfx::ImageSkia::CreateFrom1xBitmap(*file_bitmap_);
123 wallpaper_resizer_.reset(new WallpaperResizer(
124 image, GetMaxDisplaySizeInNative(), file_layout_));
125 } else {
126 wallpaper_resizer_.reset(new WallpaperResizer(
127 resource_id_, GetMaxDisplaySizeInNative(), resource_layout_));
128 }
129 }
130
131 ~WallpaperLoader() {} 131 ~WallpaperLoader() {}
132 132
133 base::CancellationFlag cancel_flag_; 133 base::CancellationFlag cancel_flag_;
134 134
135 // Bitmap loaded from |file_path_|. 135 // Bitmap loaded from |file_path_|.
136 scoped_ptr<SkBitmap> file_bitmap_; 136 scoped_ptr<SkBitmap> file_bitmap_;
137 137
138 scoped_ptr<WallpaperResizer> wallpaper_resizer_; 138 scoped_ptr<WallpaperResizer> wallpaper_resizer_;
139 139
140 // Path to a trusted JPEG file. 140 // Path to a trusted JPEG file.
(...skipping 15 matching lines...) Expand all
156 : command_line_for_testing_(NULL), 156 : command_line_for_testing_(NULL),
157 locked_(false), 157 locked_(false),
158 desktop_background_mode_(BACKGROUND_NONE), 158 desktop_background_mode_(BACKGROUND_NONE),
159 current_default_wallpaper_resource_id_(-1), 159 current_default_wallpaper_resource_id_(-1),
160 weak_ptr_factory_(this), 160 weak_ptr_factory_(this),
161 wallpaper_reload_delay_(kWallpaperReloadDelayMs) { 161 wallpaper_reload_delay_(kWallpaperReloadDelayMs) {
162 Shell::GetInstance()->display_controller()->AddObserver(this); 162 Shell::GetInstance()->display_controller()->AddObserver(this);
163 } 163 }
164 164
165 DesktopBackgroundController::~DesktopBackgroundController() { 165 DesktopBackgroundController::~DesktopBackgroundController() {
166 CancelPendingWallpaperOperation(); 166 CancelDefaultWallpaperLoader();
167 Shell::GetInstance()->display_controller()->RemoveObserver(this); 167 Shell::GetInstance()->display_controller()->RemoveObserver(this);
168 } 168 }
169 169
170 gfx::ImageSkia DesktopBackgroundController::GetWallpaper() const { 170 gfx::ImageSkia DesktopBackgroundController::GetWallpaper() const {
171 if (current_wallpaper_) 171 if (current_wallpaper_)
172 return current_wallpaper_->image(); 172 return current_wallpaper_->image();
173 return gfx::ImageSkia(); 173 return gfx::ImageSkia();
174 } 174 }
175 175
176 void DesktopBackgroundController::AddObserver( 176 void DesktopBackgroundController::AddObserver(
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 switches::kAshGuestWallpaperSmall; 225 switches::kAshGuestWallpaperSmall;
226 } else { 226 } else {
227 switch_name = use_large ? switches::kAshDefaultWallpaperLarge : 227 switch_name = use_large ? switches::kAshDefaultWallpaperLarge :
228 switches::kAshDefaultWallpaperSmall; 228 switches::kAshDefaultWallpaperSmall;
229 } 229 }
230 file_path = command_line->GetSwitchValuePath(switch_name); 230 file_path = command_line->GetSwitchValuePath(switch_name);
231 231
232 if (DefaultWallpaperIsAlreadyLoadingOrLoaded(file_path, resource_id)) 232 if (DefaultWallpaperIsAlreadyLoadingOrLoaded(file_path, resource_id))
233 return false; 233 return false;
234 234
235 CancelPendingWallpaperOperation(); 235 CancelDefaultWallpaperLoader();
236 wallpaper_loader_ = new WallpaperLoader( 236 default_wallpaper_loader_ = new WallpaperLoader(
237 file_path, file_layout, resource_id, resource_layout); 237 file_path, file_layout, resource_id, resource_layout);
238 base::WorkerPool::PostTaskAndReply( 238 base::WorkerPool::PostTaskAndReply(
239 FROM_HERE, 239 FROM_HERE,
240 base::Bind(&WallpaperLoader::LoadOnWorkerPoolThread, wallpaper_loader_), 240 base::Bind(&WallpaperLoader::LoadOnWorkerPoolThread,
241 default_wallpaper_loader_),
241 base::Bind(&DesktopBackgroundController::OnDefaultWallpaperLoadCompleted, 242 base::Bind(&DesktopBackgroundController::OnDefaultWallpaperLoadCompleted,
242 weak_ptr_factory_.GetWeakPtr(), 243 weak_ptr_factory_.GetWeakPtr(),
243 wallpaper_loader_), 244 default_wallpaper_loader_),
244 true /* task_is_slow */); 245 true /* task_is_slow */);
245 return true; 246 return true;
246 } 247 }
247 248
248 void DesktopBackgroundController::SetCustomWallpaper( 249 void DesktopBackgroundController::SetCustomWallpaper(
249 const gfx::ImageSkia& image, 250 const gfx::ImageSkia& image,
250 WallpaperLayout layout) { 251 WallpaperLayout layout) {
251 CancelPendingWallpaperOperation(); 252 CancelDefaultWallpaperLoader();
253
252 if (CustomWallpaperIsAlreadyLoaded(image)) 254 if (CustomWallpaperIsAlreadyLoaded(image))
253 return; 255 return;
254 256
255 current_wallpaper_.reset(new WallpaperResizer( 257 current_wallpaper_.reset(new WallpaperResizer(
256 image, GetMaxDisplaySizeInNative(), layout)); 258 image, GetMaxDisplaySizeInNative(), layout));
257 current_wallpaper_->StartResize(); 259 current_wallpaper_->StartResize();
258 260
259 current_default_wallpaper_path_ = base::FilePath(); 261 current_default_wallpaper_path_ = base::FilePath();
260 current_default_wallpaper_resource_id_ = -1; 262 current_default_wallpaper_resource_id_ = -1;
261 263
262 FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_, 264 FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_,
263 OnWallpaperDataChanged()); 265 OnWallpaperDataChanged());
264 SetDesktopBackgroundImageMode(); 266 SetDesktopBackgroundImageMode();
265 } 267 }
266 268
267 void DesktopBackgroundController::CancelPendingWallpaperOperation() { 269 void DesktopBackgroundController::CancelDefaultWallpaperLoader() {
268 // Set canceled flag of previous request to skip unneeded loading. 270 // Set canceled flag of previous request to skip unneeded loading.
269 if (wallpaper_loader_.get()) 271 if (default_wallpaper_loader_.get())
270 wallpaper_loader_->Cancel(); 272 default_wallpaper_loader_->Cancel();
271 273
272 // Cancel reply callback for previous request. 274 // Cancel reply callback for previous request.
273 weak_ptr_factory_.InvalidateWeakPtrs(); 275 weak_ptr_factory_.InvalidateWeakPtrs();
274 } 276 }
275 277
276 void DesktopBackgroundController::CreateEmptyWallpaper() { 278 void DesktopBackgroundController::CreateEmptyWallpaper() {
277 current_wallpaper_.reset(NULL); 279 current_wallpaper_.reset(NULL);
278 SetDesktopBackgroundImageMode(); 280 SetDesktopBackgroundImageMode();
279 } 281 }
280 282
(...skipping 30 matching lines...) Expand all
311 timer_.Stop(); 313 timer_.Stop();
312 timer_.Start(FROM_HERE, 314 timer_.Start(FROM_HERE,
313 base::TimeDelta::FromMilliseconds(wallpaper_reload_delay_), 315 base::TimeDelta::FromMilliseconds(wallpaper_reload_delay_),
314 this, 316 this,
315 &DesktopBackgroundController::UpdateWallpaper); 317 &DesktopBackgroundController::UpdateWallpaper);
316 } 318 }
317 } 319 }
318 } 320 }
319 321
320 bool DesktopBackgroundController::DefaultWallpaperIsAlreadyLoadingOrLoaded( 322 bool DesktopBackgroundController::DefaultWallpaperIsAlreadyLoadingOrLoaded(
321 const base::FilePath& image_file, int image_resource_id) const { 323 const base::FilePath& image_file,
322 return (wallpaper_loader_.get() && 324 int image_resource_id) const {
323 wallpaper_loader_->file_path() == image_file && 325 return (default_wallpaper_loader_.get() &&
324 wallpaper_loader_->resource_id() == image_resource_id) || 326 !default_wallpaper_loader_->IsCanceled() &&
Daniel Erat 2013/12/26 20:52:00 this is the fix
327 default_wallpaper_loader_->file_path() == image_file &&
328 default_wallpaper_loader_->resource_id() == image_resource_id) ||
325 (current_wallpaper_.get() && 329 (current_wallpaper_.get() &&
326 current_default_wallpaper_path_ == image_file && 330 current_default_wallpaper_path_ == image_file &&
327 current_default_wallpaper_resource_id_ == image_resource_id); 331 current_default_wallpaper_resource_id_ == image_resource_id);
328 } 332 }
329 333
330 bool DesktopBackgroundController::CustomWallpaperIsAlreadyLoaded( 334 bool DesktopBackgroundController::CustomWallpaperIsAlreadyLoaded(
331 const gfx::ImageSkia& image) const { 335 const gfx::ImageSkia& image) const {
332 return current_wallpaper_.get() && 336 return current_wallpaper_.get() &&
333 (WallpaperResizer::GetImageId(image) == 337 (WallpaperResizer::GetImageId(image) ==
334 current_wallpaper_->original_image_id()); 338 current_wallpaper_->original_image_id());
335 } 339 }
336 340
337 void DesktopBackgroundController::SetDesktopBackgroundImageMode() { 341 void DesktopBackgroundController::SetDesktopBackgroundImageMode() {
338 desktop_background_mode_ = BACKGROUND_IMAGE; 342 desktop_background_mode_ = BACKGROUND_IMAGE;
339 InstallDesktopControllerForAllWindows(); 343 InstallDesktopControllerForAllWindows();
340 } 344 }
341 345
342 void DesktopBackgroundController::OnDefaultWallpaperLoadCompleted( 346 void DesktopBackgroundController::OnDefaultWallpaperLoadCompleted(
343 scoped_refptr<WallpaperLoader> loader) { 347 scoped_refptr<WallpaperLoader> loader) {
344 current_wallpaper_.reset(loader->ReleaseWallpaperResizer()); 348 current_wallpaper_.reset(loader->ReleaseWallpaperResizer());
345 current_wallpaper_->StartResize(); 349 current_wallpaper_->StartResize();
346 current_default_wallpaper_path_ = loader->file_path(); 350 current_default_wallpaper_path_ = loader->file_path();
347 current_default_wallpaper_resource_id_ = loader->resource_id(); 351 current_default_wallpaper_resource_id_ = loader->resource_id();
348 FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_, 352 FOR_EACH_OBSERVER(DesktopBackgroundControllerObserver, observers_,
349 OnWallpaperDataChanged()); 353 OnWallpaperDataChanged());
350 354
351 SetDesktopBackgroundImageMode(); 355 SetDesktopBackgroundImageMode();
352 356
353 DCHECK(loader.get() == wallpaper_loader_.get()); 357 DCHECK(loader.get() == default_wallpaper_loader_.get());
354 wallpaper_loader_ = NULL; 358 default_wallpaper_loader_ = NULL;
355 } 359 }
356 360
357 void DesktopBackgroundController::InstallDesktopController( 361 void DesktopBackgroundController::InstallDesktopController(
358 aura::Window* root_window) { 362 aura::Window* root_window) {
359 internal::DesktopBackgroundWidgetController* component = NULL; 363 internal::DesktopBackgroundWidgetController* component = NULL;
360 int container_id = GetBackgroundContainerId(locked_); 364 int container_id = GetBackgroundContainerId(locked_);
361 365
362 switch (desktop_background_mode_) { 366 switch (desktop_background_mode_) {
363 case BACKGROUND_IMAGE: { 367 case BACKGROUND_IMAGE: {
364 views::Widget* widget = internal::CreateDesktopBackground(root_window, 368 views::Widget* widget = internal::CreateDesktopBackground(root_window,
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 iter->rotation() == gfx::Display::ROTATE_270) { 458 iter->rotation() == gfx::Display::ROTATE_270) {
455 size_in_pixel = gfx::Size(size_in_pixel.height(), size_in_pixel.width()); 459 size_in_pixel = gfx::Size(size_in_pixel.height(), size_in_pixel.width());
456 } 460 }
457 width = std::max(size_in_pixel.width(), width); 461 width = std::max(size_in_pixel.width(), width);
458 height = std::max(size_in_pixel.height(), height); 462 height = std::max(size_in_pixel.height(), height);
459 } 463 }
460 return gfx::Size(width, height); 464 return gfx::Size(width, height);
461 } 465 }
462 466
463 } // namespace ash 467 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698