OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h" | 5 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h" |
6 | 6 |
| 7 #include "ash/screensaver/screensaver_view.h" |
7 #include "base/bind.h" | 8 #include "base/bind.h" |
8 #include "base/callback.h" | 9 #include "base/callback.h" |
9 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
10 #include "base/logging.h" | 11 #include "base/logging.h" |
11 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" | 12 #include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h" |
12 #include "chrome/browser/chromeos/login/existing_user_controller.h" | 13 #include "chrome/browser/chromeos/login/existing_user_controller.h" |
13 #include "chrome/browser/chromeos/login/user_manager.h" | 14 #include "chrome/browser/chromeos/login/user_manager.h" |
14 #include "chrome/browser/chromeos/ui/screensaver_extension_dialog.h" | 15 #include "chrome/browser/extensions/extension_service.h" |
15 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" | 16 #include "chrome/browser/extensions/sandboxed_extension_unpacker.h" |
16 #include "chrome/common/chrome_notification_types.h" | 17 #include "chrome/common/chrome_notification_types.h" |
17 #include "chrome/common/extensions/extension.h" | 18 #include "chrome/common/extensions/extension.h" |
18 #include "chrome/common/extensions/extension_file_util.h" | 19 #include "chrome/common/extensions/extension_file_util.h" |
19 #include "chromeos/dbus/dbus_thread_manager.h" | 20 #include "chromeos/dbus/dbus_thread_manager.h" |
20 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
21 #include "content/public/browser/notification_service.h" | 22 #include "content/public/browser/notification_service.h" |
22 | 23 |
23 namespace chromeos { | 24 namespace chromeos { |
24 | 25 |
25 typedef base::Callback<void( | 26 typedef base::Callback<void( |
26 scoped_refptr<Extension>, | 27 scoped_refptr<Extension>, |
| 28 Profile*, |
27 const FilePath&)> UnpackCallback; | 29 const FilePath&)> UnpackCallback; |
28 | 30 |
29 class ScreensaverUnpackerClient : public SandboxedExtensionUnpackerClient { | 31 class ScreensaverUnpackerClient : public SandboxedExtensionUnpackerClient { |
30 public: | 32 public: |
31 explicit ScreensaverUnpackerClient(const UnpackCallback& unpacker_callback) | 33 explicit ScreensaverUnpackerClient(const UnpackCallback& unpacker_callback) |
32 : unpack_callback_(unpacker_callback) {} | 34 : unpack_callback_(unpacker_callback) {} |
33 | 35 |
34 void OnUnpackSuccess(const FilePath& temp_dir, | 36 void OnUnpackSuccess(const FilePath& temp_dir, |
35 const FilePath& extension_root, | 37 const FilePath& extension_root, |
36 const base::DictionaryValue* original_manifest, | 38 const base::DictionaryValue* original_manifest, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 extension_file_util::LoadExtension(screensaver_extension_path, | 77 extension_file_util::LoadExtension(screensaver_extension_path, |
76 Extension::COMPONENT, | 78 Extension::COMPONENT, |
77 Extension::NO_FLAGS, | 79 Extension::NO_FLAGS, |
78 &error); | 80 &error); |
79 if (!screensaver_extension) { | 81 if (!screensaver_extension) { |
80 LOG(ERROR) << "Could not load screensaver extension from: " | 82 LOG(ERROR) << "Could not load screensaver extension from: " |
81 << screensaver_extension_path.value() << " due to: " << error; | 83 << screensaver_extension_path.value() << " due to: " << error; |
82 return; | 84 return; |
83 } | 85 } |
84 | 86 |
| 87 Profile* default_profile = ProfileManager::GetDefaultProfile(); |
85 content::BrowserThread::PostTask( | 88 content::BrowserThread::PostTask( |
86 content::BrowserThread::UI, | 89 content::BrowserThread::UI, |
87 FROM_HERE, | 90 FROM_HERE, |
88 base::Bind( | 91 base::Bind( |
89 unpack_callback_, | 92 unpack_callback_, |
90 screensaver_extension, | 93 screensaver_extension, |
| 94 default_profile, |
91 extension_base_path)); | 95 extension_base_path)); |
92 } | 96 } |
93 | 97 |
94 KioskModeScreensaver::KioskModeScreensaver() | 98 KioskModeScreensaver::KioskModeScreensaver() |
95 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 99 : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
96 chromeos::KioskModeSettings* kiosk_mode_settings = | 100 chromeos::KioskModeSettings* kiosk_mode_settings = |
97 chromeos::KioskModeSettings::Get(); | 101 chromeos::KioskModeSettings::Get(); |
98 | 102 |
99 if (kiosk_mode_settings->is_initialized()) { | 103 if (kiosk_mode_settings->is_initialized()) { |
100 GetScreensaverCrxPath(); | 104 GetScreensaverCrxPath(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 // Fire off the unpacker on the file thread; don't need it to return. | 149 // Fire off the unpacker on the file thread; don't need it to return. |
146 content::BrowserThread::PostTask( | 150 content::BrowserThread::PostTask( |
147 content::BrowserThread::FILE, | 151 content::BrowserThread::FILE, |
148 FROM_HERE, | 152 FROM_HERE, |
149 base::Bind( | 153 base::Bind( |
150 &SandboxedExtensionUnpacker::Start, screensaver_unpacker.get())); | 154 &SandboxedExtensionUnpacker::Start, screensaver_unpacker.get())); |
151 } | 155 } |
152 | 156 |
153 void KioskModeScreensaver::SetupScreensaver( | 157 void KioskModeScreensaver::SetupScreensaver( |
154 scoped_refptr<Extension> extension, | 158 scoped_refptr<Extension> extension, |
| 159 Profile* default_profile, |
155 const FilePath& extension_base_path) { | 160 const FilePath& extension_base_path) { |
156 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 161 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
157 extension_base_path_ = extension_base_path; | 162 extension_base_path_ = extension_base_path; |
158 | 163 |
159 // If the user is already logged in, don't need to display the screensaver. | 164 // If the user is already logged in, don't need to display the screensaver. |
160 if (chromeos::UserManager::Get()->IsUserLoggedIn()) | 165 if (chromeos::UserManager::Get()->IsUserLoggedIn()) |
161 return; | 166 return; |
162 | 167 |
163 registrar_.Add(this, chrome::NOTIFICATION_SESSION_STARTED, | 168 registrar_.Add(this, chrome::NOTIFICATION_SESSION_STARTED, |
164 content::NotificationService::AllSources()); | 169 content::NotificationService::AllSources()); |
165 | 170 |
166 // We will register ourselves now and unregister if a user logs in. | 171 // We will register ourselves now and unregister if a user logs in. |
167 chromeos::PowerManagerClient* power_manager = | 172 chromeos::PowerManagerClient* power_manager = |
168 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); | 173 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); |
169 if (!power_manager->HasObserver(this)) | 174 if (!power_manager->HasObserver(this)) |
170 power_manager->AddObserver(this); | 175 power_manager->AddObserver(this); |
171 | 176 |
172 // We need to disappear and login the demo user if we go active. | 177 // We need to disappear and login the demo user if we go active. |
173 chromeos::DBusThreadManager::Get()-> | 178 chromeos::DBusThreadManager::Get()-> |
174 GetPowerManagerClient()->RequestActiveNotification(); | 179 GetPowerManagerClient()->RequestActiveNotification(); |
175 | 180 |
176 browser::ShowScreensaverDialog(extension); | 181 // Add the extension to the extension service and display the screensaver. |
| 182 if (default_profile) { |
| 183 default_profile->GetExtensionService()->AddExtension(extension); |
| 184 ash::ShowScreensaver(extension->GetFullLaunchURL()); |
| 185 } else { |
| 186 LOG(ERROR) << "Couldn't get default profile. Unable to load screensaver!"; |
| 187 } |
177 } | 188 } |
178 | 189 |
179 // NotificationObserver overrides: | 190 // NotificationObserver overrides: |
180 void KioskModeScreensaver::Observe( | 191 void KioskModeScreensaver::Observe( |
181 int type, | 192 int type, |
182 const content::NotificationSource& source, | 193 const content::NotificationSource& source, |
183 const content::NotificationDetails& details) { | 194 const content::NotificationDetails& details) { |
184 DCHECK_EQ(type, chrome::NOTIFICATION_SESSION_STARTED); | 195 DCHECK_EQ(type, chrome::NOTIFICATION_SESSION_STARTED); |
185 // User logged in, remove our observers, screensaver will be deactivated. | 196 // User logged in, remove our observers, screensaver will be deactivated. |
186 chromeos::PowerManagerClient* power_manager = | 197 chromeos::PowerManagerClient* power_manager = |
187 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); | 198 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); |
188 if (power_manager->HasObserver(this)) | 199 if (power_manager->HasObserver(this)) |
189 power_manager->RemoveObserver(this); | 200 power_manager->RemoveObserver(this); |
190 | 201 |
191 browser::CloseScreensaverDialog(); | 202 ash::CloseScreensaver(); |
192 ShutdownKioskModeScreensaver(); | 203 ShutdownKioskModeScreensaver(); |
193 } | 204 } |
194 | 205 |
195 void KioskModeScreensaver::ActiveNotify() { | 206 void KioskModeScreensaver::ActiveNotify() { |
196 // User is active, log us in. | 207 // User is active, log us in. |
197 ExistingUserController* controller = | 208 ExistingUserController* controller = |
198 ExistingUserController::current_controller(); | 209 ExistingUserController::current_controller(); |
199 | 210 |
200 if (controller) { | 211 if (controller) { |
201 // Logging in will shut us down, removing the screen saver. | 212 // Logging in will shut us down, removing the screen saver. |
202 controller->LoginAsDemoUser(); | 213 controller->LoginAsDemoUser(); |
203 } else { | 214 } else { |
204 // Remove the screensaver so the user can at least use the underlying | 215 // Remove the screensaver so the user can at least use the underlying |
205 // login screen to be able to log in. | 216 // login screen to be able to log in. |
206 browser::CloseScreensaverDialog(); | 217 ash::CloseScreensaver(); |
207 } | 218 } |
208 } | 219 } |
209 | 220 |
210 static KioskModeScreensaver* g_kiosk_mode_screensaver = NULL; | 221 static KioskModeScreensaver* g_kiosk_mode_screensaver = NULL; |
211 | 222 |
212 void InitializeKioskModeScreensaver() { | 223 void InitializeKioskModeScreensaver() { |
213 if (g_kiosk_mode_screensaver) { | 224 if (g_kiosk_mode_screensaver) { |
214 LOG(WARNING) << "Screensaver was already initialized"; | 225 LOG(WARNING) << "Screensaver was already initialized"; |
215 return; | 226 return; |
216 } | 227 } |
217 | 228 |
218 g_kiosk_mode_screensaver = new KioskModeScreensaver(); | 229 g_kiosk_mode_screensaver = new KioskModeScreensaver(); |
219 } | 230 } |
220 | 231 |
221 void ShutdownKioskModeScreensaver() { | 232 void ShutdownKioskModeScreensaver() { |
222 delete g_kiosk_mode_screensaver; | 233 delete g_kiosk_mode_screensaver; |
223 g_kiosk_mode_screensaver = NULL; | 234 g_kiosk_mode_screensaver = NULL; |
224 } | 235 } |
225 | 236 |
226 } // namespace chromeos | 237 } // namespace chromeos |
OLD | NEW |