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/ui/webui/chromeos/login/enrollment_screen_handler.h" | 5 #include "chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/strings/string_util.h" |
13 #include "base/values.h" | 14 #include "base/values.h" |
14 #include "chrome/browser/browser_process.h" | 15 #include "chrome/browser/browser_process.h" |
15 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 16 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
16 #include "chrome/browser/browsing_data/browsing_data_remover.h" | 17 #include "chrome/browser/browsing_data/browsing_data_remover.h" |
| 18 #include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" |
17 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" | 19 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" |
18 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
19 #include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retrie
ver.h" | 21 #include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retrie
ver.h" |
20 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" | 22 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" |
| 23 #include "chromeos/network/network_state.h" |
| 24 #include "chromeos/network/network_state_handler.h" |
21 #include "components/policy/core/browser/cloud/message_util.h" | 25 #include "components/policy/core/browser/cloud/message_util.h" |
22 #include "content/public/browser/web_contents.h" | 26 #include "content/public/browser/web_contents.h" |
23 #include "google_apis/gaia/gaia_auth_fetcher.h" | 27 #include "google_apis/gaia/gaia_auth_fetcher.h" |
24 #include "google_apis/gaia/gaia_auth_util.h" | 28 #include "google_apis/gaia/gaia_auth_util.h" |
25 #include "google_apis/gaia/gaia_constants.h" | 29 #include "google_apis/gaia/gaia_constants.h" |
26 #include "google_apis/gaia/gaia_urls.h" | 30 #include "google_apis/gaia/gaia_urls.h" |
27 #include "google_apis/gaia/google_service_auth_error.h" | 31 #include "google_apis/gaia/google_service_auth_error.h" |
28 #include "grit/chromium_strings.h" | 32 #include "grit/chromium_strings.h" |
29 #include "grit/generated_resources.h" | 33 #include "grit/generated_resources.h" |
30 #include "net/url_request/url_request_context_getter.h" | 34 #include "net/url_request/url_request_context_getter.h" |
(...skipping 18 matching lines...) Expand all Loading... |
49 const char kEnrollmentModeAuto[] = "auto"; | 53 const char kEnrollmentModeAuto[] = "auto"; |
50 | 54 |
51 std::string EnrollmentModeToString(EnrollmentScreenActor::EnrollmentMode mode) { | 55 std::string EnrollmentModeToString(EnrollmentScreenActor::EnrollmentMode mode) { |
52 switch (mode) { | 56 switch (mode) { |
53 case EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL: | 57 case EnrollmentScreenActor::ENROLLMENT_MODE_MANUAL: |
54 return kEnrollmentModeManual; | 58 return kEnrollmentModeManual; |
55 case EnrollmentScreenActor::ENROLLMENT_MODE_FORCED: | 59 case EnrollmentScreenActor::ENROLLMENT_MODE_FORCED: |
56 return kEnrollmentModeForced; | 60 return kEnrollmentModeForced; |
57 case EnrollmentScreenActor::ENROLLMENT_MODE_AUTO: | 61 case EnrollmentScreenActor::ENROLLMENT_MODE_AUTO: |
58 return kEnrollmentModeAuto; | 62 return kEnrollmentModeAuto; |
| 63 default: |
| 64 NOTREACHED() << "Bad enrollment mode " << mode; |
59 } | 65 } |
60 | 66 |
61 NOTREACHED() << "Bad enrollment mode " << mode; | |
62 return kEnrollmentModeManual; | 67 return kEnrollmentModeManual; |
63 } | 68 } |
64 | 69 |
65 // A helper class that takes care of asynchronously revoking a given token. | 70 // A helper class that takes care of asynchronously revoking a given token. |
66 class TokenRevoker : public GaiaAuthConsumer { | 71 class TokenRevoker : public GaiaAuthConsumer { |
67 public: | 72 public: |
68 TokenRevoker() | 73 TokenRevoker() |
69 : gaia_fetcher_(this, | 74 : gaia_fetcher_(this, |
70 GaiaConstants::kChromeOSSource, | 75 GaiaConstants::kChromeOSSource, |
71 g_browser_process->system_request_context()) {} | 76 g_browser_process->system_request_context()) {} |
72 virtual ~TokenRevoker() {} | 77 virtual ~TokenRevoker() {} |
73 | 78 |
74 void Start(const std::string& token) { | 79 void Start(const std::string& token) { |
75 gaia_fetcher_.StartRevokeOAuth2Token(token); | 80 gaia_fetcher_.StartRevokeOAuth2Token(token); |
76 } | 81 } |
77 | 82 |
78 // GaiaAuthConsumer: | 83 // GaiaAuthConsumer: |
79 virtual void OnOAuth2RevokeTokenCompleted() OVERRIDE { | 84 virtual void OnOAuth2RevokeTokenCompleted() OVERRIDE { |
80 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 85 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
81 } | 86 } |
82 | 87 |
83 private: | 88 private: |
84 GaiaAuthFetcher gaia_fetcher_; | 89 GaiaAuthFetcher gaia_fetcher_; |
85 | 90 |
86 DISALLOW_COPY_AND_ASSIGN(TokenRevoker); | 91 DISALLOW_COPY_AND_ASSIGN(TokenRevoker); |
87 }; | 92 }; |
88 | 93 |
| 94 // Returns network name by service path. |
| 95 std::string GetNetworkName(const std::string& service_path) { |
| 96 const NetworkState* network = |
| 97 NetworkHandler::Get()->network_state_handler()->GetNetworkState( |
| 98 service_path); |
| 99 if (!network) |
| 100 return std::string(); |
| 101 return network->name(); |
| 102 } |
| 103 |
| 104 bool IsBehindCaptivePortal(NetworkStateInformer::State state, |
| 105 ErrorScreenActor::ErrorReason reason) { |
| 106 return state == NetworkStateInformer::CAPTIVE_PORTAL || |
| 107 reason == ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED; |
| 108 } |
| 109 |
| 110 bool IsProxyError(NetworkStateInformer::State state, |
| 111 ErrorScreenActor::ErrorReason reason) { |
| 112 return state == NetworkStateInformer::PROXY_AUTH_REQUIRED || |
| 113 reason == ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED || |
| 114 reason == ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED; |
| 115 } |
| 116 |
89 } // namespace | 117 } // namespace |
90 | 118 |
91 // EnrollmentScreenHandler, public ------------------------------ | 119 // EnrollmentScreenHandler, public ------------------------------ |
92 | 120 |
93 EnrollmentScreenHandler::EnrollmentScreenHandler() | 121 EnrollmentScreenHandler::EnrollmentScreenHandler( |
| 122 const scoped_refptr<NetworkStateInformer>& network_state_informer, |
| 123 ErrorScreenActor* error_screen_actor) |
94 : BaseScreenHandler(kJsScreenPath), | 124 : BaseScreenHandler(kJsScreenPath), |
95 controller_(NULL), | 125 controller_(NULL), |
96 show_on_init_(false), | 126 show_on_init_(false), |
97 enrollment_mode_(ENROLLMENT_MODE_MANUAL), | 127 enrollment_mode_(ENROLLMENT_MODE_MANUAL), |
98 browsing_data_remover_(NULL) { | 128 browsing_data_remover_(NULL), |
| 129 frame_error_(net::OK), |
| 130 network_state_informer_(network_state_informer), |
| 131 error_screen_actor_(error_screen_actor), |
| 132 weak_ptr_factory_(this) { |
99 set_async_assets_load_id(OobeUI::kScreenOobeEnrollment); | 133 set_async_assets_load_id(OobeUI::kScreenOobeEnrollment); |
| 134 DCHECK(network_state_informer_.get()); |
| 135 DCHECK(error_screen_actor_); |
| 136 network_state_informer_->AddObserver(this); |
| 137 |
| 138 if (chromeos::LoginDisplayHostImpl::default_host()) { |
| 139 chromeos::WebUILoginView* login_view = |
| 140 chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView(); |
| 141 if (login_view) |
| 142 login_view->AddFrameObserver(this); |
| 143 } |
100 } | 144 } |
101 | 145 |
102 EnrollmentScreenHandler::~EnrollmentScreenHandler() { | 146 EnrollmentScreenHandler::~EnrollmentScreenHandler() { |
103 if (browsing_data_remover_) | 147 if (browsing_data_remover_) |
104 browsing_data_remover_->RemoveObserver(this); | 148 browsing_data_remover_->RemoveObserver(this); |
| 149 network_state_informer_->RemoveObserver(this); |
| 150 |
| 151 if (chromeos::LoginDisplayHostImpl::default_host()) { |
| 152 chromeos::WebUILoginView* login_view = |
| 153 chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView(); |
| 154 if (login_view) |
| 155 login_view->RemoveFrameObserver(this); |
| 156 } |
105 } | 157 } |
106 | 158 |
107 // EnrollmentScreenHandler, WebUIMessageHandler implementation -- | 159 // EnrollmentScreenHandler, WebUIMessageHandler implementation -- |
108 | 160 |
109 void EnrollmentScreenHandler::RegisterMessages() { | 161 void EnrollmentScreenHandler::RegisterMessages() { |
110 AddCallback("oauthEnrollRetrieveAuthenticatedUserEmail", | 162 AddCallback("oauthEnrollRetrieveAuthenticatedUserEmail", |
111 &EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail); | 163 &EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail); |
112 AddCallback("oauthEnrollClose", | 164 AddCallback("oauthEnrollClose", |
113 &EnrollmentScreenHandler::HandleClose); | 165 &EnrollmentScreenHandler::HandleClose); |
114 AddCallback("oauthEnrollCompleteLogin", | 166 AddCallback("oauthEnrollCompleteLogin", |
115 &EnrollmentScreenHandler::HandleCompleteLogin); | 167 &EnrollmentScreenHandler::HandleCompleteLogin); |
116 AddCallback("oauthEnrollRetry", | 168 AddCallback("oauthEnrollRetry", |
117 &EnrollmentScreenHandler::HandleRetry); | 169 &EnrollmentScreenHandler::HandleRetry); |
| 170 AddCallback("frameLoadingCompleted", |
| 171 &EnrollmentScreenHandler::HandleFrameLoadingCompleted); |
118 } | 172 } |
119 | 173 |
120 // EnrollmentScreenHandler | 174 // EnrollmentScreenHandler |
121 // EnrollmentScreenActor implementation ----------------------------------- | 175 // EnrollmentScreenActor implementation ----------------------------------- |
122 | 176 |
123 void EnrollmentScreenHandler::SetParameters( | 177 void EnrollmentScreenHandler::SetParameters( |
124 Controller* controller, | 178 Controller* controller, |
125 EnrollmentMode enrollment_mode, | 179 EnrollmentMode enrollment_mode, |
126 const std::string& management_domain) { | 180 const std::string& management_domain) { |
127 controller_ = controller; | 181 controller_ = controller; |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 browsing_data_remover_ = NULL; | 401 browsing_data_remover_ = NULL; |
348 | 402 |
349 std::vector<base::Closure> callbacks_to_run; | 403 std::vector<base::Closure> callbacks_to_run; |
350 callbacks_to_run.swap(auth_reset_callbacks_); | 404 callbacks_to_run.swap(auth_reset_callbacks_); |
351 for (std::vector<base::Closure>::iterator callback(callbacks_to_run.begin()); | 405 for (std::vector<base::Closure>::iterator callback(callbacks_to_run.begin()); |
352 callback != callbacks_to_run.end(); ++callback) { | 406 callback != callbacks_to_run.end(); ++callback) { |
353 callback->Run(); | 407 callback->Run(); |
354 } | 408 } |
355 } | 409 } |
356 | 410 |
| 411 OobeUI::Screen EnrollmentScreenHandler::GetCurrentScreen() const { |
| 412 OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN; |
| 413 OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController()); |
| 414 if (oobe_ui) |
| 415 screen = oobe_ui->current_screen(); |
| 416 return screen; |
| 417 } |
| 418 |
| 419 bool EnrollmentScreenHandler::IsOnEnrollmentScreen() const { |
| 420 return (GetCurrentScreen() == OobeUI::SCREEN_OOBE_ENROLLMENT); |
| 421 } |
| 422 |
| 423 bool EnrollmentScreenHandler::IsEnrollmentScreenHiddenByError() const { |
| 424 return (GetCurrentScreen() == OobeUI::SCREEN_ERROR_MESSAGE && |
| 425 error_screen_actor_->parent_screen() == |
| 426 OobeUI::SCREEN_OOBE_ENROLLMENT); |
| 427 } |
| 428 |
| 429 // TODO(rsorokin): This function is mostly copied from SigninScreenHandler and |
| 430 // should be refactored in the future. |
| 431 void EnrollmentScreenHandler::UpdateState( |
| 432 ErrorScreenActor::ErrorReason reason) { |
| 433 if (!IsOnEnrollmentScreen() && !IsEnrollmentScreenHiddenByError()) |
| 434 return; |
| 435 |
| 436 NetworkStateInformer::State state = network_state_informer_->state(); |
| 437 const std::string network_path = network_state_informer_->network_path(); |
| 438 const bool is_online = (state == NetworkStateInformer::ONLINE); |
| 439 const bool is_behind_captive_portal = |
| 440 (state == NetworkStateInformer::CAPTIVE_PORTAL); |
| 441 const bool is_frame_error = |
| 442 (frame_error() != net::OK) || |
| 443 (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR); |
| 444 |
| 445 LOG(WARNING) << "EnrollmentScreenHandler::UpdateState(): " |
| 446 << "state=" << NetworkStateInformer::StatusString(state) << ", " |
| 447 << "reason=" << ErrorScreenActor::ErrorReasonString(reason); |
| 448 |
| 449 if (is_online || !is_behind_captive_portal) |
| 450 error_screen_actor_->HideCaptivePortal(); |
| 451 |
| 452 if (is_frame_error) { |
| 453 LOG(WARNING) << "Retry page load"; |
| 454 // TODO(rsorokin): Too many consecutive reloads. |
| 455 CallJS("doReload"); |
| 456 } |
| 457 |
| 458 if (!is_online || is_frame_error) |
| 459 SetupAndShowOfflineMessage(state, reason); |
| 460 else |
| 461 HideOfflineMessage(state, reason); |
| 462 } |
| 463 |
| 464 void EnrollmentScreenHandler::SetupAndShowOfflineMessage( |
| 465 NetworkStateInformer::State state, |
| 466 ErrorScreenActor::ErrorReason reason) { |
| 467 const std::string network_path = network_state_informer_->network_path(); |
| 468 const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason); |
| 469 const bool is_proxy_error = IsProxyError(state, reason); |
| 470 const bool is_frame_error = |
| 471 (frame_error() != net::OK) || |
| 472 (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR); |
| 473 |
| 474 if (is_proxy_error) { |
| 475 error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PROXY, |
| 476 std::string()); |
| 477 } else if (is_behind_captive_portal) { |
| 478 // Do not bother a user with obsessive captive portal showing. This |
| 479 // check makes captive portal being shown only once: either when error |
| 480 // screen is shown for the first time or when switching from another |
| 481 // error screen (offline, proxy). |
| 482 if (IsOnEnrollmentScreen() || (error_screen_actor_->error_state() != |
| 483 ErrorScreen::ERROR_STATE_PORTAL)) { |
| 484 error_screen_actor_->FixCaptivePortal(); |
| 485 } |
| 486 const std::string network_name = GetNetworkName(network_path); |
| 487 error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL, |
| 488 network_name); |
| 489 } else if (is_frame_error) { |
| 490 error_screen_actor_->SetErrorState( |
| 491 ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT, std::string()); |
| 492 } else { |
| 493 error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE, |
| 494 std::string()); |
| 495 } |
| 496 |
| 497 if (GetCurrentScreen() != OobeUI::SCREEN_ERROR_MESSAGE) { |
| 498 base::DictionaryValue params; |
| 499 const std::string network_type = network_state_informer_->network_type(); |
| 500 params.SetString("lastNetworkType", network_type); |
| 501 error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_SIGNIN); |
| 502 error_screen_actor_->Show(OobeUI::SCREEN_OOBE_ENROLLMENT, |
| 503 ¶ms, |
| 504 base::Bind(&EnrollmentScreenHandler::DoShow, |
| 505 weak_ptr_factory_.GetWeakPtr())); |
| 506 } |
| 507 } |
| 508 |
| 509 void EnrollmentScreenHandler::HideOfflineMessage( |
| 510 NetworkStateInformer::State state, |
| 511 ErrorScreenActor::ErrorReason reason) { |
| 512 if (IsEnrollmentScreenHiddenByError()) |
| 513 error_screen_actor_->Hide(); |
| 514 } |
| 515 |
| 516 void EnrollmentScreenHandler::OnFrameError( |
| 517 const std::string& frame_unique_name) { |
| 518 if (frame_unique_name == "oauth-enroll-signin-frame") { |
| 519 HandleFrameLoadingCompleted(net::ERR_FAILED); |
| 520 } |
| 521 } |
357 // EnrollmentScreenHandler, private ----------------------------- | 522 // EnrollmentScreenHandler, private ----------------------------- |
358 | 523 |
359 void EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail( | 524 void EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail( |
360 double attempt_token) { | 525 double attempt_token) { |
361 email_retriever_.reset(new AuthenticatedUserEmailRetriever( | 526 email_retriever_.reset(new AuthenticatedUserEmailRetriever( |
362 base::Bind(&EnrollmentScreenHandler::CallJS<double, std::string>, | 527 base::Bind(&EnrollmentScreenHandler::CallJS<double, std::string>, |
363 base::Unretained(this), | 528 base::Unretained(this), |
364 "setAuthenticatedUserEmail", | 529 "setAuthenticatedUserEmail", |
365 attempt_token), | 530 attempt_token), |
366 Profile::FromWebUI(web_ui())->GetRequestContext())); | 531 Profile::FromWebUI(web_ui())->GetRequestContext())); |
367 } | 532 } |
368 | 533 |
369 void EnrollmentScreenHandler::HandleClose(const std::string& reason) { | 534 void EnrollmentScreenHandler::HandleClose(const std::string& reason) { |
370 if (!controller_) { | 535 DCHECK(controller_); |
371 NOTREACHED(); | |
372 return; | |
373 } | |
374 | 536 |
375 if (reason == "cancel" || reason == "autocancel") | 537 if (reason == "cancel" || reason == "autocancel") |
376 controller_->OnCancel(); | 538 controller_->OnCancel(); |
377 else if (reason == "done") | 539 else if (reason == "done") |
378 controller_->OnConfirmationClosed(); | 540 controller_->OnConfirmationClosed(); |
379 else | 541 else |
380 NOTREACHED(); | 542 NOTREACHED(); |
381 } | 543 } |
382 | 544 |
383 void EnrollmentScreenHandler::HandleCompleteLogin(const std::string& user) { | 545 void EnrollmentScreenHandler::HandleCompleteLogin(const std::string& user) { |
384 if (!controller_) { | 546 DCHECK(controller_); |
385 NOTREACHED(); | |
386 return; | |
387 } | |
388 controller_->OnLoginDone(gaia::SanitizeEmail(user)); | 547 controller_->OnLoginDone(gaia::SanitizeEmail(user)); |
389 } | 548 } |
390 | 549 |
391 void EnrollmentScreenHandler::HandleRetry() { | 550 void EnrollmentScreenHandler::HandleRetry() { |
392 if (!controller_) { | 551 DCHECK(controller_); |
393 NOTREACHED(); | 552 controller_->OnRetry(); |
| 553 } |
| 554 |
| 555 void EnrollmentScreenHandler::HandleFrameLoadingCompleted(int status) { |
| 556 const net::Error frame_error = static_cast<net::Error>(status); |
| 557 frame_error_ = frame_error; |
| 558 |
| 559 if (network_state_informer_->state() != NetworkStateInformer::ONLINE) |
394 return; | 560 return; |
395 } | 561 if (frame_error_) |
396 controller_->OnRetry(); | 562 UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR); |
| 563 else |
| 564 UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE); |
397 } | 565 } |
398 | 566 |
399 void EnrollmentScreenHandler::ShowStep(const char* step) { | 567 void EnrollmentScreenHandler::ShowStep(const char* step) { |
400 CallJS("showStep", std::string(step)); | 568 CallJS("showStep", std::string(step)); |
401 } | 569 } |
402 | 570 |
403 void EnrollmentScreenHandler::ShowError(int message_id, bool retry) { | 571 void EnrollmentScreenHandler::ShowError(int message_id, bool retry) { |
404 ShowErrorMessage(l10n_util::GetStringUTF8(message_id), retry); | 572 ShowErrorMessage(l10n_util::GetStringUTF8(message_id), retry); |
405 } | 573 } |
406 | 574 |
(...skipping 23 matching lines...) Expand all Loading... |
430 screen_data.SetString("signin_url", kGaiaExtStartPage); | 598 screen_data.SetString("signin_url", kGaiaExtStartPage); |
431 screen_data.SetString("gaiaUrl", GaiaUrls::GetInstance()->gaia_url().spec()); | 599 screen_data.SetString("gaiaUrl", GaiaUrls::GetInstance()->gaia_url().spec()); |
432 screen_data.SetString("enrollment_mode", | 600 screen_data.SetString("enrollment_mode", |
433 EnrollmentModeToString(enrollment_mode_)); | 601 EnrollmentModeToString(enrollment_mode_)); |
434 screen_data.SetString("management_domain", management_domain_); | 602 screen_data.SetString("management_domain", management_domain_); |
435 | 603 |
436 ShowScreen(OobeUI::kScreenOobeEnrollment, &screen_data); | 604 ShowScreen(OobeUI::kScreenOobeEnrollment, &screen_data); |
437 } | 605 } |
438 | 606 |
439 } // namespace chromeos | 607 } // namespace chromeos |
OLD | NEW |