gaia_screen_handler.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h" 6 7#include "base/bind.h" 8#include "base/logging.h" 9#include "base/metrics/histogram.h" 10#include "base/strings/utf_string_conversions.h" 11#include "base/values.h" 12#include "chrome/browser/browser_process.h" 13#include "chrome/browser/browser_shutdown.h" 14#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" 15#include "chrome/browser/chromeos/policy/consumer_management_service.h" 16#include "chrome/browser/chromeos/profiles/profile_helper.h" 17#include "chrome/browser/chromeos/settings/cros_settings.h" 18#include "chrome/browser/io_thread.h" 19#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" 20#include "chrome/browser/ui/webui/signin/inline_login_ui.h" 21#include "chromeos/chromeos_switches.h" 22#include "chromeos/settings/cros_settings_names.h" 23#include "components/user_manager/user_manager.h" 24#include "content/public/browser/browser_thread.h" 25#include "content/public/browser/render_frame_host.h" 26#include "google_apis/gaia/gaia_auth_util.h" 27#include "google_apis/gaia/gaia_switches.h" 28#include "google_apis/gaia/gaia_urls.h" 29#include "grit/chromium_strings.h" 30#include "grit/generated_resources.h" 31#include "ui/base/l10n/l10n_util.h" 32 33using content::BrowserThread; 34 35namespace chromeos { 36 37namespace { 38 39const char kJsScreenPath[] = "login.GaiaSigninScreen"; 40const char kAuthIframeParentName[] = "signin-frame"; 41const char kAuthIframeParentOrigin[] = 42 "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/"; 43 44void UpdateAuthParams(base::DictionaryValue* params, 45 bool has_users, 46 bool is_enrolling_consumer_management) { 47 CrosSettings* cros_settings = CrosSettings::Get(); 48 bool allow_new_user = true; 49 cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user); 50 bool allow_guest = true; 51 cros_settings->GetBoolean(kAccountsPrefAllowGuest, &allow_guest); 52 // Account creation depends on Guest sign-in (http://crosbug.com/24570). 53 params->SetBoolean("createAccount", allow_new_user && allow_guest); 54 params->SetBoolean("guestSignin", allow_guest); 55 56 // Allow supervised user creation only if: 57 // 1. Enterprise managed device > is allowed by policy. 58 // 2. Consumer device > owner exists. 59 // 3. New users are allowed by owner. 60 // 4. Supervised users are allowed by owner. 61 bool supervised_users_allowed = 62 user_manager::UserManager::Get()->AreSupervisedUsersAllowed(); 63 bool supervised_users_can_create = true; 64 int message_id = -1; 65 if (!has_users) { 66 supervised_users_can_create = false; 67 message_id = IDS_CREATE_SUPERVISED_USER_NO_MANAGER_TEXT; 68 } 69 if (!allow_new_user || !supervised_users_allowed) { 70 supervised_users_can_create = false; 71 message_id = IDS_CREATE_SUPERVISED_USER_CREATION_RESTRICTED_TEXT; 72 } 73 74 params->SetBoolean("supervisedUsersEnabled", supervised_users_allowed); 75 params->SetBoolean("supervisedUsersCanCreate", supervised_users_can_create); 76 if (!supervised_users_can_create) { 77 params->SetString("supervisedUsersRestrictionReason", 78 l10n_util::GetStringUTF16(message_id)); 79 } 80 81 // Now check whether we're in multi-profiles user adding scenario and 82 // disable GAIA right panel features if that's the case. 83 // For consumer management enrollment, we also hide all right panel components 84 // and show only an enrollment message. 85 if (UserAddingScreen::Get()->IsRunning() || 86 is_enrolling_consumer_management) { 87 params->SetBoolean("createAccount", false); 88 params->SetBoolean("guestSignin", false); 89 params->SetBoolean("supervisedUsersEnabled", false); 90 } 91} 92 93void RecordSAMLScrapingVerificationResultInHistogram(bool success) { 94 UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.Scraping.VerificationResult", success); 95} 96 97// The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO 98// thread. 99void ClearDnsCache(IOThread* io_thread) { 100 DCHECK_CURRENTLY_ON(BrowserThread::IO); 101 if (browser_shutdown::IsTryingToQuit()) 102 return; 103 104 io_thread->ClearHostCache(); 105} 106 107} // namespace 108 109GaiaContext::GaiaContext() 110 : force_reload(false), 111 is_local(false), 112 password_changed(false), 113 show_users(false), 114 use_offline(false), 115 has_users(false) {} 116 117GaiaScreenHandler::GaiaScreenHandler( 118 const scoped_refptr<NetworkStateInformer>& network_state_informer, 119 policy::ConsumerManagementService* consumer_management) 120 : BaseScreenHandler(kJsScreenPath), 121 frame_state_(FRAME_STATE_UNKNOWN), 122 frame_error_(net::OK), 123 network_state_informer_(network_state_informer), 124 consumer_management_(consumer_management), 125 dns_cleared_(false), 126 dns_clear_task_running_(false), 127 cookies_cleared_(false), 128 focus_stolen_(false), 129 gaia_silent_load_(false), 130 using_saml_api_(false), 131 is_enrolling_consumer_management_(false), 132 test_expects_complete_login_(false), 133 signin_screen_handler_(NULL), 134 weak_factory_(this) { 135 DCHECK(network_state_informer_.get()); 136} 137 138GaiaScreenHandler::~GaiaScreenHandler() { 139} 140 141void GaiaScreenHandler::LoadGaia(const GaiaContext& context) { 142 base::DictionaryValue params; 143 const bool is_enrolling_consumer_management = 144 context.is_enrolling_consumer_management; 145 146 params.SetBoolean("forceReload", context.force_reload); 147 params.SetBoolean("isLocal", context.is_local); 148 params.SetBoolean("passwordChanged", context.password_changed); 149 params.SetBoolean("isShowUsers", context.show_users); 150 params.SetBoolean("useOffline", context.use_offline); 151 params.SetString("email", context.email); 152 params.SetBoolean("isEnrollingConsumerManagement", 153 is_enrolling_consumer_management); 154 155 UpdateAuthParams(¶ms, 156 context.has_users, 157 is_enrolling_consumer_management); 158 159 if (!context.use_offline) { 160 const std::string app_locale = g_browser_process->GetApplicationLocale(); 161 if (!app_locale.empty()) 162 params.SetString("hl", app_locale); 163 } else { 164 base::DictionaryValue* localized_strings = new base::DictionaryValue(); 165 localized_strings->SetString( 166 "stringEmail", l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMAIL)); 167 localized_strings->SetString( 168 "stringPassword", 169 l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_PASSWORD)); 170 localized_strings->SetString( 171 "stringSignIn", l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_SIGNIN)); 172 localized_strings->SetString( 173 "stringEmptyEmail", 174 l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMPTY_EMAIL)); 175 localized_strings->SetString( 176 "stringEmptyPassword", 177 l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMPTY_PASSWORD)); 178 localized_strings->SetString( 179 "stringError", l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_ERROR)); 180 params.Set("localizedStrings", localized_strings); 181 } 182 183 CommandLine* command_line = CommandLine::ForCurrentProcess(); 184 185 const GURL gaia_url = 186 command_line->HasSwitch(::switches::kGaiaUrl) 187 ? GURL(command_line->GetSwitchValueASCII(::switches::kGaiaUrl)) 188 : GaiaUrls::GetInstance()->gaia_url(); 189 params.SetString("gaiaUrl", gaia_url.spec()); 190 191 if (command_line->HasSwitch(chromeos::switches::kEnableEmbeddedSignin)) 192 params.SetBoolean("useEmbedded", true); 193 194 frame_state_ = FRAME_STATE_LOADING; 195 CallJS("loadAuthExtension", params); 196} 197 198void GaiaScreenHandler::UpdateGaia(const GaiaContext& context) { 199 base::DictionaryValue params; 200 UpdateAuthParams(¶ms, context.has_users, 201 context.is_enrolling_consumer_management); 202 CallJS("updateAuthExtension", params); 203} 204 205void GaiaScreenHandler::ReloadGaia(bool force_reload) { 206 if (frame_state_ == FRAME_STATE_LOADING && !force_reload) { 207 VLOG(1) << "Skipping reloading of Gaia since gaia is loading."; 208 return; 209 } 210 NetworkStateInformer::State state = network_state_informer_->state(); 211 if (state != NetworkStateInformer::ONLINE) { 212 VLOG(1) << "Skipping reloading of Gaia since network state=" 213 << NetworkStateInformer::StatusString(state); 214 return; 215 } 216 VLOG(1) << "Reloading Gaia."; 217 frame_state_ = FRAME_STATE_LOADING; 218 CallJS("doReload"); 219} 220 221void GaiaScreenHandler::DeclareLocalizedValues( 222 LocalizedValuesBuilder* builder) { 223 builder->Add("signinScreenTitle", IDS_SIGNIN_SCREEN_TITLE); 224 builder->Add("signinScreenPasswordChanged", 225 IDS_SIGNIN_SCREEN_PASSWORD_CHANGED); 226 builder->Add("createAccount", IDS_CREATE_ACCOUNT_HTML); 227 builder->Add("guestSignin", IDS_BROWSE_WITHOUT_SIGNING_IN_HTML); 228 builder->Add("createSupervisedUser", 229 IDS_CREATE_SUPERVISED_USER_HTML); 230 builder->Add("createSupervisedUserFeatureName", 231 IDS_CREATE_SUPERVISED_USER_FEATURE_NAME); 232 builder->Add("consumerManagementEnrollmentSigninMessage", 233 IDS_LOGIN_CONSUMER_MANAGEMENT_ENROLLMENT); 234 235 // Strings used by the SAML fatal error dialog. 236 builder->Add("fatalErrorMessageNoEmail", IDS_LOGIN_FATAL_ERROR_NO_EMAIL); 237 builder->Add("fatalErrorMessageNoPassword", 238 IDS_LOGIN_FATAL_ERROR_NO_PASSWORD); 239 builder->Add("fatalErrorMessageVerificationFailed", 240 IDS_LOGIN_FATAL_ERROR_PASSWORD_VERIFICATION); 241 builder->Add("fatalErrorMessageInsecureURL", 242 IDS_LOGIN_FATAL_ERROR_TEXT_INSECURE_URL); 243 builder->Add("fatalErrorInstructions", IDS_LOGIN_FATAL_ERROR_INSTRUCTIONS); 244 builder->Add("fatalErrorDismissButton", IDS_OK); 245} 246 247void GaiaScreenHandler::Initialize() { 248} 249 250void GaiaScreenHandler::RegisterMessages() { 251 AddCallback("frameLoadingCompleted", 252 &GaiaScreenHandler::HandleFrameLoadingCompleted); 253 AddCallback("completeLogin", &GaiaScreenHandler::HandleCompleteLogin); 254 AddCallback("completeAuthentication", 255 &GaiaScreenHandler::HandleCompleteAuthentication); 256 AddCallback("usingSAMLAPI", &GaiaScreenHandler::HandleUsingSAMLAPI); 257 AddCallback("scrapedPasswordCount", 258 &GaiaScreenHandler::HandleScrapedPasswordCount); 259 AddCallback("scrapedPasswordVerificationFailed", 260 &GaiaScreenHandler::HandleScrapedPasswordVerificationFailed); 261 AddCallback("loginWebuiReady", &GaiaScreenHandler::HandleGaiaUIReady); 262} 263 264void GaiaScreenHandler::HandleFrameLoadingCompleted(int status) { 265 const net::Error frame_error = static_cast<net::Error>(-status); 266 if (frame_error == net::ERR_ABORTED) { 267 LOG(WARNING) << "Ignoring Gaia frame error: " << frame_error; 268 return; 269 } 270 frame_error_ = frame_error; 271 if (frame_error == net::OK) { 272 VLOG(1) << "Gaia is loaded"; 273 frame_state_ = FRAME_STATE_LOADED; 274 } else { 275 LOG(WARNING) << "Gaia frame error: " << frame_error_; 276 frame_state_ = FRAME_STATE_ERROR; 277 } 278 279 if (network_state_informer_->state() != NetworkStateInformer::ONLINE) 280 return; 281 if (frame_state_ == FRAME_STATE_LOADED) 282 UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE); 283 else if (frame_state_ == FRAME_STATE_ERROR) 284 UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR); 285} 286 287void GaiaScreenHandler::HandleCompleteAuthentication( 288 const std::string& email, 289 const std::string& password, 290 const std::string& auth_code) { 291 if (!Delegate()) 292 return; 293 Delegate()->SetDisplayEmail(gaia::SanitizeEmail(email)); 294 UserContext user_context(email); 295 user_context.SetKey(Key(password)); 296 user_context.SetAuthCode(auth_code); 297 Delegate()->CompleteLogin(user_context); 298} 299 300void GaiaScreenHandler::HandleCompleteLogin(const std::string& typed_email, 301 const std::string& password, 302 bool using_saml) { 303 if (!is_enrolling_consumer_management_) { 304 DoCompleteLogin(typed_email, password, using_saml); 305 return; 306 } 307 308 // Consumer management enrollment is in progress. 309 const std::string owner_email = 310 user_manager::UserManager::Get()->GetOwnerEmail(); 311 if (typed_email != owner_email) { 312 // Show Gaia sign-in screen again, since we only allow the owner to sign 313 // in. 314 populated_email_ = owner_email; 315 ShowGaia(is_enrolling_consumer_management_); 316 return; 317 } 318 319 CHECK(consumer_management_); 320 consumer_management_->SetOwner(owner_email, 321 base::Bind(&GaiaScreenHandler::OnSetOwnerDone, 322 weak_factory_.GetWeakPtr(), 323 typed_email, 324 password, 325 using_saml)); 326} 327 328void GaiaScreenHandler::HandleUsingSAMLAPI() { 329 SetSAMLPrincipalsAPIUsed(true); 330} 331 332void GaiaScreenHandler::HandleScrapedPasswordCount(int password_count) { 333 SetSAMLPrincipalsAPIUsed(false); 334 // Use a histogram that has 11 buckets, one for each of the values in [0, 9] 335 // and an overflow bucket at the end. 336 UMA_HISTOGRAM_ENUMERATION( 337 "ChromeOS.SAML.Scraping.PasswordCount", std::min(password_count, 10), 11); 338 if (password_count == 0) 339 HandleScrapedPasswordVerificationFailed(); 340} 341 342void GaiaScreenHandler::HandleScrapedPasswordVerificationFailed() { 343 RecordSAMLScrapingVerificationResultInHistogram(false); 344} 345 346void GaiaScreenHandler::HandleGaiaUIReady() { 347 if (focus_stolen_) { 348 // Set focus to the Gaia page. 349 // TODO(altimofeev): temporary solution, until focus parameters are 350 // implemented on the Gaia side. 351 // Do this only once. Any subsequent call would relod GAIA frame. 352 focus_stolen_ = false; 353 const char code[] = 354 "if (typeof gWindowOnLoad != 'undefined') gWindowOnLoad();"; 355 content::RenderFrameHost* frame = InlineLoginUI::GetAuthIframe( 356 web_ui()->GetWebContents(), 357 GURL(kAuthIframeParentOrigin), 358 kAuthIframeParentName); 359 frame->ExecuteJavaScript(base::ASCIIToUTF16(code)); 360 } 361 if (gaia_silent_load_) { 362 focus_stolen_ = true; 363 // Prevent focus stealing by the Gaia page. 364 // TODO(altimofeev): temporary solution, until focus parameters are 365 // implemented on the Gaia side. 366 const char code[] = 367 "var gWindowOnLoad = window.onload; " 368 "window.onload=function() {};"; 369 content::RenderFrameHost* frame = InlineLoginUI::GetAuthIframe( 370 web_ui()->GetWebContents(), 371 GURL(kAuthIframeParentOrigin), 372 kAuthIframeParentName); 373 frame->ExecuteJavaScript(base::ASCIIToUTF16(code)); 374 375 // As we could miss and window.onload could already be called, restore 376 // focus to current pod (see crbug/175243). 377 DCHECK(signin_screen_handler_); 378 signin_screen_handler_->RefocusCurrentPod(); 379 } 380 HandleFrameLoadingCompleted(0); 381 382 if (test_expects_complete_login_) 383 SubmitLoginFormForTest(); 384} 385 386void GaiaScreenHandler::OnSetOwnerDone(const std::string& typed_email, 387 const std::string& password, 388 bool using_saml, 389 bool success) { 390 if (!success) { 391 LOG(ERROR) << "Failed to write owner e-mail to boot lockbox."; 392 CHECK(consumer_management_); 393 consumer_management_->SetEnrollmentState( 394 policy::ConsumerManagementService::ENROLLMENT_BOOT_LOCKBOX_FAILED); 395 // We should continue loggin in the user, as there's not much we can do 396 // here. 397 } 398 DoCompleteLogin(typed_email, password, using_saml); 399} 400 401void GaiaScreenHandler::DoCompleteLogin(const std::string& typed_email, 402 const std::string& password, 403 bool using_saml) { 404 if (!Delegate()) 405 return; 406 407 if (using_saml && !using_saml_api_) 408 RecordSAMLScrapingVerificationResultInHistogram(true); 409 410 const std::string sanitized_email = gaia::SanitizeEmail(typed_email); 411 Delegate()->SetDisplayEmail(sanitized_email); 412 UserContext user_context(sanitized_email); 413 user_context.SetKey(Key(password)); 414 user_context.SetAuthFlow(using_saml 415 ? UserContext::AUTH_FLOW_GAIA_WITH_SAML 416 : UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML); 417 Delegate()->CompleteLogin(user_context); 418 419 if (test_expects_complete_login_) { 420 VLOG(2) << "Complete test login for " << typed_email 421 << ", requested=" << test_user_; 422 423 test_expects_complete_login_ = false; 424 test_user_.clear(); 425 test_pass_.clear(); 426 } 427} 428 429void GaiaScreenHandler::PopulateEmail(const std::string& user_id) { 430 populated_email_ = user_id; 431} 432 433void GaiaScreenHandler::PasswordChangedFor(const std::string& user_id) { 434 password_changed_for_.insert(user_id); 435} 436 437void GaiaScreenHandler::StartClearingDnsCache() { 438 if (dns_clear_task_running_ || !g_browser_process->io_thread()) 439 return; 440 441 dns_cleared_ = false; 442 BrowserThread::PostTaskAndReply( 443 BrowserThread::IO, 444 FROM_HERE, 445 base::Bind(&ClearDnsCache, g_browser_process->io_thread()), 446 base::Bind(&GaiaScreenHandler::OnDnsCleared, weak_factory_.GetWeakPtr())); 447 dns_clear_task_running_ = true; 448} 449 450void GaiaScreenHandler::OnDnsCleared() { 451 DCHECK_CURRENTLY_ON(BrowserThread::UI); 452 dns_clear_task_running_ = false; 453 dns_cleared_ = true; 454 ShowGaiaScreenIfReady(); 455} 456 457void GaiaScreenHandler::StartClearingCookies( 458 const base::Closure& on_clear_callback) { 459 cookies_cleared_ = false; 460 ProfileHelper* profile_helper = ProfileHelper::Get(); 461 LOG_ASSERT(Profile::FromWebUI(web_ui()) == 462 profile_helper->GetSigninProfile()); 463 profile_helper->ClearSigninProfile( 464 base::Bind(&GaiaScreenHandler::OnCookiesCleared, 465 weak_factory_.GetWeakPtr(), 466 on_clear_callback)); 467} 468 469void GaiaScreenHandler::OnCookiesCleared( 470 const base::Closure& on_clear_callback) { 471 DCHECK_CURRENTLY_ON(BrowserThread::UI); 472 cookies_cleared_ = true; 473 on_clear_callback.Run(); 474} 475 476void GaiaScreenHandler::ShowSigninScreenForCreds(const std::string& username, 477 const std::string& password) { 478 VLOG(2) << "ShowSigninScreenForCreds for user " << username 479 << ", frame_state=" << frame_state(); 480 481 test_user_ = username; 482 test_pass_ = password; 483 test_expects_complete_login_ = true; 484 485 // Submit login form for test if gaia is ready. If gaia is loading, login 486 // will be attempted in HandleLoginWebuiReady after gaia is ready. Otherwise, 487 // reload gaia then follow the loading case. 488 if (frame_state() == GaiaScreenHandler::FRAME_STATE_LOADED) { 489 SubmitLoginFormForTest(); 490 } else if (frame_state() != GaiaScreenHandler::FRAME_STATE_LOADING) { 491 DCHECK(signin_screen_handler_); 492 signin_screen_handler_->OnShowAddUser(); 493 } 494} 495 496void GaiaScreenHandler::SubmitLoginFormForTest() { 497 VLOG(2) << "Submit login form for test, user=" << test_user_; 498 499 std::string code; 500 code += "document.getElementById('Email').value = '" + test_user_ + "';"; 501 code += "document.getElementById('Passwd').value = '" + test_pass_ + "';"; 502 code += "document.getElementById('signIn').click();"; 503 504 content::RenderFrameHost* frame = InlineLoginUI::GetAuthIframe( 505 web_ui()->GetWebContents(), 506 GURL(kAuthIframeParentOrigin), 507 kAuthIframeParentName); 508 frame->ExecuteJavaScript(base::ASCIIToUTF16(code)); 509 510 // Test properties are cleared in HandleCompleteLogin because the form 511 // submission might fail and login will not be attempted after reloading 512 // if they are cleared here. 513} 514 515void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool api_used) { 516 using_saml_api_ = api_used; 517 UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.APIUsed", api_used); 518} 519 520void GaiaScreenHandler::ShowGaia(bool is_enrolling_consumer_management) { 521 is_enrolling_consumer_management_ = is_enrolling_consumer_management; 522 if (gaia_silent_load_ && populated_email_.empty()) { 523 dns_cleared_ = true; 524 cookies_cleared_ = true; 525 ShowGaiaScreenIfReady(); 526 } else { 527 StartClearingDnsCache(); 528 StartClearingCookies(base::Bind(&GaiaScreenHandler::ShowGaiaScreenIfReady, 529 weak_factory_.GetWeakPtr())); 530 } 531} 532 533void GaiaScreenHandler::ShowGaiaScreenIfReady() { 534 if (!dns_cleared_ || !cookies_cleared_ || !Delegate()) 535 return; 536 537 std::string active_network_path = network_state_informer_->network_path(); 538 if (gaia_silent_load_ && 539 (network_state_informer_->state() != NetworkStateInformer::ONLINE || 540 gaia_silent_load_network_ != active_network_path)) { 541 // Network has changed. Force Gaia reload. 542 gaia_silent_load_ = false; 543 // Gaia page will be realoded, so focus isn't stolen anymore. 544 focus_stolen_ = false; 545 } 546 547 // Note that LoadAuthExtension clears |populated_email_|. 548 if (populated_email_.empty()) 549 Delegate()->LoadSigninWallpaper(); 550 else 551 Delegate()->LoadWallpaper(populated_email_); 552 553 // Set Least Recently Used input method for the user. 554 if (!populated_email_.empty()) 555 signin_screen_handler_->SetUserInputMethod(populated_email_); 556 557 LoadAuthExtension(!gaia_silent_load_, false, false); 558 signin_screen_handler_->UpdateUIState( 559 SigninScreenHandler::UI_STATE_GAIA_SIGNIN, NULL); 560 561 if (gaia_silent_load_) { 562 // The variable is assigned to false because silently loaded Gaia page was 563 // used. 564 gaia_silent_load_ = false; 565 if (focus_stolen_) 566 HandleGaiaUIReady(); 567 } 568 569 signin_screen_handler_->UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE); 570} 571 572void GaiaScreenHandler::MaybePreloadAuthExtension() { 573 VLOG(1) << "MaybePreloadAuthExtension() call."; 574 575 // If cookies clearing was initiated or |dns_clear_task_running_| then auth 576 // extension showing has already been initiated and preloading is senseless. 577 if (signin_screen_handler_->ShouldLoadGaia() && 578 !gaia_silent_load_ && 579 !cookies_cleared_ && 580 !dns_clear_task_running_ && 581 network_state_informer_->state() == NetworkStateInformer::ONLINE) { 582 gaia_silent_load_ = true; 583 gaia_silent_load_network_ = network_state_informer_->network_path(); 584 LoadAuthExtension(true, true, false); 585 } 586} 587 588void GaiaScreenHandler::LoadAuthExtension(bool force, 589 bool silent_load, 590 bool offline) { 591 GaiaContext context; 592 context.force_reload = force; 593 context.is_local = offline; 594 context.password_changed = !populated_email_.empty() && 595 password_changed_for_.count(populated_email_); 596 context.use_offline = offline; 597 context.email = populated_email_; 598 context.is_enrolling_consumer_management = is_enrolling_consumer_management_; 599 if (Delegate()) { 600 context.show_users = Delegate()->IsShowUsers(); 601 context.has_users = !Delegate()->GetUsers().empty(); 602 } 603 604 populated_email_.clear(); 605 606 LoadGaia(context); 607} 608 609void GaiaScreenHandler::UpdateState(ErrorScreenActor::ErrorReason reason) { 610 if (signin_screen_handler_) 611 signin_screen_handler_->UpdateState(reason); 612} 613 614SigninScreenHandlerDelegate* GaiaScreenHandler::Delegate() { 615 DCHECK(signin_screen_handler_); 616 return signin_screen_handler_->delegate_; 617} 618 619void GaiaScreenHandler::SetSigninScreenHandler(SigninScreenHandler* handler) { 620 signin_screen_handler_ = handler; 621} 622} // namespace chromeos 623