wallpaper_private_api.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/extensions/wallpaper_private_api.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/ash_switches.h" 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/wm/mru_window_tracker.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/command_line.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_image.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/wallpaper_manager.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/app_locale_settings.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/platform_locale_settings.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h" 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::BinaryValue; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace wallpaper_private = extensions::api::wallpaper_private; 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper_if_exists = wallpaper_private::SetWallpaperIfExists; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper = wallpaper_private::SetWallpaper; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper = wallpaper_private::SetCustomWallpaper; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper_layout = 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::SetCustomWallpaperLayout; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_thumbnail = wallpaper_private::GetThumbnail; 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace save_thumbnail = wallpaper_private::SaveThumbnail; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_offline_wallpaper_list = 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::GetOfflineWallpaperList; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kWallpaperManifestBaseURL[] = "https://commondatastorage.googleapis." 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "com/chromeos-wallpaper-public/manifest_"; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool IsOEMDefaultWallpaper() { 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return CommandLine::ForCurrentProcess()-> 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) HasSwitch(ash::switches::kAshOemWallpaperSmall); 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Saves |data| as |file_name| to directory with |key|. Return false if the 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// directory can not be found/created or failed to write file. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveData(int key, const std::string& file_name, const std::string& data) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_dir; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(key, &data_dir)); 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DirectoryExists(data_dir) && 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !file_util::CreateDirectory(data_dir)) { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path = data_dir.Append(file_name); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return base::PathExists(file_path) || 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (file_util::WriteFile(file_path, data.c_str(), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.size()) != -1); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Gets |file_name| from directory with |key|. Return false if the directory can 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not be found or failed to read file to string |data|. Note if the |file_name| 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can not be found in the directory, return true with empty |data|. It is 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected that we may try to access file which did not saved yet. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetData(const base::FilePath& path, std::string* data) { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_dir = path.DirName(); 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DirectoryExists(data_dir) && 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !file_util::CreateDirectory(data_dir)) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return !base::PathExists(path) || 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::ReadFileToString(path, data); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowStateManager; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowStateManager* g_window_state_manager = NULL; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowStateManager remembers which windows have been minimized in order to 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restore them when the wallpaper viewer is hidden. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowStateManager : public aura::WindowObserver { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimizes all windows except the active window. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MinimizeInactiveWindows() { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (g_window_state_manager) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete g_window_state_manager; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_window_state_manager = new WindowStateManager(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_window_state_manager->BuildWindowListAndMinimizeInactive( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::wm::GetActiveWindow()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activates all minimized windows restoring them to their previous state. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should only be called after calling MinimizeInactiveWindows. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RestoreWindows() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(g_window_state_manager); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_window_state_manager->RestoreMinimizedWindows(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete g_window_state_manager; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_window_state_manager = NULL; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowStateManager() {} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WindowStateManager() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<aura::Window*>::iterator iter = windows_.begin(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != windows_.end(); ++iter) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->RemoveObserver(this); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BuildWindowListAndMinimizeInactive(aura::Window* active_window) { 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) windows_ = ash::MruWindowTracker::BuildWindowList(false); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove active window. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*>::iterator last = 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::remove(windows_.begin(), windows_.end(), active_window); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes unfocusable windows. 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) last = std::remove_if( 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) windows_.begin(), 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) last, 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::ptr_fun(ash::wm::IsWindowMinimized)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.erase(last, windows_.end()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<aura::Window*>::iterator iter = windows_.begin(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != windows_.end(); ++iter) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->AddObserver(this); 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ash::wm::GetWindowState(*iter)->Minimize(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RestoreMinimizedWindows() { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<aura::Window*>::iterator iter = windows_.begin(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != windows_.end(); ++iter) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::wm::ActivateWindow(*iter); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aura::WindowObserver overrides. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->RemoveObserver(this); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*>::iterator i = std::find(windows_.begin(), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.end(), window); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(i != windows_.end()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) windows_.erase(i); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List of minimized windows. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> windows_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateGetStringsFunction::RunImpl() { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict = new DictionaryValue(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetResult(dict); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SET_STRING(id, idr) \ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(id, l10n_util::GetStringUTF16(idr)) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("webFontFamily", IDS_WEB_FONT_FAMILY); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("webFontSize", IDS_WEB_FONT_SIZE); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("allCategoryLabel", IDS_WALLPAPER_MANAGER_ALL_CATEGORY_LABEL); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("deleteCommandLabel", IDS_WALLPAPER_MANAGER_DELETE_COMMAND_LABEL); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("customCategoryLabel", 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_WALLPAPER_MANAGER_CUSTOM_CATEGORY_LABEL); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("selectCustomLabel", 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_WALLPAPER_MANAGER_SELECT_CUSTOM_LABEL); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("positionLabel", IDS_WALLPAPER_MANAGER_POSITION_LABEL); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("colorLabel", IDS_WALLPAPER_MANAGER_COLOR_LABEL); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("centerCroppedLayout", 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_WALLPAPER_CENTER_CROPPED_LAYOUT); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("centerLayout", IDS_OPTIONS_WALLPAPER_CENTER_LAYOUT); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("stretchLayout", IDS_OPTIONS_WALLPAPER_STRETCH_LAYOUT); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("connectionFailed", IDS_WALLPAPER_MANAGER_ACCESS_FAIL); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("downloadFailed", IDS_WALLPAPER_MANAGER_DOWNLOAD_FAIL); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("downloadCanceled", IDS_WALLPAPER_MANAGER_DOWNLOAD_CANCEL); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("customWallpaperWarning", 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_WALLPAPER_MANAGER_SHOW_CUSTOM_WALLPAPER_ON_START_WARNING); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("accessFileFailure", IDS_WALLPAPER_MANAGER_ACCESS_FILE_FAILURE); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("invalidWallpaper", IDS_WALLPAPER_MANAGER_INVALID_WALLPAPER); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("surpriseMeLabel", IDS_WALLPAPER_MANAGER_SURPRISE_ME_LABEL); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("learnMore", IDS_LEARN_MORE); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SET_STRING 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webui::SetFontAndTextDirection(dict); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager::Get(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperInfo info; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wallpaper_manager->GetLoggedInUserWallpaperInfo(&info)) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dict->SetString("currentWallpaper", info.file); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString("manifestBaseURL", kWallpaperManifestBaseURL); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetBoolean("isOEMDefaultWallpaper", IsOEMDefaultWallpaper()); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction:: 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateSetWallpaperIfExistsFunction() {} 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction:: 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSetWallpaperIfExistsFunction() {} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetWallpaperIfExistsFunction::RunImpl() { 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params = set_wallpaper_if_exists::Params::Create(*args_); 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email(); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath wallpaper_path; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath fallback_path; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::WallpaperResolution resolution = ash::Shell::GetInstance()-> 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) desktop_background_controller()->GetAppropriateResolution(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string file_name = GURL(params->url).ExtractFileName(); 2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, 2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &wallpaper_path)); 2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) fallback_path = wallpaper_path.Append(file_name); 2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (params->layout != wallpaper_private::WALLPAPER_LAYOUT_STRETCH && 2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) resolution == ash::WALLPAPER_RESOLUTION_SMALL) { 2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) file_name = base::FilePath(file_name).InsertBeforeExtension( 2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chromeos::kSmallWallpaperSuffix).value(); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) wallpaper_path = wallpaper_path.Append(file_name); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WallpaperPrivateSetWallpaperIfExistsFunction:: 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadFileAndInitiateStartDecode, 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, wallpaper_path, fallback_path)); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction:: 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadFileAndInitiateStartDecode(const base::FilePath& file_path, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& fallback_path) { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = file_path; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(file_path)) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path = fallback_path; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (base::PathExists(path) && 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::ReadFileToString(path, &data)) { 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::StartDecode, 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, data)); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error = base::StringPrintf( 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed to set wallpaper %s from file system.", 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.BaseName().value().c_str()); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists, 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, error)); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnWallpaperDecoded( 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::ImageSkia& wallpaper) { 292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Set unsafe_wallpaper_decoder_ to null since the decoding already finished. 293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) unsafe_wallpaper_decoder_ = NULL; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum( 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_manager->SetWallpaperFromImageSkia(wallpaper, layout); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_persistent = 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral(); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperInfo info = { 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params->url, 3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layout, 3068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chromeos::User::ONLINE, 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::Now().LocalMidnight() 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email(); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(base::Value::CreateBooleanValue(true)); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists( 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& error) { 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(base::Value::CreateBooleanValue(false)); 318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnFailure(error); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::WallpaperPrivateSetWallpaperFunction() { 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::~WallpaperPrivateSetWallpaperFunction() { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetWallpaperFunction::RunImpl() { 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params = set_wallpaper::Params::Create(*args_); 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets email address while at UI thread. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) StartDecode(params->wallpaper); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::OnWallpaperDecoded( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& wallpaper) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wallpaper_ = wallpaper; 342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Set unsafe_wallpaper_decoder_ to null since the decoding already finished. 343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) unsafe_wallpaper_decoder_ = NULL; 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::BLOCK_SHUTDOWN); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperFunction::SaveToFile, this)); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SaveToFile() { 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string file_name = GURL(params->url).ExtractFileName(); 3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (SaveData(chrome::DIR_CHROMEOS_WALLPAPERS, file_name, params->wallpaper)) { 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wallpaper_.EnsureRepsForSupportedScales(); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy()); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // post to another thread. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper, 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, base::Passed(&deep_copy))); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::UserImage wallpaper(wallpaper_); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath wallpaper_dir; 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir)); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path = wallpaper_dir.Append( 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_name).InsertBeforeExtension(chromeos::kSmallWallpaperSuffix); 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (base::PathExists(file_path)) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // maintain the aspect ratio after resize. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper( 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wallpaper, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_path, 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::WALLPAPER_LAYOUT_CENTER_CROPPED, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::kSmallWallpaperMaxWidth, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::kSmallWallpaperMaxHeight); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error = base::StringPrintf( 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed to create/write wallpaper to %s.", file_name.c_str()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperFunction::OnFailure, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, error)); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper( 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<gfx::ImageSkia> wallpaper) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager::Get(); 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum( 4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_manager->SetWallpaperFromImageSkia(*wallpaper.get(), layout); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_persistent = 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperInfo info = { 4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params->url, 4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layout, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::User::ONLINE, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now().LocalMidnight() 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(email_, info, is_persistent); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(true); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction:: 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateResetWallpaperFunction() {} 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction:: 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateResetWallpaperFunction() {} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateResetWallpaperFunction::RunImpl() { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::UserManager* user_manager = chromeos::UserManager::Get(); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string email = user_manager->GetLoggedInUser()->email(); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->RemoveUserWallpaperInfo(email); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperInfo info = { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::WALLPAPER_LAYOUT_CENTER, 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::User::DEFAULT, 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time::Now().LocalMidnight() 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_persistent = 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !user_manager->IsCurrentUserNonCryptohomeDataEphemeral(); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->SetDefaultWallpaper(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction:: 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateSetCustomWallpaperFunction() {} 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction:: 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSetCustomWallpaperFunction() {} 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperFunction::RunImpl() { 4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params = set_custom_wallpaper::Params::Create(*args_); 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Gets email address and username hash while at UI thread. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email_ = chromeos::UserManager::Get()->GetLoggedInUser()->email(); 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_id_hash_ = 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::UserManager::Get()->GetLoggedInUser()->username_hash(); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) StartDecode(params->wallpaper); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::OnWallpaperDecoded( 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& wallpaper) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::UserImage::RawImage raw_image(params->wallpaper.begin(), 4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params->wallpaper.end()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::UserImage image(wallpaper, raw_image); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath thumbnail_path = wallpaper_manager->GetCustomWallpaperPath( 4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::kThumbnailWallpaperSubDir, user_id_hash_, params->file_name); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::BLOCK_SHUTDOWN); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum( 4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_manager->SetCustomWallpaper(email_, 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_id_hash_, 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params->file_name, 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layout, 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::User::CUSTOMIZED, 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image); 489d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) unsafe_wallpaper_decoder_ = NULL; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (params->generate_thumbnail) { 49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wallpaper.EnsureRepsForSupportedScales(); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper.DeepCopy()); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generates thumbnail before call api function callback. We can then 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request thumbnail in the javascript callback. 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail, 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, thumbnail_path, base::Passed(&deep_copy))); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail( 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& thumbnail_path, scoped_ptr<gfx::ImageSkia> image) { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::UserImage wallpaper(*image.get()); 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(thumbnail_path.DirName())) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_util::CreateDirectory(thumbnail_path.DirName()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> data; 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get()->ResizeWallpaper( 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper, 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::WALLPAPER_LAYOUT_STRETCH, 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::kWallpaperThumbnailWidth, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::kWallpaperThumbnailHeight, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &data); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated, 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, data)); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated( 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RefCountedBytes* data) { 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BinaryValue* result = BinaryValue::CreateWithCopiedBuffer( 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reinterpret_cast<const char*>(data->front()), data->size()); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(result); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(true); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction:: 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateSetCustomWallpaperLayoutFunction() {} 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction:: 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSetCustomWallpaperLayoutFunction() {} 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperLayoutFunction::RunImpl() { 5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<set_custom_wallpaper_layout::Params> params( 5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) set_custom_wallpaper_layout::Params::Create(*args_)); 5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperInfo info; 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->GetLoggedInUserWallpaperInfo(&info); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (info.type != chromeos::User::CUSTOMIZED) { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetError("Only custom wallpaper can change layout."); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(false); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) info.layout = wallpaper_api_util::GetLayoutEnum( 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email(); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_persistent = 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !chromeos::UserManager::Get()->IsCurrentUserNonCryptohomeDataEphemeral(); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->UpdateWallpaper(); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets email address while at UI thread. 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction:: 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateMinimizeInactiveWindowsFunction() { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction:: 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateMinimizeInactiveWindowsFunction() { 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateMinimizeInactiveWindowsFunction::RunImpl() { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowStateManager::MinimizeInactiveWindows(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction:: 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateRestoreMinimizedWindowsFunction() { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction:: 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateRestoreMinimizedWindowsFunction() { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateRestoreMinimizedWindowsFunction::RunImpl() { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowStateManager::RestoreWindows(); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::WallpaperPrivateGetThumbnailFunction() { 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::~WallpaperPrivateGetThumbnailFunction() { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateGetThumbnailFunction::RunImpl() { 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<get_thumbnail::Params> params( 6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) get_thumbnail::Params::Create(*args_)); 6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath thumbnail_path; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string email = chromeos::UserManager::Get()->GetLoggedInUser()->email(); 6088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (params->source == get_thumbnail::Params::SOURCE_ONLINE) { 6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string file_name = GURL(params->url_or_file).ExtractFileName(); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &thumbnail_path)); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumbnail_path = thumbnail_path.Append(file_name); 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!IsOEMDefaultWallpaper()) { 6151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SetError("No OEM wallpaper."); 6161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SendResponse(false); 6171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 6181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 6191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // TODO(bshe): Small resolution wallpaper is used here as wallpaper 6211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // thumbnail. We should either resize it or include a wallpaper thumbnail in 6221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // addition to large and small wallpaper resolutions. 6231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) thumbnail_path = CommandLine::ForCurrentProcess()->GetSwitchValuePath( 6241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ash::switches::kAshOemWallpaperSmall); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::Get, this, 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumbnail_path)); 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Failure( 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& file_name) { 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetError(base::StringPrintf("Failed to access wallpaper thumbnails for %s.", 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_name.c_str())); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(false); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileNotLoaded() { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileLoaded( 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& data) { 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BinaryValue* thumbnail = BinaryValue::CreateWithCopiedBuffer(data.c_str(), 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.size()); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(thumbnail); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Get(const base::FilePath& path) { 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetData(path, &data)) { 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data.empty()) { 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::FileNotLoaded, this)); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::FileLoaded, this, 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data)); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::Failure, this, 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.BaseName().value())); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction::WallpaperPrivateSaveThumbnailFunction() { 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction:: 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSaveThumbnailFunction() {} 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateSaveThumbnailFunction::RunImpl() { 6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<save_thumbnail::Params> params( 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) save_thumbnail::Params::Create(*args_)); 6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSaveThumbnailFunction::Save, 7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this, params->data, GURL(params->url).ExtractFileName())); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Failure( 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& file_name) { 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetError(base::StringPrintf("Failed to create/write thumbnail of %s.", 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_name.c_str())); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(false); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Success() { 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Save(const std::string& data, 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& file_name) { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SaveData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, data)) { 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSaveThumbnailFunction::Success, this)); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSaveThumbnailFunction::Failure, 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, file_name)); 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction:: 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateGetOfflineWallpaperListFunction() { 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction:: 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateGetOfflineWallpaperListFunction() { 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WallpaperPrivateGetOfflineWallpaperListFunction::RunImpl() { 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::GetList, 7518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) this)); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::GetList() { 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> file_list; 7598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath wallpaper_dir; 7608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir)); 7618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (base::DirectoryExists(wallpaper_dir)) { 7628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FileEnumerator files(wallpaper_dir, false, 7638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FileEnumerator::FILES); 7648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (base::FilePath current = files.Next(); !current.empty(); 7658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) current = files.Next()) { 7668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string file_name = current.BaseName().RemoveExtension().value(); 7678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Do not add file name of small resolution wallpaper to the list. 7688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!EndsWith(file_name, chromeos::kSmallWallpaperSuffix, true)) 7698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) file_list.push_back(current.BaseName().value()); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete, 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, file_list)); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete( 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& file_list) { 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ListValue* results = new ListValue(); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results->AppendStrings(file_list); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(results); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 785