OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/login/app_launch_controller.h" | 5 #include "chrome/browser/chromeos/login/app_launch_controller.h" |
6 | 6 |
7 #include "apps/shell_window_registry.h" | 7 #include "apps/shell_window_registry.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/json/json_file_value_serializer.h" | 10 #include "base/json/json_file_value_serializer.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "chrome/browser/browser_process.h" |
13 #include "chrome/browser/chrome_notification_types.h" | 14 #include "chrome/browser/chrome_notification_types.h" |
14 #include "chrome/browser/chromeos/app_mode/app_session_lifetime.h" | 15 #include "chrome/browser/chromeos/app_mode/app_session_lifetime.h" |
15 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" | 16 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
16 #include "chrome/browser/chromeos/app_mode/startup_app_launcher.h" | 17 #include "chrome/browser/chromeos/app_mode/startup_app_launcher.h" |
17 #include "chrome/browser/chromeos/login/login_display_host.h" | 18 #include "chrome/browser/chromeos/login/login_display_host.h" |
18 #include "chrome/browser/chromeos/login/login_display_host_impl.h" | 19 #include "chrome/browser/chromeos/login/login_display_host_impl.h" |
19 #include "chrome/browser/chromeos/login/oobe_display.h" | 20 #include "chrome/browser/chromeos/login/oobe_display.h" |
20 #include "chrome/browser/chromeos/login/screens/error_screen_actor.h" | 21 #include "chrome/browser/chromeos/login/screens/error_screen_actor.h" |
21 #include "chrome/browser/chromeos/login/webui_login_view.h" | 22 #include "chrome/browser/chromeos/login/webui_login_view.h" |
| 23 #include "chrome/browser/chromeos/settings/cros_settings.h" |
22 #include "chrome/browser/lifetime/application_lifetime.h" | 24 #include "chrome/browser/lifetime/application_lifetime.h" |
| 25 #include "chrome/browser/policy/browser_policy_connector.h" |
23 #include "chrome/browser/profiles/profile.h" | 26 #include "chrome/browser/profiles/profile.h" |
24 #include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handle
r.h" | 27 #include "chrome/browser/ui/webui/chromeos/login/app_launch_splash_screen_handle
r.h" |
25 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" | 28 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
26 #include "content/public/browser/browser_thread.h" | 29 #include "content/public/browser/browser_thread.h" |
27 #include "content/public/browser/notification_service.h" | 30 #include "content/public/browser/notification_service.h" |
28 #include "net/base/network_change_notifier.h" | 31 #include "net/base/network_change_notifier.h" |
29 | 32 |
30 namespace chromeos { | 33 namespace chromeos { |
31 | 34 |
32 namespace { | 35 namespace { |
33 | 36 |
34 // Application install splash screen minimum show time in milliseconds. | 37 // Application install splash screen minimum show time in milliseconds. |
35 const int kAppInstallSplashScreenMinTimeMS = 3000; | 38 const int kAppInstallSplashScreenMinTimeMS = 3000; |
36 | 39 |
37 } // namespace | 40 } // namespace |
38 | 41 |
39 // static | 42 // static |
40 bool AppLaunchController::skip_splash_wait_ = false; | 43 bool AppLaunchController::skip_splash_wait_ = false; |
41 int AppLaunchController::network_wait_time_ = 10; | 44 int AppLaunchController::network_wait_time_ = 10; |
42 base::Closure* AppLaunchController::network_timeout_callback_ = NULL; | 45 base::Closure* AppLaunchController::network_timeout_callback_ = NULL; |
43 AppLaunchController::CanConfigureNetworkCallback* | 46 AppLaunchController::ReturnBoolCallback* |
44 AppLaunchController::can_configure_network_callback_ = NULL; | 47 AppLaunchController::can_configure_network_callback_ = NULL; |
| 48 AppLaunchController::ReturnBoolCallback* |
| 49 AppLaunchController::need_owner_auth_to_configure_network_callback_ = NULL; |
45 | 50 |
46 //////////////////////////////////////////////////////////////////////////////// | 51 //////////////////////////////////////////////////////////////////////////////// |
47 // AppLaunchController::AppWindowWatcher | 52 // AppLaunchController::AppWindowWatcher |
48 | 53 |
49 class AppLaunchController::AppWindowWatcher | 54 class AppLaunchController::AppWindowWatcher |
50 : public apps::ShellWindowRegistry::Observer { | 55 : public apps::ShellWindowRegistry::Observer { |
51 public: | 56 public: |
52 explicit AppWindowWatcher(AppLaunchController* controller) | 57 explicit AppWindowWatcher(AppLaunchController* controller) |
53 : controller_(controller), | 58 : controller_(controller), |
54 window_registry_(apps::ShellWindowRegistry::Get(controller->profile_)) { | 59 window_registry_(apps::ShellWindowRegistry::Get(controller->profile_)) { |
(...skipping 26 matching lines...) Expand all Loading... |
81 | 86 |
82 AppLaunchController::AppLaunchController(const std::string& app_id, | 87 AppLaunchController::AppLaunchController(const std::string& app_id, |
83 LoginDisplayHost* host, | 88 LoginDisplayHost* host, |
84 OobeDisplay* oobe_display) | 89 OobeDisplay* oobe_display) |
85 : profile_(NULL), | 90 : profile_(NULL), |
86 app_id_(app_id), | 91 app_id_(app_id), |
87 host_(host), | 92 host_(host), |
88 oobe_display_(oobe_display), | 93 oobe_display_(oobe_display), |
89 app_launch_splash_screen_actor_( | 94 app_launch_splash_screen_actor_( |
90 oobe_display_->GetAppLaunchSplashScreenActor()), | 95 oobe_display_->GetAppLaunchSplashScreenActor()), |
91 error_screen_actor_(oobe_display_->GetErrorScreenActor()), | |
92 webui_visible_(false), | 96 webui_visible_(false), |
93 launcher_ready_(false), | 97 launcher_ready_(false), |
94 waiting_for_network_(false), | 98 waiting_for_network_(false), |
95 network_wait_timedout_(false), | 99 network_wait_timedout_(false), |
96 showing_network_dialog_(false), | 100 showing_network_dialog_(false), |
97 launch_splash_start_time_(0) { | 101 launch_splash_start_time_(0) { |
98 signin_screen_.reset(new AppLaunchSigninScreen( | |
99 static_cast<OobeUI*>(oobe_display_), this)); | |
100 } | 102 } |
101 | 103 |
102 AppLaunchController::~AppLaunchController() { | 104 AppLaunchController::~AppLaunchController() { |
103 app_launch_splash_screen_actor_->SetDelegate(NULL); | 105 app_launch_splash_screen_actor_->SetDelegate(NULL); |
104 } | 106 } |
105 | 107 |
106 void AppLaunchController::StartAppLaunch() { | 108 void AppLaunchController::StartAppLaunch() { |
107 DVLOG(1) << "Starting kiosk mode..."; | 109 DVLOG(1) << "Starting kiosk mode..."; |
108 | 110 |
109 webui_visible_ = host_->GetWebUILoginView()->webui_visible(); | 111 webui_visible_ = host_->GetWebUILoginView()->webui_visible(); |
110 if (!webui_visible_) { | 112 if (!webui_visible_) { |
111 registrar_.Add(this, chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, | 113 registrar_.Add(this, chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, |
112 content::NotificationService::AllSources()); | 114 content::NotificationService::AllSources()); |
113 } | 115 } |
114 launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); | 116 launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); |
115 | 117 |
116 // TODO(tengs): Add a loading profile app launch state. | 118 // TODO(tengs): Add a loading profile app launch state. |
117 app_launch_splash_screen_actor_->SetDelegate(this); | 119 app_launch_splash_screen_actor_->SetDelegate(this); |
118 app_launch_splash_screen_actor_->Show(app_id_); | 120 app_launch_splash_screen_actor_->Show(app_id_); |
119 | 121 |
120 kiosk_profile_loader_.reset( | 122 kiosk_profile_loader_.reset( |
121 new KioskProfileLoader(KioskAppManager::Get(), app_id_, this)); | 123 new KioskProfileLoader(KioskAppManager::Get(), app_id_, this)); |
122 kiosk_profile_loader_->Start(); | 124 kiosk_profile_loader_->Start(); |
123 } | 125 } |
124 | 126 |
| 127 // static |
125 void AppLaunchController::SkipSplashWaitForTesting() { | 128 void AppLaunchController::SkipSplashWaitForTesting() { |
126 skip_splash_wait_ = true; | 129 skip_splash_wait_ = true; |
127 } | 130 } |
128 | 131 |
| 132 // static |
129 void AppLaunchController::SetNetworkWaitForTesting(int wait_time_secs) { | 133 void AppLaunchController::SetNetworkWaitForTesting(int wait_time_secs) { |
130 network_wait_time_ = wait_time_secs; | 134 network_wait_time_ = wait_time_secs; |
131 } | 135 } |
132 | 136 |
| 137 // static |
133 void AppLaunchController::SetNetworkTimeoutCallbackForTesting( | 138 void AppLaunchController::SetNetworkTimeoutCallbackForTesting( |
134 base::Closure* callback) { | 139 base::Closure* callback) { |
135 network_timeout_callback_ = callback; | 140 network_timeout_callback_ = callback; |
136 } | 141 } |
137 | 142 |
| 143 // static |
138 void AppLaunchController::SetCanConfigureNetworkCallbackForTesting( | 144 void AppLaunchController::SetCanConfigureNetworkCallbackForTesting( |
139 CanConfigureNetworkCallback* can_configure_network_callback) { | 145 ReturnBoolCallback* can_configure_network_callback) { |
140 can_configure_network_callback_ = can_configure_network_callback; | 146 can_configure_network_callback_ = can_configure_network_callback; |
141 } | 147 } |
142 | 148 |
| 149 // static |
| 150 void AppLaunchController::SetNeedOwnerAuthToConfigureNetworkCallbackForTesting( |
| 151 ReturnBoolCallback* need_owner_auth_callback) { |
| 152 need_owner_auth_to_configure_network_callback_ = need_owner_auth_callback; |
| 153 } |
| 154 |
143 void AppLaunchController::OnConfigureNetwork() { | 155 void AppLaunchController::OnConfigureNetwork() { |
144 DCHECK(profile_); | 156 DCHECK(profile_); |
145 showing_network_dialog_ = true; | 157 showing_network_dialog_ = true; |
146 if (CanConfigureNetwork()) { | 158 if (CanConfigureNetwork() && NeedOwnerAuthToConfigureNetwork()) { |
| 159 signin_screen_.reset(new AppLaunchSigninScreen( |
| 160 static_cast<OobeUI*>(oobe_display_), this)); |
147 signin_screen_->Show(); | 161 signin_screen_->Show(); |
148 } else { | 162 } else { |
149 // If kiosk mode was configured through enterprise policy, we may | 163 // If kiosk mode was configured through enterprise policy, we may |
150 // not have an owner user. | 164 // not have an owner user. |
151 // TODO(tengs): We need to figure out the appropriate security meausres | 165 // TODO(tengs): We need to figure out the appropriate security meausres |
152 // for this case. | 166 // for this case. |
153 NOTREACHED(); | 167 NOTREACHED(); |
154 } | 168 } |
155 } | 169 } |
156 | 170 |
157 void AppLaunchController::OnOwnerSigninSuccess() { | 171 void AppLaunchController::OnOwnerSigninSuccess() { |
158 error_screen_actor_->SetErrorState( | 172 app_launch_splash_screen_actor_->ShowNetworkConfigureUI(); |
159 ErrorScreen::ERROR_STATE_OFFLINE, std::string()); | |
160 error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_KIOSK_MODE); | |
161 | |
162 error_screen_actor_->Show(OobeDisplay::SCREEN_APP_LAUNCH_SPLASH, NULL); | |
163 | |
164 signin_screen_.reset(); | 173 signin_screen_.reset(); |
165 } | 174 } |
166 | 175 |
167 void AppLaunchController::Observe( | 176 void AppLaunchController::Observe( |
168 int type, | 177 int type, |
169 const content::NotificationSource& source, | 178 const content::NotificationSource& source, |
170 const content::NotificationDetails& details) { | 179 const content::NotificationDetails& details) { |
171 DCHECK_EQ(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, type); | 180 DCHECK_EQ(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, type); |
172 DCHECK(!webui_visible_); | 181 DCHECK(!webui_visible_); |
173 webui_visible_ = true; | 182 webui_visible_ = true; |
174 launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); | 183 launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); |
175 if (launcher_ready_) | 184 if (launcher_ready_) |
176 OnReadyToLaunch(); | 185 OnReadyToLaunch(); |
177 } | 186 } |
178 | 187 |
179 void AppLaunchController::OnCancelAppLaunch() { | 188 void AppLaunchController::OnCancelAppLaunch() { |
180 if (KioskAppManager::Get()->GetDisableBailoutShortcut()) | 189 if (KioskAppManager::Get()->GetDisableBailoutShortcut()) |
181 return; | 190 return; |
182 | 191 |
183 OnLaunchFailed(KioskAppLaunchError::USER_CANCEL); | 192 OnLaunchFailed(KioskAppLaunchError::USER_CANCEL); |
184 } | 193 } |
185 | 194 |
| 195 void AppLaunchController::OnNetworkStateChanged(bool online) { |
| 196 if (!waiting_for_network_) |
| 197 return; |
| 198 |
| 199 if (online) |
| 200 startup_app_launcher_->ContinueWithNetworkReady(); |
| 201 else if (network_wait_timedout_) |
| 202 MaybeShowNetworkConfigureUI(); |
| 203 } |
| 204 |
186 void AppLaunchController::OnProfileLoaded(Profile* profile) { | 205 void AppLaunchController::OnProfileLoaded(Profile* profile) { |
187 DVLOG(1) << "Profile loaded... Starting app launch."; | 206 DVLOG(1) << "Profile loaded... Starting app launch."; |
188 profile_ = profile; | 207 profile_ = profile; |
189 | 208 |
190 kiosk_profile_loader_.reset(); | 209 kiosk_profile_loader_.reset(); |
191 startup_app_launcher_.reset(new StartupAppLauncher(profile_, app_id_)); | 210 startup_app_launcher_.reset(new StartupAppLauncher(profile_, app_id_, this)); |
192 startup_app_launcher_->AddObserver(this); | |
193 startup_app_launcher_->Initialize(); | 211 startup_app_launcher_->Initialize(); |
194 } | 212 } |
195 | 213 |
196 void AppLaunchController::OnProfileLoadFailed( | 214 void AppLaunchController::OnProfileLoadFailed( |
197 KioskAppLaunchError::Error error) { | 215 KioskAppLaunchError::Error error) { |
198 OnLaunchFailed(error); | 216 OnLaunchFailed(error); |
199 } | 217 } |
200 | 218 |
201 void AppLaunchController::CleanUp() { | 219 void AppLaunchController::CleanUp() { |
202 kiosk_profile_loader_.reset(); | 220 kiosk_profile_loader_.reset(); |
203 startup_app_launcher_.reset(); | 221 startup_app_launcher_.reset(); |
204 | 222 |
205 if (host_) | 223 if (host_) |
206 host_->Finalize(); | 224 host_->Finalize(); |
207 } | 225 } |
208 | 226 |
209 void AppLaunchController::OnNetworkWaitTimedout() { | 227 void AppLaunchController::OnNetworkWaitTimedout() { |
210 DCHECK(waiting_for_network_); | 228 DCHECK(waiting_for_network_); |
211 LOG(WARNING) << "OnNetworkWaitTimedout... connection = " | 229 LOG(WARNING) << "OnNetworkWaitTimedout... connection = " |
212 << net::NetworkChangeNotifier::GetConnectionType(); | 230 << net::NetworkChangeNotifier::GetConnectionType(); |
213 network_wait_timedout_ = true; | 231 network_wait_timedout_ = true; |
214 | 232 |
215 if (CanConfigureNetwork()) { | 233 MaybeShowNetworkConfigureUI(); |
216 app_launch_splash_screen_actor_->ToggleNetworkConfig(true); | |
217 } else { | |
218 app_launch_splash_screen_actor_->UpdateAppLaunchState( | |
219 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_NETWORK_WAIT_TIMEOUT); | |
220 } | |
221 | 234 |
222 if (network_timeout_callback_) | 235 if (network_timeout_callback_) |
223 network_timeout_callback_->Run(); | 236 network_timeout_callback_->Run(); |
224 } | 237 } |
225 | 238 |
226 void AppLaunchController::OnAppWindowCreated() { | 239 void AppLaunchController::OnAppWindowCreated() { |
227 DVLOG(1) << "App window created, closing splash screen."; | 240 DVLOG(1) << "App window created, closing splash screen."; |
228 CleanUp(); | 241 CleanUp(); |
229 } | 242 } |
230 | 243 |
231 bool AppLaunchController::CanConfigureNetwork() { | 244 bool AppLaunchController::CanConfigureNetwork() { |
232 if (can_configure_network_callback_) | 245 if (can_configure_network_callback_) |
233 return can_configure_network_callback_->Run(); | 246 return can_configure_network_callback_->Run(); |
234 | 247 |
| 248 if (g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) { |
| 249 bool should_prompt; |
| 250 if (CrosSettings::Get()->GetBoolean( |
| 251 kAccountsPrefDeviceLocalAccountPromptForNetworkWhenOffline, |
| 252 &should_prompt)) { |
| 253 return should_prompt; |
| 254 } |
| 255 |
| 256 // Default to true to allow network configuration if the policy is missing. |
| 257 return true; |
| 258 } |
| 259 |
235 return !UserManager::Get()->GetOwnerEmail().empty(); | 260 return !UserManager::Get()->GetOwnerEmail().empty(); |
236 } | 261 } |
237 | 262 |
238 void AppLaunchController::OnLoadingOAuthFile() { | 263 bool AppLaunchController::NeedOwnerAuthToConfigureNetwork() { |
239 app_launch_splash_screen_actor_->UpdateAppLaunchState( | 264 if (need_owner_auth_to_configure_network_callback_) |
240 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_LOADING_AUTH_FILE); | 265 return need_owner_auth_to_configure_network_callback_->Run(); |
| 266 |
| 267 return !g_browser_process->browser_policy_connector()->IsEnterpriseManaged(); |
241 } | 268 } |
242 | 269 |
243 void AppLaunchController::OnInitializingTokenService() { | 270 void AppLaunchController::MaybeShowNetworkConfigureUI() { |
244 app_launch_splash_screen_actor_->UpdateAppLaunchState( | 271 if (CanConfigureNetwork()) { |
245 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_LOADING_TOKEN_SERVICE); | 272 if (NeedOwnerAuthToConfigureNetwork()) { |
| 273 app_launch_splash_screen_actor_->ToggleNetworkConfig(true); |
| 274 } else { |
| 275 showing_network_dialog_ = true; |
| 276 app_launch_splash_screen_actor_->ShowNetworkConfigureUI(); |
| 277 } |
| 278 } else { |
| 279 app_launch_splash_screen_actor_->UpdateAppLaunchState( |
| 280 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_NETWORK_WAIT_TIMEOUT); |
| 281 } |
246 } | 282 } |
247 | 283 |
248 void AppLaunchController::OnInitializingNetwork() { | 284 void AppLaunchController::InitializeNetwork() { |
249 app_launch_splash_screen_actor_->UpdateAppLaunchState( | |
250 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_PREPARING_NETWORK); | |
251 | |
252 // Show the network configration dialog if network is not initialized | 285 // Show the network configration dialog if network is not initialized |
253 // after a brief wait time. | 286 // after a brief wait time. |
254 waiting_for_network_ = true; | 287 waiting_for_network_ = true; |
255 network_wait_timer_.Start( | 288 network_wait_timer_.Start( |
256 FROM_HERE, | 289 FROM_HERE, |
257 base::TimeDelta::FromSeconds(network_wait_time_), | 290 base::TimeDelta::FromSeconds(network_wait_time_), |
258 this, &AppLaunchController::OnNetworkWaitTimedout); | 291 this, &AppLaunchController::OnNetworkWaitTimedout); |
| 292 |
| 293 app_launch_splash_screen_actor_->UpdateAppLaunchState( |
| 294 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_PREPARING_NETWORK); |
| 295 } |
| 296 |
| 297 void AppLaunchController::OnLoadingOAuthFile() { |
| 298 app_launch_splash_screen_actor_->UpdateAppLaunchState( |
| 299 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_LOADING_AUTH_FILE); |
| 300 } |
| 301 |
| 302 void AppLaunchController::OnInitializingTokenService() { |
| 303 app_launch_splash_screen_actor_->UpdateAppLaunchState( |
| 304 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_LOADING_TOKEN_SERVICE); |
259 } | 305 } |
260 | 306 |
261 void AppLaunchController::OnInstallingApp() { | 307 void AppLaunchController::OnInstallingApp() { |
262 app_launch_splash_screen_actor_->UpdateAppLaunchState( | 308 app_launch_splash_screen_actor_->UpdateAppLaunchState( |
263 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_INSTALLING_APPLICATION); | 309 AppLaunchSplashScreenActor::APP_LAUNCH_STATE_INSTALLING_APPLICATION); |
264 | 310 |
| 311 waiting_for_network_ = false; |
265 network_wait_timer_.Stop(); | 312 network_wait_timer_.Stop(); |
266 app_launch_splash_screen_actor_->ToggleNetworkConfig(false); | 313 app_launch_splash_screen_actor_->ToggleNetworkConfig(false); |
267 | 314 |
268 // We have connectivity at this point, so we can skip the network | 315 // We have connectivity at this point, so we can skip the network |
269 // configuration dialog if it is being shown. | 316 // configuration dialog if it is being shown. |
270 if (showing_network_dialog_) { | 317 if (showing_network_dialog_) { |
271 app_launch_splash_screen_actor_->Show(app_id_); | 318 app_launch_splash_screen_actor_->Show(app_id_); |
272 showing_network_dialog_ = false; | 319 showing_network_dialog_ = false; |
273 launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); | 320 launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); |
274 } | 321 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 LOG(ERROR) << "Kiosk launch failed. Will now shut down."; | 358 LOG(ERROR) << "Kiosk launch failed. Will now shut down."; |
312 DCHECK_NE(KioskAppLaunchError::NONE, error); | 359 DCHECK_NE(KioskAppLaunchError::NONE, error); |
313 | 360 |
314 // Saves the error and ends the session to go back to login screen. | 361 // Saves the error and ends the session to go back to login screen. |
315 KioskAppLaunchError::Save(error); | 362 KioskAppLaunchError::Save(error); |
316 chrome::AttemptUserExit(); | 363 chrome::AttemptUserExit(); |
317 CleanUp(); | 364 CleanUp(); |
318 } | 365 } |
319 | 366 |
320 } // namespace chromeos | 367 } // namespace chromeos |
OLD | NEW |