OLD | NEW |
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/chromeos/extensions/wallpaper_private_api.h" | 5 #include "chrome/browser/chromeos/extensions/wallpaper_private_api.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
10 #include "ash/wm/window_cycle_controller.h" | 10 #include "ash/wm/window_cycle_controller.h" |
11 #include "ash/wm/window_util.h" | 11 #include "ash/wm/window_util.h" |
12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
13 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/path_service.h" | 15 #include "base/path_service.h" |
16 #include "base/stringprintf.h" | |
17 #include "base/synchronization/cancellation_flag.h" | 16 #include "base/synchronization/cancellation_flag.h" |
18 #include "base/threading/sequenced_worker_pool.h" | 17 #include "base/threading/sequenced_worker_pool.h" |
19 #include "base/threading/worker_pool.h" | 18 #include "base/threading/worker_pool.h" |
20 #include "chrome/browser/browser_process.h" | 19 #include "chrome/browser/browser_process.h" |
21 #include "chrome/browser/chromeos/login/user.h" | 20 #include "chrome/browser/chromeos/login/user.h" |
22 #include "chrome/browser/chromeos/login/user_image.h" | 21 #include "chrome/browser/chromeos/login/user_image.h" |
23 #include "chrome/browser/chromeos/login/user_manager.h" | 22 #include "chrome/browser/chromeos/login/user_manager.h" |
24 #include "chrome/browser/chromeos/login/wallpaper_manager.h" | 23 #include "chrome/browser/chromeos/login/wallpaper_manager.h" |
25 #include "chrome/browser/extensions/event_router.h" | 24 #include "chrome/browser/extensions/event_router.h" |
26 #include "chrome/browser/image_decoder.h" | 25 #include "chrome/browser/image_decoder.h" |
(...skipping 26 matching lines...) Expand all Loading... |
53 | 52 |
54 ash::WallpaperLayout GetLayoutEnum(const std::string& layout) { | 53 ash::WallpaperLayout GetLayoutEnum(const std::string& layout) { |
55 for (int i = 0; i < kWallpaperLayoutCount; i++) { | 54 for (int i = 0; i < kWallpaperLayoutCount; i++) { |
56 if (layout.compare(kWallpaperLayoutArrays[i]) == 0) | 55 if (layout.compare(kWallpaperLayoutArrays[i]) == 0) |
57 return static_cast<ash::WallpaperLayout>(i); | 56 return static_cast<ash::WallpaperLayout>(i); |
58 } | 57 } |
59 // Default to use CENTER layout. | 58 // Default to use CENTER layout. |
60 return ash::WALLPAPER_LAYOUT_CENTER; | 59 return ash::WALLPAPER_LAYOUT_CENTER; |
61 } | 60 } |
62 | 61 |
63 // Saves |data| as |file_name| to directory with |key|. Return false if the | |
64 // directory can not be found/created or failed to write file. | |
65 bool SaveData(int key, const std::string& file_name, const std::string& data) { | |
66 FilePath data_dir; | |
67 CHECK(PathService::Get(key, &data_dir)); | |
68 if (!file_util::DirectoryExists(data_dir) && | |
69 !file_util::CreateDirectory(data_dir)) { | |
70 return false; | |
71 } | |
72 FilePath file_path = data_dir.Append(file_name); | |
73 | |
74 return file_util::PathExists(file_path) || | |
75 (file_util::WriteFile(file_path, data.c_str(), | |
76 data.size()) != -1); | |
77 } | |
78 | |
79 // Gets |file_name| from directory with |key|. Return false if the directory can | |
80 // not be found or failed to read file to |data|. If the |file_name| can not be | |
81 // found in the directory, return true with empty |data|. It is expected that we | |
82 // may try to access file which did not saved yet. | |
83 bool GetData(int key, const std::string& file_name, std::string* data) { | |
84 FilePath data_dir; | |
85 CHECK(PathService::Get(key, &data_dir)); | |
86 if (!file_util::DirectoryExists(data_dir) && | |
87 !file_util::CreateDirectory(data_dir)) | |
88 return false; | |
89 | |
90 FilePath file_path = data_dir.Append(file_name); | |
91 | |
92 return !file_util::PathExists(file_path) || | |
93 (file_util::ReadFileToString(file_path, data) != -1); | |
94 } | |
95 | |
96 class WindowStateManager; | 62 class WindowStateManager; |
97 | 63 |
98 // static | 64 // static |
99 WindowStateManager* g_window_state_manager = NULL; | 65 WindowStateManager* g_window_state_manager = NULL; |
100 | 66 |
101 // WindowStateManager remembers which windows have been minimized in order to | 67 // WindowStateManager remembers which windows have been minimized in order to |
102 // restore them when the wallpaper viewer is hidden. | 68 // restore them when the wallpaper viewer is hidden. |
103 class WindowStateManager : public aura::WindowObserver { | 69 class WindowStateManager : public aura::WindowObserver { |
104 public: | 70 public: |
105 | 71 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 } | 249 } |
284 | 250 |
285 WallpaperSetWallpaperFunction::WallpaperSetWallpaperFunction() { | 251 WallpaperSetWallpaperFunction::WallpaperSetWallpaperFunction() { |
286 } | 252 } |
287 | 253 |
288 WallpaperSetWallpaperFunction::~WallpaperSetWallpaperFunction() { | 254 WallpaperSetWallpaperFunction::~WallpaperSetWallpaperFunction() { |
289 } | 255 } |
290 | 256 |
291 bool WallpaperSetWallpaperFunction::RunImpl() { | 257 bool WallpaperSetWallpaperFunction::RunImpl() { |
292 BinaryValue* input = NULL; | 258 BinaryValue* input = NULL; |
293 EXTENSION_FUNCTION_VALIDATE(args_->GetBinary(0, &input)); | 259 if (args_ == NULL || !args_->GetBinary(0, &input)) { |
294 | 260 return false; |
| 261 } |
295 std::string layout_string; | 262 std::string layout_string; |
296 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &layout_string)); | 263 if (!args_->GetString(1, &layout_string) || layout_string.empty()) { |
297 EXTENSION_FUNCTION_VALIDATE(!layout_string.empty()); | 264 return false; |
| 265 } |
298 layout_ = GetLayoutEnum(layout_string); | 266 layout_ = GetLayoutEnum(layout_string); |
299 | 267 if (!args_->GetString(2, &url_) || url_.empty()) |
300 EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &url_)); | 268 return false; |
301 EXTENSION_FUNCTION_VALIDATE(!url_.empty()); | |
302 | 269 |
303 // Gets email address while at UI thread. | 270 // Gets email address while at UI thread. |
304 email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email(); | 271 email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email(); |
305 | 272 |
306 image_data_.assign(input->GetBuffer(), input->GetSize()); | 273 image_data_.assign(input->GetBuffer(), input->GetSize()); |
307 if (wallpaper_decoder_) | 274 if (wallpaper_decoder_) |
308 wallpaper_decoder_->Cancel(); | 275 wallpaper_decoder_->Cancel(); |
309 wallpaper_decoder_ = new WallpaperDecoder(this); | 276 wallpaper_decoder_ = new WallpaperDecoder(this); |
310 wallpaper_decoder_->Start(image_data_); | 277 wallpaper_decoder_->Start(image_data_); |
311 | 278 |
312 return true; | 279 return true; |
313 } | 280 } |
314 | 281 |
315 void WallpaperSetWallpaperFunction::OnWallpaperDecoded( | 282 void WallpaperSetWallpaperFunction::OnWallpaperDecoded( |
316 const gfx::ImageSkia& wallpaper) { | 283 const gfx::ImageSkia& wallpaper) { |
317 wallpaper_ = wallpaper; | 284 wallpaper_ = wallpaper; |
318 // Set wallpaper_decoder_ to null since the decoding already finished. | 285 // Set wallpaper_decoder_ to null since the decoding already finished. |
319 wallpaper_decoder_ = NULL; | 286 wallpaper_decoder_ = NULL; |
320 | 287 |
321 sequence_token_ = BrowserThread::GetBlockingPool()-> | 288 sequence_token_ = BrowserThread::GetBlockingPool()-> |
322 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); | 289 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); |
323 scoped_refptr<base::SequencedTaskRunner> task_runner = | 290 scoped_refptr<base::SequencedTaskRunner> task_runner = |
324 BrowserThread::GetBlockingPool()-> | 291 BrowserThread::GetBlockingPool()-> |
325 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, | 292 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, |
326 base::SequencedWorkerPool::BLOCK_SHUTDOWN); | 293 base::SequencedWorkerPool::BLOCK_SHUTDOWN); |
327 | 294 |
328 task_runner->PostTask(FROM_HERE, | 295 task_runner->PostTask(FROM_HERE, |
329 base::Bind(&WallpaperSetWallpaperFunction::SaveToFile, this)); | 296 base::Bind(&WallpaperSetWallpaperFunction::SaveToFile, |
| 297 this)); |
330 } | 298 } |
331 | 299 |
332 void WallpaperSetWallpaperFunction::SaveToFile() { | 300 void WallpaperSetWallpaperFunction::SaveToFile() { |
333 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( | 301 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( |
334 sequence_token_)); | 302 sequence_token_)); |
| 303 FilePath wallpaper_dir; |
| 304 CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir)); |
| 305 if (!file_util::DirectoryExists(wallpaper_dir) && |
| 306 !file_util::CreateDirectory(wallpaper_dir)) { |
| 307 BrowserThread::PostTask( |
| 308 BrowserThread::UI, FROM_HERE, |
| 309 base::Bind(&WallpaperSetWallpaperFunction::OnFailureOrCancel, |
| 310 this, "")); |
| 311 LOG(ERROR) << "Failed to create wallpaper directory."; |
| 312 return; |
| 313 } |
335 std::string file_name = GURL(url_).ExtractFileName(); | 314 std::string file_name = GURL(url_).ExtractFileName(); |
336 if (SaveData(chrome::DIR_CHROMEOS_WALLPAPERS, file_name, image_data_)) { | 315 FilePath file_path = wallpaper_dir.Append(file_name); |
| 316 if (file_util::PathExists(file_path) || |
| 317 file_util::WriteFile(file_path, image_data_.c_str(), |
| 318 image_data_.size()) != -1 ) { |
337 wallpaper_.EnsureRepsForSupportedScaleFactors(); | 319 wallpaper_.EnsureRepsForSupportedScaleFactors(); |
338 scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy()); | 320 scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy()); |
339 // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if | 321 // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if |
340 // post to another thread. | 322 // post to another thread. |
341 BrowserThread::PostTask( | 323 BrowserThread::PostTask( |
342 BrowserThread::UI, FROM_HERE, | 324 BrowserThread::UI, FROM_HERE, |
343 base::Bind(&WallpaperSetWallpaperFunction::SetDecodedWallpaper, | 325 base::Bind(&WallpaperSetWallpaperFunction::SetDecodedWallpaper, |
344 this, base::Passed(&deep_copy))); | 326 this, base::Passed(&deep_copy))); |
345 chromeos::UserImage wallpaper(wallpaper_); | 327 chromeos::UserImage wallpaper(wallpaper_); |
346 | 328 |
347 FilePath wallpaper_dir; | |
348 CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir)); | |
349 FilePath file_path = wallpaper_dir.Append(file_name).InsertBeforeExtension( | |
350 chromeos::kSmallWallpaperSuffix); | |
351 if (file_util::PathExists(file_path)) | |
352 return; | |
353 // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to | 329 // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to |
354 // maintain the aspect ratio after resize. | 330 // maintain the aspect ratio after resize. |
355 chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper( | 331 chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper( |
356 wallpaper, | 332 wallpaper, |
357 file_path, | 333 file_path.InsertBeforeExtension(chromeos::kSmallWallpaperSuffix), |
358 ash::WALLPAPER_LAYOUT_CENTER_CROPPED, | 334 ash::WALLPAPER_LAYOUT_CENTER_CROPPED, |
359 ash::kSmallWallpaperMaxWidth, | 335 ash::kSmallWallpaperMaxWidth, |
360 ash::kSmallWallpaperMaxHeight); | 336 ash::kSmallWallpaperMaxHeight); |
361 } else { | 337 } else { |
362 std::string error = base::StringPrintf( | |
363 "Failed to create/write wallpaper to %s.", file_name.c_str()); | |
364 BrowserThread::PostTask( | 338 BrowserThread::PostTask( |
365 BrowserThread::UI, FROM_HERE, | 339 BrowserThread::UI, FROM_HERE, |
366 base::Bind(&WallpaperSetWallpaperFunction::OnFailureOrCancel, | 340 base::Bind(&WallpaperSetWallpaperFunction::OnFailureOrCancel, |
367 this, error)); | 341 this, "")); |
| 342 LOG(ERROR) << "Failed to save downloaded wallpaper."; |
368 } | 343 } |
369 } | 344 } |
370 | 345 |
371 void WallpaperSetWallpaperFunction::SetDecodedWallpaper( | 346 void WallpaperSetWallpaperFunction::SetDecodedWallpaper( |
372 scoped_ptr<gfx::ImageSkia> wallpaper) { | 347 scoped_ptr<gfx::ImageSkia> wallpaper) { |
373 chromeos::WallpaperManager* wallpaper_manager = | 348 chromeos::WallpaperManager* wallpaper_manager = |
374 chromeos::WallpaperManager::Get(); | 349 chromeos::WallpaperManager::Get(); |
375 wallpaper_manager->SetWallpaperFromImageSkia(*wallpaper.get(), layout_); | 350 wallpaper_manager->SetWallpaperFromImageSkia(*wallpaper.get(), layout_); |
376 bool is_persistent = | 351 bool is_persistent = |
377 !chromeos::UserManager::Get()->IsCurrentUserEphemeral(); | 352 !chromeos::UserManager::Get()->IsCurrentUserEphemeral(); |
378 chromeos::WallpaperInfo info = { | 353 chromeos::WallpaperInfo info = { |
379 url_, | 354 url_, |
380 layout_, | 355 layout_, |
381 chromeos::User::ONLINE, | 356 chromeos::User::ONLINE, |
382 base::Time::Now().LocalMidnight() | 357 base::Time::Now().LocalMidnight() |
383 }; | 358 }; |
384 wallpaper_manager->SetUserWallpaperInfo(email_, info, is_persistent); | 359 wallpaper_manager->SetUserWallpaperInfo(email_, info, is_persistent); |
385 SendResponse(true); | 360 SendResponse(true); |
386 } | 361 } |
387 | 362 |
388 WallpaperSetCustomWallpaperFunction::WallpaperSetCustomWallpaperFunction() { | 363 WallpaperSetCustomWallpaperFunction::WallpaperSetCustomWallpaperFunction() { |
389 } | 364 } |
390 | 365 |
391 WallpaperSetCustomWallpaperFunction::~WallpaperSetCustomWallpaperFunction() { | 366 WallpaperSetCustomWallpaperFunction::~WallpaperSetCustomWallpaperFunction() { |
392 } | 367 } |
393 | 368 |
394 bool WallpaperSetCustomWallpaperFunction::RunImpl() { | 369 bool WallpaperSetCustomWallpaperFunction::RunImpl() { |
395 BinaryValue* input = NULL; | 370 BinaryValue* input = NULL; |
396 EXTENSION_FUNCTION_VALIDATE(args_->GetBinary(0, &input)); | 371 if (args_ == NULL || !args_->GetBinary(0, &input)) { |
397 | 372 return false; |
| 373 } |
398 std::string layout_string; | 374 std::string layout_string; |
399 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &layout_string)); | 375 if (!args_->GetString(1, &layout_string) || layout_string.empty()) { |
400 EXTENSION_FUNCTION_VALIDATE(!layout_string.empty()); | 376 return false; |
| 377 } |
401 layout_ = GetLayoutEnum(layout_string); | 378 layout_ = GetLayoutEnum(layout_string); |
402 | 379 |
403 // Gets email address while at UI thread. | 380 // Gets email address while at UI thread. |
404 email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email(); | 381 email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email(); |
405 | 382 |
406 image_data_.assign(input->GetBuffer(), input->GetSize()); | 383 image_data_.assign(input->GetBuffer(), input->GetSize()); |
407 if (wallpaper_decoder_) | 384 if (wallpaper_decoder_) |
408 wallpaper_decoder_->Cancel(); | 385 wallpaper_decoder_->Cancel(); |
409 wallpaper_decoder_ = new WallpaperDecoder(this); | 386 wallpaper_decoder_ = new WallpaperDecoder(this); |
410 wallpaper_decoder_->Start(image_data_); | 387 wallpaper_decoder_->Start(image_data_); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 } | 420 } |
444 | 421 |
445 WallpaperRestoreMinimizedWindowsFunction:: | 422 WallpaperRestoreMinimizedWindowsFunction:: |
446 ~WallpaperRestoreMinimizedWindowsFunction() { | 423 ~WallpaperRestoreMinimizedWindowsFunction() { |
447 } | 424 } |
448 | 425 |
449 bool WallpaperRestoreMinimizedWindowsFunction::RunImpl() { | 426 bool WallpaperRestoreMinimizedWindowsFunction::RunImpl() { |
450 WindowStateManager::RestoreWindows(); | 427 WindowStateManager::RestoreWindows(); |
451 return true; | 428 return true; |
452 } | 429 } |
453 | |
454 WallpaperGetThumbnailFunction::WallpaperGetThumbnailFunction() { | |
455 } | |
456 | |
457 WallpaperGetThumbnailFunction::~WallpaperGetThumbnailFunction() { | |
458 } | |
459 | |
460 bool WallpaperGetThumbnailFunction::RunImpl() { | |
461 std::string url; | |
462 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url)); | |
463 EXTENSION_FUNCTION_VALIDATE(!url.empty()); | |
464 std::string file_name = GURL(url).ExtractFileName(); | |
465 sequence_token_ = BrowserThread::GetBlockingPool()-> | |
466 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); | |
467 scoped_refptr<base::SequencedTaskRunner> task_runner = | |
468 BrowserThread::GetBlockingPool()-> | |
469 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, | |
470 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | |
471 | |
472 task_runner->PostTask(FROM_HERE, | |
473 base::Bind(&WallpaperGetThumbnailFunction::Get, this, file_name)); | |
474 return true; | |
475 } | |
476 | |
477 void WallpaperGetThumbnailFunction::Failure(const std::string& file_name) { | |
478 SetError(base::StringPrintf("Failed to access wallpaper thumbnails for %s.", | |
479 file_name.c_str())); | |
480 SendResponse(false); | |
481 } | |
482 | |
483 void WallpaperGetThumbnailFunction::FileNotLoaded() { | |
484 SendResponse(true); | |
485 } | |
486 | |
487 void WallpaperGetThumbnailFunction::FileLoaded(const std::string& data) { | |
488 BinaryValue* thumbnail = BinaryValue::CreateWithCopiedBuffer(data.c_str(), | |
489 data.size()); | |
490 SetResult(thumbnail); | |
491 SendResponse(true); | |
492 } | |
493 | |
494 void WallpaperGetThumbnailFunction::Get(const std::string& file_name) { | |
495 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( | |
496 sequence_token_)); | |
497 std::string data; | |
498 if (GetData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, &data)) { | |
499 if (data.empty()) { | |
500 BrowserThread::PostTask( | |
501 BrowserThread::UI, FROM_HERE, | |
502 base::Bind(&WallpaperGetThumbnailFunction::FileNotLoaded, this)); | |
503 } else { | |
504 BrowserThread::PostTask( | |
505 BrowserThread::UI, FROM_HERE, | |
506 base::Bind(&WallpaperGetThumbnailFunction::FileLoaded, this, data)); | |
507 } | |
508 } else { | |
509 BrowserThread::PostTask( | |
510 BrowserThread::UI, FROM_HERE, | |
511 base::Bind(&WallpaperGetThumbnailFunction::Failure, this, file_name)); | |
512 } | |
513 } | |
514 | |
515 WallpaperSaveThumbnailFunction::WallpaperSaveThumbnailFunction() { | |
516 } | |
517 | |
518 WallpaperSaveThumbnailFunction::~WallpaperSaveThumbnailFunction() { | |
519 } | |
520 | |
521 bool WallpaperSaveThumbnailFunction::RunImpl() { | |
522 std::string url; | |
523 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url)); | |
524 EXTENSION_FUNCTION_VALIDATE(!url.empty()); | |
525 | |
526 BinaryValue* input = NULL; | |
527 EXTENSION_FUNCTION_VALIDATE(args_->GetBinary(1, &input)); | |
528 | |
529 std::string file_name = GURL(url).ExtractFileName(); | |
530 std::string data(input->GetBuffer(), input->GetSize()); | |
531 | |
532 sequence_token_ = BrowserThread::GetBlockingPool()-> | |
533 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); | |
534 scoped_refptr<base::SequencedTaskRunner> task_runner = | |
535 BrowserThread::GetBlockingPool()-> | |
536 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, | |
537 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); | |
538 | |
539 task_runner->PostTask(FROM_HERE, | |
540 base::Bind(&WallpaperSaveThumbnailFunction::Save, | |
541 this, data, file_name)); | |
542 return true; | |
543 } | |
544 | |
545 void WallpaperSaveThumbnailFunction::Failure(const std::string& file_name) { | |
546 SetError(base::StringPrintf("Failed to create/write thumbnail of %s.", | |
547 file_name.c_str())); | |
548 SendResponse(false); | |
549 } | |
550 | |
551 void WallpaperSaveThumbnailFunction::Success() { | |
552 SendResponse(true); | |
553 } | |
554 | |
555 void WallpaperSaveThumbnailFunction::Save(const std::string& data, | |
556 const std::string& file_name) { | |
557 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( | |
558 sequence_token_)); | |
559 if (SaveData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, data)) { | |
560 BrowserThread::PostTask( | |
561 BrowserThread::UI, FROM_HERE, | |
562 base::Bind(&WallpaperSaveThumbnailFunction::Success, this)); | |
563 } else { | |
564 BrowserThread::PostTask( | |
565 BrowserThread::UI, FROM_HERE, | |
566 base::Bind(&WallpaperSaveThumbnailFunction::Failure, | |
567 this, file_name)); | |
568 } | |
569 } | |
OLD | NEW |