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" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_service.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 225e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/worker_pool.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/wallpaper/wallpaper_manager.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pref_names.h" 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h" 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h" 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h" 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/strings/grit/app_locale_settings.h" 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::BinaryValue; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace wallpaper_private = extensions::api::wallpaper_private; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper_if_exists = wallpaper_private::SetWallpaperIfExists; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_wallpaper = wallpaper_private::SetWallpaper; 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper = wallpaper_private::SetCustomWallpaper; 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace set_custom_wallpaper_layout = 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::SetCustomWallpaperLayout; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_thumbnail = wallpaper_private::GetThumbnail; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace save_thumbnail = wallpaper_private::SaveThumbnail; 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace get_offline_wallpaper_list = 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::GetOfflineWallpaperList; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kWallpaperManifestBaseURL[] = 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "https://storage.googleapis.com/chromeos-wallpaper-public/manifest_"; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool IsOEMDefaultWallpaper() { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return CommandLine::ForCurrentProcess()->HasSwitch( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ash::switches::kAshDefaultWallpaperIsOem); 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Saves |data| as |file_name| to directory with |key|. Return false if the 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// directory can not be found/created or failed to write file. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveData(int key, const std::string& file_name, const std::string& data) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_dir; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(key, &data_dir)); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DirectoryExists(data_dir) && 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !base::CreateDirectory(data_dir)) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path = data_dir.Append(file_name); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return base::PathExists(file_path) || 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (base::WriteFile(file_path, data.c_str(), data.size()) != -1); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Gets |file_name| from directory with |key|. Return false if the directory can 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not be found or failed to read file to string |data|. Note if the |file_name| 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can not be found in the directory, return true with empty |data|. It is 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// expected that we may try to access file which did not saved yet. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetData(const base::FilePath& path, std::string* data) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath data_dir = path.DirName(); 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DirectoryExists(data_dir) && 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !base::CreateDirectory(data_dir)) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return !base::PathExists(path) || 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::ReadFileToString(path, data); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowStateManager remembers which windows have been minimized in order to 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// restore them when the wallpaper viewer is hidden. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowStateManager : public aura::WindowObserver { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typedef std::map<std::string, std::set<aura::Window*> > 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserIDHashWindowListMap; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimizes all windows except the active window. 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void MinimizeInactiveWindows(const std::string& user_id_hash); 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Unminimizes all minimized windows restoring them to their previous state. 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This should only be called after calling MinimizeInactiveWindows. 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void RestoreWindows(const std::string& user_id_hash); 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WindowStateManager(); 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~WindowStateManager(); 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Store all unminimized windows except |active_window| and minimize them. 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // All the windows are saved in a map and the key value is |user_id_hash|. 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void BuildWindowListAndMinimizeInactiveForUser( 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& user_id_hash, aura::Window* active_window); 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Unminimize all the stored windows for |user_id_hash|. 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RestoreMinimizedWindows(const std::string& user_id_hash); 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Remove the observer from |window| if |window| is no longer referenced in 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // user_id_hash_window_list_map_. 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RemoveObserverIfUnreferenced(aura::Window* window); 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // aura::WindowObserver overrides. 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Map of user id hash and associated list of minimized windows. 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserIDHashWindowListMap user_id_hash_window_list_map_; 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowStateManager); 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WindowStateManager* g_window_state_manager = NULL; 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::MinimizeInactiveWindows( 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& user_id_hash) { 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!g_window_state_manager) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_window_state_manager = new WindowStateManager(); 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) g_window_state_manager->BuildWindowListAndMinimizeInactiveForUser( 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash, ash::wm::GetActiveWindow()); 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::RestoreWindows(const std::string& user_id_hash) { 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!g_window_state_manager) { 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(false) << "This should only be called after calling " 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) << "MinimizeInactiveWindows."; 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) g_window_state_manager->RestoreMinimizedWindows(user_id_hash); 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (g_window_state_manager->user_id_hash_window_list_map_.empty()) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete g_window_state_manager; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_window_state_manager = NULL; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WindowStateManager::WindowStateManager() {} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)WindowStateManager::~WindowStateManager() {} 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::BuildWindowListAndMinimizeInactiveForUser( 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& user_id_hash, aura::Window* active_window) { 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (user_id_hash_window_list_map_.find(user_id_hash) == 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash_window_list_map_.end()) { 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash_window_list_map_[user_id_hash] = std::set<aura::Window*>(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<aura::Window*>* results = 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &user_id_hash_window_list_map_[user_id_hash]; 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<aura::Window*> windows = 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::MruWindowTracker::BuildWindowList(false); 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (std::vector<aura::Window*>::iterator iter = windows.begin(); 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) iter != windows.end(); ++iter) { 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ignore active window and minimized windows. 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (*iter == active_window || ash::wm::GetWindowState(*iter)->IsMinimized()) 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) continue; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(bshe): Add WindowStateObserver too. http://crbug.com/323252 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!(*iter)->HasObserver(this)) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->AddObserver(this); 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) results->insert(*iter); 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::wm::GetWindowState(*iter)->Minimize(); 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::RestoreMinimizedWindows( 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& user_id_hash) { 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UserIDHashWindowListMap::iterator it = 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash_window_list_map_.find(user_id_hash); 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (it == user_id_hash_window_list_map_.end()) { 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(false) << "This should only be called after calling " 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) << "MinimizeInactiveWindows."; 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<aura::Window*> removed_windows; 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) removed_windows.swap(it->second); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash_window_list_map_.erase(it); 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (std::set<aura::Window*>::iterator iter = removed_windows.begin(); 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) iter != removed_windows.end(); ++iter) { 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::wm::GetWindowState(*iter)->Unminimize(); 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RemoveObserverIfUnreferenced(*iter); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::RemoveObserverIfUnreferenced(aura::Window* window) { 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (UserIDHashWindowListMap::iterator iter = 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash_window_list_map_.begin(); 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) iter != user_id_hash_window_list_map_.end(); 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++iter) { 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (iter->second.find(window) != iter->second.end()) 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Remove observer if |window| is not observed by any users. 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window->RemoveObserver(this); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WindowStateManager::OnWindowDestroyed(aura::Window* window) { 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (UserIDHashWindowListMap::iterator iter = 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_id_hash_window_list_map_.begin(); 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) iter != user_id_hash_window_list_map_.end(); 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++iter) { 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) iter->second.erase(window); 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool WallpaperPrivateGetStringsFunction::RunSync() { 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = new base::DictionaryValue(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetResult(dict); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SET_STRING(id, idr) \ 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(id, l10n_util::GetStringUTF16(idr)) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("webFontFamily", IDS_WEB_FONT_FAMILY); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("webFontSize", IDS_WEB_FONT_SIZE); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("allCategoryLabel", IDS_WALLPAPER_MANAGER_ALL_CATEGORY_LABEL); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("deleteCommandLabel", IDS_WALLPAPER_MANAGER_DELETE_COMMAND_LABEL); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("customCategoryLabel", 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_WALLPAPER_MANAGER_CUSTOM_CATEGORY_LABEL); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("selectCustomLabel", 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_WALLPAPER_MANAGER_SELECT_CUSTOM_LABEL); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("positionLabel", IDS_WALLPAPER_MANAGER_POSITION_LABEL); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("colorLabel", IDS_WALLPAPER_MANAGER_COLOR_LABEL); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("centerCroppedLayout", 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_OPTIONS_WALLPAPER_CENTER_CROPPED_LAYOUT); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("centerLayout", IDS_OPTIONS_WALLPAPER_CENTER_LAYOUT); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("stretchLayout", IDS_OPTIONS_WALLPAPER_STRETCH_LAYOUT); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("connectionFailed", IDS_WALLPAPER_MANAGER_ACCESS_FAIL); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("downloadFailed", IDS_WALLPAPER_MANAGER_DOWNLOAD_FAIL); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("downloadCanceled", IDS_WALLPAPER_MANAGER_DOWNLOAD_CANCEL); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("customWallpaperWarning", 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_WALLPAPER_MANAGER_SHOW_CUSTOM_WALLPAPER_ON_START_WARNING); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("accessFileFailure", IDS_WALLPAPER_MANAGER_ACCESS_FILE_FAILURE); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SET_STRING("invalidWallpaper", IDS_WALLPAPER_MANAGER_INVALID_WALLPAPER); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("surpriseMeLabel", IDS_WALLPAPER_MANAGER_SURPRISE_ME_LABEL); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SET_STRING("learnMore", IDS_LEARN_MORE); 2656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SET_STRING("currentWallpaperSetByMessage", 2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) IDS_CURRENT_WALLPAPER_SET_BY_MESSAGE); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SET_STRING 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webui::SetFontAndTextDirection(dict); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager::Get(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperInfo info; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (wallpaper_manager->GetLoggedInUserWallpaperInfo(&info)) 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dict->SetString("currentWallpaper", info.location); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dict->SetString("manifestBaseURL", kWallpaperManifestBaseURL); 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context()); 2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) std::string app_name( 2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) profile->GetPrefs()->GetString(prefs::kCurrentWallpaperAppName)); 2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!app_name.empty()) 2866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) dict->SetString("wallpaperAppName", app_name); 2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) dict->SetBoolean("isOEMDefaultWallpaper", IsOEMDefaultWallpaper()); 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dict->SetString("canceledWallpaper", 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wallpaper_api_util::kCancelWallpaperMessage); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction:: 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateSetWallpaperIfExistsFunction() {} 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperIfExistsFunction:: 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSetWallpaperIfExistsFunction() {} 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetWallpaperIfExistsFunction::RunAsync() { 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA) 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(bshe): Support wallpaper manager in Athena, crbug.com/408734. 3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params = set_wallpaper_if_exists::Params::Create(*args_); 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_id_ = user_manager::UserManager::Get()->GetActiveUser()->email(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath wallpaper_path; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath fallback_path; 310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::WallpaperManager::WallpaperResolution resolution = 311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::WallpaperManager::GetAppropriateResolution(); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string file_name = GURL(params->url).ExtractFileName(); 3148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, 3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) &wallpaper_path)); 3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) fallback_path = wallpaper_path.Append(file_name); 3178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (params->layout != wallpaper_private::WALLPAPER_LAYOUT_STRETCH && 318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch resolution == chromeos::WallpaperManager::WALLPAPER_RESOLUTION_SMALL) { 3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) file_name = base::FilePath(file_name).InsertBeforeExtension( 3208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) chromeos::kSmallWallpaperSuffix).value(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) wallpaper_path = wallpaper_path.Append(file_name); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WallpaperPrivateSetWallpaperIfExistsFunction:: 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadFileAndInitiateStartDecode, 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, wallpaper_path, fallback_path)); 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction:: 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReadFileAndInitiateStartDecode(const base::FilePath& file_path, 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& fallback_path) { 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = file_path; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(file_path)) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path = fallback_path; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (base::PathExists(path) && 35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::ReadFileToString(path, &data)) { 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::StartDecode, 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, data)); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error = base::StringPrintf( 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed to set wallpaper %s from file system.", 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.BaseName().value().c_str()); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists, 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, error)); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnWallpaperDecoded( 3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gfx::ImageSkia& image) { 369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Set unsafe_wallpaper_decoder_ to null since the decoding already finished. 370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) unsafe_wallpaper_decoder_ = NULL; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum( 3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool update_wallpaper = 3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_id_ == user_manager::UserManager::Get()->GetActiveUser()->email(); 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetWallpaperFromImageSkia( 3805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_id_, image, layout, update_wallpaper); 3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool is_persistent = !user_manager::UserManager::Get() 3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->IsCurrentUserNonCryptohomeDataEphemeral(); 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chromeos::WallpaperInfo info = {params->url, layout, 3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::ONLINE, 3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time::Now().LocalMidnight()}; 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(user_id_, info, is_persistent); 387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetResult(new base::FundamentalValue(true)); 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context()); 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This API is only available to the component wallpaper picker. We do not 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // need to show the app's name if it is the component wallpaper picker. So set 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the pref to empty string. 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName, 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string()); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperIfExistsFunction::OnFileNotExists( 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& error) { 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SetResult(new base::FundamentalValue(false)); 400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnFailure(error); 401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::WallpaperPrivateSetWallpaperFunction() { 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetWallpaperFunction::~WallpaperPrivateSetWallpaperFunction() { 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetWallpaperFunction::RunAsync() { 4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params = set_wallpaper::Params::Create(*args_); 4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets email address while at UI thread. 4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_id_ = user_manager::UserManager::Get()->GetActiveUser()->email(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) StartDecode(params->wallpaper); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::OnWallpaperDecoded( 4225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gfx::ImageSkia& image) { 4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu wallpaper_ = image; 424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Set unsafe_wallpaper_decoder_ to null since the decoding already finished. 425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) unsafe_wallpaper_decoder_ = NULL; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::BLOCK_SHUTDOWN); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperFunction::SaveToFile, this)); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SaveToFile() { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string file_name = GURL(params->url).ExtractFileName(); 4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (SaveData(chrome::DIR_CHROMEOS_WALLPAPERS, file_name, params->wallpaper)) { 44368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) wallpaper_.EnsureRepsForSupportedScales(); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<gfx::ImageSkia> deep_copy(wallpaper_.DeepCopy()); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ImageSkia is not RefCountedThreadSafe. Use a deep copied ImageSkia if 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // post to another thread. 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu BrowserThread::UI, 4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FROM_HERE, 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper, 4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this, 4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Passed(deep_copy.Pass()))); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath wallpaper_dir; 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir)); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path = wallpaper_dir.Append( 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_name).InsertBeforeExtension(chromeos::kSmallWallpaperSuffix); 4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (base::PathExists(file_path)) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates and saves small resolution wallpaper. Uses CENTER_CROPPED to 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // maintain the aspect ratio after resize. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager::Get()->ResizeAndSaveWallpaper( 4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu wallpaper_, 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_path, 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::WALLPAPER_LAYOUT_CENTER_CROPPED, 466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::kSmallWallpaperMaxWidth, 467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::kSmallWallpaperMaxHeight, 468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NULL); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error = base::StringPrintf( 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed to create/write wallpaper to %s.", file_name.c_str()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 474d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Bind(&WallpaperPrivateSetWallpaperFunction::OnFailure, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, error)); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetWallpaperFunction::SetDecodedWallpaper( 4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<gfx::ImageSkia> image) { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::WallpaperManager::Get(); 4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum( 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool update_wallpaper = 4886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_id_ == user_manager::UserManager::Get()->GetActiveUser()->email(); 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetWallpaperFromImageSkia( 4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu user_id_, *image.get(), layout, update_wallpaper); 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool is_persistent = !user_manager::UserManager::Get() 4936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->IsCurrentUserNonCryptohomeDataEphemeral(); 4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chromeos::WallpaperInfo info = {params->url, layout, 4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::ONLINE, 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time::Now().LocalMidnight()}; 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context()); 498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This API is only available to the component wallpaper picker. We do not 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // need to show the app's name if it is the component wallpaper picker. So set 500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the pref to empty string. 501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName, 502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string()); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(user_id_, info, is_persistent); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(true); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction:: 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateResetWallpaperFunction() {} 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateResetWallpaperFunction:: 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateResetWallpaperFunction() {} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateResetWallpaperFunction::RunAsync() { 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 5166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager* user_manager = user_manager::UserManager::Get(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string user_id = user_manager->GetActiveUser()->email(); 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->RemoveUserWallpaperInfo(user_id); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) chromeos::WallpaperInfo info = {std::string(), 5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ash::WALLPAPER_LAYOUT_CENTER, 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::DEFAULT, 5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time::Now().LocalMidnight()}; 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_persistent = 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !user_manager->IsCurrentUserNonCryptohomeDataEphemeral(); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(user_id, info, is_persistent); 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetDefaultWallpaperNow(user_id); 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context()); 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This API is only available to the component wallpaper picker. We do not 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // need to show the app's name if it is the component wallpaper picker. So set 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the pref to empty string. 534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName, 535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string()); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction:: 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateSetCustomWallpaperFunction() {} 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperFunction:: 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSetCustomWallpaperFunction() {} 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperFunction::RunAsync() { 5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params = set_custom_wallpaper::Params::Create(*args_); 5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Gets email address and username hash while at UI thread. 5506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_id_ = user_manager::UserManager::Get()->GetActiveUser()->email(); 5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_id_hash_ = 5526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetActiveUser()->username_hash(); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) StartDecode(params->wallpaper); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::OnWallpaperDecoded( 5605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const gfx::ImageSkia& image) { 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath thumbnail_path = wallpaper_manager->GetCustomWallpaperPath( 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chromeos::kThumbnailWallpaperSubDir, user_id_hash_, params->file_name); 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::BLOCK_SHUTDOWN); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ash::WallpaperLayout layout = wallpaper_api_util::GetLayoutEnum( 5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool update_wallpaper = 5776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_id_ == user_manager::UserManager::Get()->GetActiveUser()->email(); 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) wallpaper_manager->SetCustomWallpaper(user_id_, 5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_id_hash_, 5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) params->file_name, 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layout, 5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_manager::User::CUSTOMIZED, 5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) image, 5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) update_wallpaper); 585d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) unsafe_wallpaper_decoder_ = NULL; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext(browser_context()); 588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This API is only available to the component wallpaper picker. We do not 589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // need to show the app's name if it is the component wallpaper picker. So set 590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the pref to empty string. 591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) profile->GetPrefs()->SetString(prefs::kCurrentWallpaperAppName, 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string()); 593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (params->generate_thumbnail) { 5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu image.EnsureRepsForSupportedScales(); 5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<gfx::ImageSkia> deep_copy(image.DeepCopy()); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Generates thumbnail before call api function callback. We can then 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // request thumbnail in the javascript callback. 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail, 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, thumbnail_path, base::Passed(&deep_copy))); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::GenerateThumbnail( 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& thumbnail_path, scoped_ptr<gfx::ImageSkia> image) { 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(thumbnail_path.DirName())) 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::CreateDirectory(thumbnail_path.DirName()); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> data; 6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu chromeos::WallpaperManager::Get()->ResizeImage( 6175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu *image, 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::WALLPAPER_LAYOUT_STRETCH, 619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::kWallpaperThumbnailWidth, 620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch chromeos::kWallpaperThumbnailHeight, 621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &data, 622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NULL); 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated, 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, data)); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSetCustomWallpaperFunction::ThumbnailGenerated( 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::RefCountedBytes* data) { 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BinaryValue* result = BinaryValue::CreateWithCopiedBuffer( 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reinterpret_cast<const char*>(data->front()), data->size()); 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(result); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendResponse(true); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction:: 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateSetCustomWallpaperLayoutFunction() {} 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSetCustomWallpaperLayoutFunction:: 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSetCustomWallpaperLayoutFunction() {} 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSetCustomWallpaperLayoutFunction::RunAsync() { 6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<set_custom_wallpaper_layout::Params> params( 6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) set_custom_wallpaper_layout::Params::Create(*args_)); 6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager* wallpaper_manager = 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperManager::Get(); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::WallpaperInfo info; 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->GetLoggedInUserWallpaperInfo(&info); 6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (info.type != user_manager::User::CUSTOMIZED) { 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetError("Only custom wallpaper can change layout."); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(false); 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) info.layout = wallpaper_api_util::GetLayoutEnum( 6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wallpaper_private::ToString(params->layout)); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string email = 6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetActiveUser()->email(); 6636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool is_persistent = !user_manager::UserManager::Get() 6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ->IsCurrentUserNonCryptohomeDataEphemeral(); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) wallpaper_manager->SetUserWallpaperInfo(email, info, is_persistent); 666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wallpaper_manager->UpdateWallpaper(false /* clear_cache */); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets email address while at UI thread. 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction:: 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateMinimizeInactiveWindowsFunction() { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateMinimizeInactiveWindowsFunction:: 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateMinimizeInactiveWindowsFunction() { 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 681010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateMinimizeInactiveWindowsFunction::RunAsync() { 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WindowStateManager::MinimizeInactiveWindows( 6836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetActiveUser()->username_hash()); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction:: 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateRestoreMinimizedWindowsFunction() { 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateRestoreMinimizedWindowsFunction:: 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateRestoreMinimizedWindowsFunction() { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateRestoreMinimizedWindowsFunction::RunAsync() { 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WindowStateManager::RestoreWindows( 6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetActiveUser()->username_hash()); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::WallpaperPrivateGetThumbnailFunction() { 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetThumbnailFunction::~WallpaperPrivateGetThumbnailFunction() { 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 707010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateGetThumbnailFunction::RunAsync() { 7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<get_thumbnail::Params> params( 7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) get_thumbnail::Params::Create(*args_)); 7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath thumbnail_path; 7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string email = 7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) user_manager::UserManager::Get()->GetActiveUser()->email(); 7158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (params->source == get_thumbnail::Params::SOURCE_ONLINE) { 7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string file_name = GURL(params->url_or_file).ExtractFileName(); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &thumbnail_path)); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumbnail_path = thumbnail_path.Append(file_name); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!IsOEMDefaultWallpaper()) { 7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SetError("No OEM wallpaper."); 7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SendResponse(false); 7241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; 7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // TODO(bshe): Small resolution wallpaper is used here as wallpaper 7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // thumbnail. We should either resize it or include a wallpaper thumbnail in 7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // addition to large and small wallpaper resolutions. 7301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) thumbnail_path = CommandLine::ForCurrentProcess()->GetSwitchValuePath( 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ash::switches::kAshDefaultWallpaperSmall); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::Get, this, 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumbnail_path)); 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Failure( 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& file_name) { 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetError(base::StringPrintf("Failed to access wallpaper thumbnails for %s.", 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_name.c_str())); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(false); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileNotLoaded() { 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::FileLoaded( 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& data) { 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BinaryValue* thumbnail = BinaryValue::CreateWithCopiedBuffer(data.c_str(), 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.size()); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(thumbnail); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetThumbnailFunction::Get(const base::FilePath& path) { 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string data; 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetData(path, &data)) { 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data.empty()) { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::FileNotLoaded, this)); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::FileLoaded, this, 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data)); 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetThumbnailFunction::Failure, this, 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path.BaseName().value())); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction::WallpaperPrivateSaveThumbnailFunction() { 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateSaveThumbnailFunction:: 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateSaveThumbnailFunction() {} 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateSaveThumbnailFunction::RunAsync() { 7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<save_thumbnail::Params> params( 7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) save_thumbnail::Params::Create(*args_)); 7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXTENSION_FUNCTION_VALIDATE(params); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSaveThumbnailFunction::Save, 8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this, params->data, GURL(params->url).ExtractFileName())); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Failure( 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& file_name) { 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetError(base::StringPrintf("Failed to create/write thumbnail of %s.", 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_name.c_str())); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(false); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Success() { 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateSaveThumbnailFunction::Save(const std::string& data, 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& file_name) { 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SaveData(chrome::DIR_CHROMEOS_WALLPAPER_THUMBNAILS, file_name, data)) { 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSaveThumbnailFunction::Success, this)); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateSaveThumbnailFunction::Failure, 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, file_name)); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction:: 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WallpaperPrivateGetOfflineWallpaperListFunction() { 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WallpaperPrivateGetOfflineWallpaperListFunction:: 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~WallpaperPrivateGetOfflineWallpaperListFunction() { 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 848010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool WallpaperPrivateGetOfflineWallpaperListFunction::RunAsync() { 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_ = BrowserThread::GetBlockingPool()-> 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNamedSequenceToken(chromeos::kWallpaperSequenceTokenName); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner = 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::GetBlockingPool()-> 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetSequencedTaskRunnerWithShutdownBehavior(sequence_token_, 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) task_runner->PostTask(FROM_HERE, 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::GetList, 8588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) this)); 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::GetList() { 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::GetBlockingPool()->IsRunningSequenceOnCurrentThread( 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sequence_token_)); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> file_list; 8668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FilePath wallpaper_dir; 8678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) CHECK(PathService::Get(chrome::DIR_CHROMEOS_WALLPAPERS, &wallpaper_dir)); 8688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (base::DirectoryExists(wallpaper_dir)) { 8698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FileEnumerator files(wallpaper_dir, false, 8708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::FileEnumerator::FILES); 8718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (base::FilePath current = files.Next(); !current.empty(); 8728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) current = files.Next()) { 8738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) std::string file_name = current.BaseName().RemoveExtension().value(); 8748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Do not add file name of small resolution wallpaper to the list. 8758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!EndsWith(file_name, chromeos::kSmallWallpaperSuffix, true)) 8768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) file_list.push_back(current.BaseName().value()); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::PostTask( 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserThread::UI, FROM_HERE, 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete, 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, file_list)); 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WallpaperPrivateGetOfflineWallpaperListFunction::OnComplete( 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& file_list) { 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* results = new base::ListValue(); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results->AppendStrings(file_list); 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(results); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendResponse(true); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892