1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/extensions/wallpaper_private_api.h"
9 #include "ash/ash_switches.h"
10 #include "ash/desktop_background/desktop_background_controller.h"
11 #include "ash/shell.h"
12 #include "ash/wm/mru_window_tracker.h"
13 #include "ash/wm/window_state.h"
14 #include "ash/wm/window_util.h"
15 #include "base/command_line.h"
16 #include "base/file_util.h"
17 #include "base/files/file_enumerator.h"
18 #include "base/memory/scoped_ptr.h"
19 #include "base/path_service.h"
20 #include "base/strings/string_number_conversions.h"
21 #include "base/strings/stringprintf.h"
22 #include "base/threading/worker_pool.h"
23 #include "chrome/browser/browser_process.h"
24 #include "chrome/browser/chromeos/login/user.h"
25 #include "chrome/browser/chromeos/login/user_image.h"
26 #include "chrome/browser/chromeos/login/user_manager.h"
27 #include "chrome/browser/chromeos/login/wallpaper_manager.h"
28 #include "chrome/browser/extensions/event_router.h"
29 #include "chrome/common/chrome_paths.h"
30 #include "content/public/browser/browser_thread.h"
31 #include "grit/app_locale_settings.h"
32 #include "grit/generated_resources.h"
33 #include "grit/platform_locale_settings.h"
34 #include "ui/base/l10n/l10n_util.h"
35 #include "ui/base/webui/web_ui_util.h"
38 using base::BinaryValue;
39 using content::BrowserThread;
40 namespace wallpaper_private = extensions::api::wallpaper_private;
41 namespace set_wallpaper_if_exists = wallpaper_private::SetWallpaperIfExists;
42 namespace set_wallpaper = wallpaper_private::SetWallpaper;
43 namespace set_custom_wallpaper = wallpaper_private::SetCustomWallpaper;
44 namespace set_custom_wallpaper_layout =
45 wallpaper_private::SetCustomWallpaperLayout;
46 namespace get_thumbnail = wallpaper_private::GetThumbnail;
47 namespace save_thumbnail = wallpaper_private::SaveThumbnail;
48 namespace get_offline_wallpaper_list =
49 wallpaper_private::GetOfflineWallpaperList;
53 #if defined(GOOGLE_CHROME_BUILD)
54 const char kWallpaperManifestBaseURL[] = "https://commondatastorage.googleapis."
55 "com/chromeos-wallpaper-public/manifest_";
58 bool IsOEMDefaultWallpaper() {
59 return CommandLine::ForCurrentProcess()->
60 HasSwitch(ash::switches::kAshOemWallpaperSmall);
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 base::FilePath data_dir;
67 CHECK(PathService::Get(key, &data_dir));
68 if (!base::DirectoryExists(data_dir) &&
69 !file_util::CreateDirectory(data_dir)) {
72 base::FilePath file_path = data_dir.Append(file_name);
74 return base::PathExists(file_path) ||
75 (file_util::WriteFile(file_path, data.c_str(),
79 // Gets |file_name| from directory with |key|. Return false if the directory can
80 // not be found or failed to read file to string |data|. Note if the |file_name|
81 // can not be found in the directory, return true with empty |data|. It is
82 // expected that we may try to access file which did not saved yet.
83 bool GetData(const base::FilePath& path, std::string* data) {
84 base::FilePath data_dir = path.DirName();
85 if (!base::DirectoryExists(data_dir) &&
86 !file_util::CreateDirectory(data_dir))
89 return !base::PathExists(path) ||
90 base::ReadFileToString(path, data);
93 class WindowStateManager;
96 WindowStateManager* g_window_state_manager = NULL;
98 // WindowStateManager remembers which windows have been minimized in order to
99 // restore them when the wallpaper viewer is hidden.
100 class WindowStateManager : public aura::WindowObserver {
103 // Minimizes all windows except the active window.
104 static void MinimizeInactiveWindows() {
105 if (g_window_state_manager)
106 delete g_window_state_manager;
107 g_window_state_manager = new WindowStateManager();
108 g_window_state_manager->BuildWindowListAndMinimizeInactive(
109 ash::wm::GetActiveWindow());
112 // Activates all minimized windows restoring them to their previous state.
113 // This should only be called after calling MinimizeInactiveWindows.
114 static void RestoreWindows() {
115 DCHECK(g_window_state_manager);
116 g_window_state_manager->RestoreMinimizedWindows();
117 delete g_window_state_manager;
118 g_window_state_manager = NULL;
122 WindowStateManager() {}
124 virtual ~WindowStateManager() {
125 for (std::vector<aura::Window*>::iterator iter = windows_.begin();
126 iter != windows_.end(); ++iter) {
127 (*iter)->RemoveObserver(this);
131 void BuildWindowListAndMinimizeInactive(aura::Window* active_window) {
132 windows_ = ash::MruWindowTracker::BuildWindowList(false);
133 // Remove active window.
134 std::vector<aura::Window*>::iterator last =
135 std::remove(windows_.begin(), windows_.end(), active_window);
136 // Removes unfocusable windows.
137 last = std::remove_if(
140 std::ptr_fun(ash::wm::IsWindowMinimized));
141 windows_.erase(last, windows_.end());
143 for (std::vector<aura::Window*>::iterator iter = windows_.begin();
144 iter != windows_.end(); ++iter) {
145 (*iter)->AddObserver(this);
146 ash::wm::GetWindowState(*iter)->Minimize();
150 void RestoreMinimizedWindows() {
151 for (std::vector<aura::Window*>::iterator iter = windows_.begin();
152 iter != windows_.end(); ++iter) {
153 ash::wm::ActivateWindow(*iter);
157 // aura::WindowObserver overrides.
158 virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {
159 window->RemoveObserver(this);
160 std::vector<aura::Window*>::iterator i = std::find(windows_.begin(),
161 windows_.end(), window);
162 DCHECK(i != windows_.end());
166 // List of minimized windows.
167 std::vector<aura::Window*> windows_;
172 bool WallpaperPrivateGetStringsFunction::RunImpl() {
173 DictionaryValue* dict = new DictionaryValue();
176 #define SET_STRING(id, idr) \
177 dict->SetString(id, l10n_util::GetStringUTF16(idr))
178 SET_STRING("webFontFamily", IDS_WEB_FONT_FAMILY);
179 SET_STRING("webFontSize", IDS_WEB_FONT_SIZE);
180 SET_STRING("allCategoryLabel", IDS_WALLPAPER_MANAGER_ALL_CATEGORY_LABEL);
181 SET_STRING("deleteCommandLabel", IDS_WALLPAPER_MANAGER_DELETE_COMMAND_LABEL);
182 SET_STRING("customCategoryLabel",
183 IDS_WALLPAPER_MANAGER_CUSTOM_CATEGORY_LABEL);
184 SET_STRING("selectCustomLabel",
185 IDS_WALLPAPER_MANAGER_SELECT_CUSTOM_LABEL);
186 SET_STRING("positionLabel", IDS_WALLPAPER_MANAGER_POSITION_LABEL);
187 SET_STRING("colorLabel", IDS_WALLPAPER_MANAGER_COLOR_LABEL);
188 SET_STRING("centerCroppedLayout",
189 IDS_OPTIONS_WALLPAPER_CENTER_CROPPED_LAYOUT);
190 SET_STRING("centerLayout", IDS_OPTIONS_WALLPAPER_CENTER_LAYOUT);
191 SET_STRING("stretchLayout", IDS_OPTIONS_WALLPAPER_STRETCH_LAYOUT);
192 SET_STRING("connectionFailed", IDS_WALLPAPER_MANAGER_ACCESS_FAIL);
193 SET_STRING("downloadFailed", IDS_WALLPAPER_MANAGER_DOWNLOAD_FAIL);
194 SET_STRING("downloadCanceled", IDS_WALLPAPER_MANAGER_DOWNLOAD_CANCEL);
195 SET_STRING("customWallpaperWarning",
196 IDS_WALLPAPER_MANAGER_SHOW_CUSTOM_WALLPAPER_ON_START_WARNING);
197 SET_STRING("accessFileFailure", IDS_WALLPAPER_MANAGER_ACCESS_FILE_FAILURE);
198 SET_STRING("invalidWallpaper", IDS_WALLPAPER_MANAGER_INVALID_WALLPAPER);
199 SET_STRING("surpriseMeLabel", IDS_WALLPAPER_MANAGER_SURPRISE_ME_LABEL);
200 SET_STRING("learnMore", IDS_LEARN_MORE);
203 webui::SetFontAndTextDirection(dict);
205 chromeos::WallpaperManager* wallpaper_manager =
206 chromeos::WallpaperManager::Get();
207 chromeos::WallpaperInfo info;
209 if (wallpaper_manager->GetLoggedInUserWallpaperInfo(&info))
210 dict->SetString("currentWallpaper", info.file);
212 #if defined(GOOGLE_CHROME_BUILD)
213 dict->SetString("manifestBaseURL", kWallpaperManifestBaseURL);
216 dict->SetBoolean("isOEMDefaultWallpaper", IsOEMDefaultWallpaper());
220 WallpaperPrivateSetWallpaperIfExistsFunction::
221 WallpaperPrivateSetWallpaperIfExistsFunction() {}
223 WallpaperPrivateSetWallpaperIfExistsFunction::
224 ~WallpaperPrivateSetWallpaperIfExistsFunction() {}
226 bool WallpaperPrivateSetWallpaperIfExistsFunction::RunImpl() {
227 params = set_wallpaper_if_exists::Params::Create(*args_);
228 EXTENSION_FUNCTION_VALIDATE(params);
230 std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
232 base::FilePath wallpaper_path;
233 base::FilePath fallback_path;
234 ash::WallpaperResolution resolution = ash::Shell::GetInstance()->
235 desktop_background_controller()->GetAppropriateResolution();
237 std::string file_name = GURL(params->url).ExtractFileName();
238 CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS,
240 fallback_path = wallpaper_path.Append(file_name);
241 if (params->layout != wallpaper_private::WALLPAPER_LAYOUT_STRETCH &&
242 resolution == ash::WALLPAPER_RESOLUTION_SMALL) {
243 file_name = base::FilePath(file_name).InsertBeforeExtension(
244 chromeos::kSmallWallpaperSuffix).value();
246 wallpaper_path = wallpaper_path.Append(file_name);
248 sequence_token_ = BrowserThread::GetBlockingPool()->
249 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
250 scoped_refptr<base::SequencedTaskRunner> task_runner =
251 BrowserThread::GetBlockingPool()->
252 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
253 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
255 task_runner->PostTask(FROM_HERE,
257 &WallpaperPrivateSetWallpaperIfExistsFunction::
258 ReadFileAndInitiateStartDecode,
259 this, wallpaper_path, fallback_path));
263 void WallpaperPrivateSetWallpaperIfExistsFunction::
264 ReadFileAndInitiateStartDecode(const base::FilePath& file_path,
265 const base::FilePath& fallback_path) {
266 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
269 base::FilePath path = file_path;
271 if (!base::PathExists(file_path))
272 path = fallback_path;
274 if (base::PathExists(path) &&
275 base::ReadFileToString(path, &data)) {
276 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
277 base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::StartDecode,
281 std::string error = base::StringPrintf(
282 "Failed to set wallpaper %s from file system.",
283 path.BaseName().value().c_str());
284 BrowserThread::PostTask(
285 BrowserThread::UI, FROM_HERE,
286 base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists,
290 void WallpaperPrivateSetWallpaperIfExistsFunction::OnWallpaperDecoded(
291 const gfx::ImageSkia& wallpaper) {
292 // Set unsafe_wallpaper_decoder_ to null since the decoding already finished.
293 unsafe_wallpaper_decoder_ = NULL;
295 chromeos::WallpaperManager* wallpaper_manager =
296 chromeos::WallpaperManager::Get();
297 ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
298 wallpaper_private::ToString(params->layout));
300 wallpaper_manager->SetWallpaperFromImageSkia(wallpaper, layout);
302 !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
303 chromeos::WallpaperInfo info = {
306 chromeos::User::ONLINE,
307 base::Time::Now().LocalMidnight()
309 std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
310 wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
311 SetResult(base::Value::CreateBooleanValue(true));
315 void WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists(
316 const std::string& error) {
317 SetResult(base::Value::CreateBooleanValue(false));
321 WallpaperPrivateSetWallpaperFunction::WallpaperPrivateSetWallpaperFunction() {
324 WallpaperPrivateSetWallpaperFunction::~WallpaperPrivateSetWallpaperFunction() {
327 bool WallpaperPrivateSetWallpaperFunction::RunImpl() {
328 params = set_wallpaper::Params::Create(*args_);
329 EXTENSION_FUNCTION_VALIDATE(params);
331 // Gets email address while at UI thread.
332 email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email();
334 StartDecode(params->wallpaper);
339 void WallpaperPrivateSetWallpaperFunction::OnWallpaperDecoded(
340 const gfx::ImageSkia& wallpaper) {
341 wallpaper_ = wallpaper;
342 // Set unsafe_wallpaper_decoder_ to null since the decoding already finished.
343 unsafe_wallpaper_decoder_ = NULL;
345 sequence_token_ = BrowserThread::GetBlockingPool()->
346 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
347 scoped_refptr<base::SequencedTaskRunner> task_runner =
348 BrowserThread::GetBlockingPool()->
349 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
350 base::SequencedWorkerPool::BLOCK_SHUTDOWN);
352 task_runner->PostTask(FROM_HERE,
353 base::Bind(&WallpaperPrivateSetWallpaperFunction::SaveToFile, this));
356 void WallpaperPrivateSetWallpaperFunction::SaveToFile() {
357 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
359 std::string file_name = GURL(params->url).ExtractFileName();
360 if (SaveData(chrome::DIR_CHROMEOS_WALLPAPERS, file_name, params->wallpaper)) {
361 wallpaper_.EnsureRepsForSupportedScales();
362 scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy());
363 // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if
364 // post to another thread.
365 BrowserThread::PostTask(
366 BrowserThread::UI, FROM_HERE,
367 base::Bind(&WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper,
368 this, base::Passed(&deep_copy)));
369 chromeos::UserImage wallpaper(wallpaper_);
371 base::FilePath wallpaper_dir;
372 CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir));
373 base::FilePath file_path = wallpaper_dir.Append(
374 file_name).InsertBeforeExtension(chromeos::kSmallWallpaperSuffix);
375 if (base::PathExists(file_path))
377 // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to
378 // maintain the aspect ratio after resize.
379 chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper(
382 ash::WALLPAPER_LAYOUT_CENTER_CROPPED,
383 ash::kSmallWallpaperMaxWidth,
384 ash::kSmallWallpaperMaxHeight);
386 std::string error = base::StringPrintf(
387 "Failed to create/write wallpaper to %s.", file_name.c_str());
388 BrowserThread::PostTask(
389 BrowserThread::UI, FROM_HERE,
390 base::Bind(&WallpaperPrivateSetWallpaperFunction::OnFailure,
395 void WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper(
396 scoped_ptr<gfx::ImageSkia> wallpaper) {
397 chromeos::WallpaperManager* wallpaper_manager =
398 chromeos::WallpaperManager::Get();
400 ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
401 wallpaper_private::ToString(params->layout));
403 wallpaper_manager->SetWallpaperFromImageSkia(*wallpaper.get(), layout);
405 !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
406 chromeos::WallpaperInfo info = {
409 chromeos::User::ONLINE,
410 base::Time::Now().LocalMidnight()
412 wallpaper_manager->SetUserWallpaperInfo(email_, info, is_persistent);
416 WallpaperPrivateResetWallpaperFunction::
417 WallpaperPrivateResetWallpaperFunction() {}
419 WallpaperPrivateResetWallpaperFunction::
420 ~WallpaperPrivateResetWallpaperFunction() {}
422 bool WallpaperPrivateResetWallpaperFunction::RunImpl() {
423 chromeos::WallpaperManager* wallpaper_manager =
424 chromeos::WallpaperManager::Get();
425 chromeos::UserManager* user_manager = chromeos::UserManager::Get();
427 std::string email = user_manager->GetLoggedInUser()->email();
428 wallpaper_manager->RemoveUserWallpaperInfo(email);
430 chromeos::WallpaperInfo info = {
432 ash::WALLPAPER_LAYOUT_CENTER,
433 chromeos::User::DEFAULT,
434 base::Time::Now().LocalMidnight()
437 !user_manager->IsCurrentUserNonCryptohomeDataEphemeral();
438 wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
439 wallpaper_manager->SetDefaultWallpaper();
443 WallpaperPrivateSetCustomWallpaperFunction::
444 WallpaperPrivateSetCustomWallpaperFunction() {}
446 WallpaperPrivateSetCustomWallpaperFunction::
447 ~WallpaperPrivateSetCustomWallpaperFunction() {}
449 bool WallpaperPrivateSetCustomWallpaperFunction::RunImpl() {
450 params = set_custom_wallpaper::Params::Create(*args_);
451 EXTENSION_FUNCTION_VALIDATE(params);
453 // Gets email address and username hash while at UI thread.
454 email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email();
456 chromeos::UserManager::Get()->GetLoggedInUser()->username_hash();
458 StartDecode(params->wallpaper);
463 void WallpaperPrivateSetCustomWallpaperFunction::OnWallpaperDecoded(
464 const gfx::ImageSkia& wallpaper) {
465 chromeos::WallpaperManager* wallpaper_manager =
466 chromeos::WallpaperManager::Get();
467 chromeos::UserImage::RawImage raw_image(params->wallpaper.begin(),
468 params->wallpaper.end());
469 chromeos::UserImage image(wallpaper, raw_image);
470 base::FilePath thumbnail_path = wallpaper_manager->GetCustomWallpaperPath(
471 chromeos::kThumbnailWallpaperSubDir, user_id_hash_, params->file_name);
473 sequence_token_ = BrowserThread::GetBlockingPool()->
474 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
475 scoped_refptr<base::SequencedTaskRunner> task_runner =
476 BrowserThread::GetBlockingPool()->
477 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
478 base::SequencedWorkerPool::BLOCK_SHUTDOWN);
480 ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum(
481 wallpaper_private::ToString(params->layout));
483 wallpaper_manager->SetCustomWallpaper(email_,
487 chromeos::User::CUSTOMIZED,
489 unsafe_wallpaper_decoder_ = NULL;
491 if (params->generate_thumbnail) {
492 wallpaper.EnsureRepsForSupportedScales();
493 scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper.DeepCopy());
494 // Generates thumbnail before call api function callback. We can then
495 // request thumbnail in the javascript callback.
496 task_runner->PostTask(FROM_HERE,
498 &WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail,
499 this, thumbnail_path, base::Passed(&deep_copy)));
505 void WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail(
506 const base::FilePath& thumbnail_path, scoped_ptr<gfx::ImageSkia> image) {
507 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
509 chromeos::UserImage wallpaper(*image.get());
510 if (!base::PathExists(thumbnail_path.DirName()))
511 file_util::CreateDirectory(thumbnail_path.DirName());
513 scoped_refptr<base::RefCountedBytes> data;
514 chromeos::WallpaperManager::Get()->ResizeWallpaper(
516 ash::WALLPAPER_LAYOUT_STRETCH,
517 ash::kWallpaperThumbnailWidth,
518 ash::kWallpaperThumbnailHeight,
520 BrowserThread::PostTask(
521 BrowserThread::UI, FROM_HERE,
523 &WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated,
527 void WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated(
528 base::RefCountedBytes* data) {
529 BinaryValue* result = BinaryValue::CreateWithCopiedBuffer(
530 reinterpret_cast<const char*>(data->front()), data->size());
535 WallpaperPrivateSetCustomWallpaperLayoutFunction::
536 WallpaperPrivateSetCustomWallpaperLayoutFunction() {}
538 WallpaperPrivateSetCustomWallpaperLayoutFunction::
539 ~WallpaperPrivateSetCustomWallpaperLayoutFunction() {}
541 bool WallpaperPrivateSetCustomWallpaperLayoutFunction::RunImpl() {
542 scoped_ptr<set_custom_wallpaper_layout::Params> params(
543 set_custom_wallpaper_layout::Params::Create(*args_));
544 EXTENSION_FUNCTION_VALIDATE(params);
546 chromeos::WallpaperManager* wallpaper_manager =
547 chromeos::WallpaperManager::Get();
548 chromeos::WallpaperInfo info;
549 wallpaper_manager->GetLoggedInUserWallpaperInfo(&info);
550 if (info.type != chromeos::User::CUSTOMIZED) {
551 SetError("Only custom wallpaper can change layout.");
555 info.layout = wallpaper_api_util::GetLayoutEnum(
556 wallpaper_private::ToString(params->layout));
558 std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
560 !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral();
561 wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent);
562 wallpaper_manager->UpdateWallpaper();
565 // Gets email address while at UI thread.
569 WallpaperPrivateMinimizeInactiveWindowsFunction::
570 WallpaperPrivateMinimizeInactiveWindowsFunction() {
573 WallpaperPrivateMinimizeInactiveWindowsFunction::
574 ~WallpaperPrivateMinimizeInactiveWindowsFunction() {
577 bool WallpaperPrivateMinimizeInactiveWindowsFunction::RunImpl() {
578 WindowStateManager::MinimizeInactiveWindows();
582 WallpaperPrivateRestoreMinimizedWindowsFunction::
583 WallpaperPrivateRestoreMinimizedWindowsFunction() {
586 WallpaperPrivateRestoreMinimizedWindowsFunction::
587 ~WallpaperPrivateRestoreMinimizedWindowsFunction() {
590 bool WallpaperPrivateRestoreMinimizedWindowsFunction::RunImpl() {
591 WindowStateManager::RestoreWindows();
595 WallpaperPrivateGetThumbnailFunction::WallpaperPrivateGetThumbnailFunction() {
598 WallpaperPrivateGetThumbnailFunction::~WallpaperPrivateGetThumbnailFunction() {
601 bool WallpaperPrivateGetThumbnailFunction::RunImpl() {
602 scoped_ptr<get_thumbnail::Params> params(
603 get_thumbnail::Params::Create(*args_));
604 EXTENSION_FUNCTION_VALIDATE(params);
606 base::FilePath thumbnail_path;
607 std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email();
608 if (params->source == get_thumbnail::Params::SOURCE_ONLINE) {
609 std::string file_name = GURL(params->url_or_file).ExtractFileName();
610 CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS,
612 thumbnail_path = thumbnail_path.Append(file_name);
614 if (!IsOEMDefaultWallpaper()) {
615 SetError("No OEM wallpaper.");
620 // TODO(bshe): Small resolution wallpaper is used here as wallpaper
621 // thumbnail. We should either resize it or include a wallpaper thumbnail in
622 // addition to large and small wallpaper resolutions.
623 thumbnail_path = CommandLine::ForCurrentProcess()->GetSwitchValuePath(
624 ash::switches::kAshOemWallpaperSmall);
627 sequence_token_ = BrowserThread::GetBlockingPool()->
628 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
629 scoped_refptr<base::SequencedTaskRunner> task_runner =
630 BrowserThread::GetBlockingPool()->
631 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
632 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
634 task_runner->PostTask(FROM_HERE,
635 base::Bind(&WallpaperPrivateGetThumbnailFunction::Get, this,
640 void WallpaperPrivateGetThumbnailFunction::Failure(
641 const std::string& file_name) {
642 SetError(base::StringPrintf("Failed to access wallpaper thumbnails for %s.",
647 void WallpaperPrivateGetThumbnailFunction::FileNotLoaded() {
651 void WallpaperPrivateGetThumbnailFunction::FileLoaded(
652 const std::string& data) {
653 BinaryValue* thumbnail = BinaryValue::CreateWithCopiedBuffer(data.c_str(),
655 SetResult(thumbnail);
659 void WallpaperPrivateGetThumbnailFunction::Get(const base::FilePath& path) {
660 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
663 if (GetData(path, &data)) {
665 BrowserThread::PostTask(
666 BrowserThread::UI, FROM_HERE,
667 base::Bind(&WallpaperPrivateGetThumbnailFunction::FileNotLoaded, this));
669 BrowserThread::PostTask(
670 BrowserThread::UI, FROM_HERE,
671 base::Bind(&WallpaperPrivateGetThumbnailFunction::FileLoaded, this,
675 BrowserThread::PostTask(
676 BrowserThread::UI, FROM_HERE,
677 base::Bind(&WallpaperPrivateGetThumbnailFunction::Failure, this,
678 path.BaseName().value()));
682 WallpaperPrivateSaveThumbnailFunction::WallpaperPrivateSaveThumbnailFunction() {
685 WallpaperPrivateSaveThumbnailFunction::
686 ~WallpaperPrivateSaveThumbnailFunction() {}
688 bool WallpaperPrivateSaveThumbnailFunction::RunImpl() {
689 scoped_ptr<save_thumbnail::Params> params(
690 save_thumbnail::Params::Create(*args_));
691 EXTENSION_FUNCTION_VALIDATE(params);
693 sequence_token_ = BrowserThread::GetBlockingPool()->
694 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
695 scoped_refptr<base::SequencedTaskRunner> task_runner =
696 BrowserThread::GetBlockingPool()->
697 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
698 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
700 task_runner->PostTask(FROM_HERE,
701 base::Bind(&WallpaperPrivateSaveThumbnailFunction::Save,
702 this, params->data, GURL(params->url).ExtractFileName()));
706 void WallpaperPrivateSaveThumbnailFunction::Failure(
707 const std::string& file_name) {
708 SetError(base::StringPrintf("Failed to create/write thumbnail of %s.",
713 void WallpaperPrivateSaveThumbnailFunction::Success() {
717 void WallpaperPrivateSaveThumbnailFunction::Save(const std::string& data,
718 const std::string& file_name) {
719 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
721 if (SaveData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, data)) {
722 BrowserThread::PostTask(
723 BrowserThread::UI, FROM_HERE,
724 base::Bind(&WallpaperPrivateSaveThumbnailFunction::Success, this));
726 BrowserThread::PostTask(
727 BrowserThread::UI, FROM_HERE,
728 base::Bind(&WallpaperPrivateSaveThumbnailFunction::Failure,
733 WallpaperPrivateGetOfflineWallpaperListFunction::
734 WallpaperPrivateGetOfflineWallpaperListFunction() {
737 WallpaperPrivateGetOfflineWallpaperListFunction::
738 ~WallpaperPrivateGetOfflineWallpaperListFunction() {
741 bool WallpaperPrivateGetOfflineWallpaperListFunction::RunImpl() {
742 sequence_token_ = BrowserThread::GetBlockingPool()->
743 GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName);
744 scoped_refptr<base::SequencedTaskRunner> task_runner =
745 BrowserThread::GetBlockingPool()->
746 GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_,
747 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN);
749 task_runner->PostTask(FROM_HERE,
750 base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::GetList,
755 void WallpaperPrivateGetOfflineWallpaperListFunction::GetList() {
756 DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread(
758 std::vector<std::string> file_list;
759 base::FilePath wallpaper_dir;
760 CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir));
761 if (base::DirectoryExists(wallpaper_dir)) {
762 base::FileEnumerator files(wallpaper_dir, false,
763 base::FileEnumerator::FILES);
764 for (base::FilePath current = files.Next(); !current.empty();
765 current = files.Next()) {
766 std::string file_name = current.BaseName().RemoveExtension().value();
767 // Do not add file name of small resolution wallpaper to the list.
768 if (!EndsWith(file_name, chromeos::kSmallWallpaperSuffix, true))
769 file_list.push_back(current.BaseName().value());
772 BrowserThread::PostTask(
773 BrowserThread::UI, FROM_HERE,
774 base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete,
778 void WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete(
779 const std::vector<std::string>& file_list) {
780 ListValue* results = new ListValue();
781 results->AppendStrings(file_list);