Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Side by Side Diff: chrome/browser/chromeos/login/app_launch_controller.cc

Issue 79113002: kiosk: Network connectivity test during launch. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/login/app_launch_controller.h ('k') | chrome/browser/chromeos/login/kiosk_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698