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.
5 #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
8 #include "base/logging.h"
9 #include "base/metrics/histogram.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/values.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/browser_shutdown.h"
15 #include "chrome/browser/chromeos/input_method/input_method_util.h"
16 #include "chrome/browser/chromeos/language_preferences.h"
17 #include "chrome/browser/chromeos/login/screens/network_error.h"
18 #include "chrome/browser/chromeos/login/startup_utils.h"
19 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
20 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
21 #include "chrome/browser/chromeos/policy/consumer_management_service.h"
22 #include "chrome/browser/chromeos/policy/consumer_management_stage.h"
23 #include "chrome/browser/chromeos/profiles/profile_helper.h"
24 #include "chrome/browser/chromeos/settings/cros_settings.h"
25 #include "chrome/browser/io_thread.h"
26 #include "chrome/browser/lifetime/application_lifetime.h"
27 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
28 #include "chrome/browser/ui/webui/signin/inline_login_ui.h"
29 #include "chrome/common/chrome_version_info.h"
30 #include "chrome/common/pref_names.h"
31 #include "chrome/grit/generated_resources.h"
32 #include "chromeos/chromeos_switches.h"
33 #include "chromeos/login/auth/user_context.h"
34 #include "chromeos/settings/cros_settings_names.h"
35 #include "components/login/localized_values_builder.h"
36 #include "components/user_manager/user_manager.h"
37 #include "content/public/browser/browser_thread.h"
38 #include "content/public/browser/render_frame_host.h"
39 #include "google_apis/gaia/gaia_auth_util.h"
40 #include "google_apis/gaia/gaia_switches.h"
41 #include "google_apis/gaia/gaia_urls.h"
42 #include "ui/base/ime/chromeos/input_method_manager.h"
43 #include "ui/base/l10n/l10n_util.h"
45 using content::BrowserThread
;
51 const char kJsScreenPath
[] = "login.GaiaSigninScreen";
52 const char kAuthIframeParentName
[] = "signin-frame";
53 const char kAuthIframeParentOrigin
[] =
54 "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/";
56 void UpdateAuthParams(base::DictionaryValue
* params
,
58 bool is_enrolling_consumer_management
) {
59 CrosSettings
* cros_settings
= CrosSettings::Get();
60 bool allow_new_user
= true;
61 cros_settings
->GetBoolean(kAccountsPrefAllowNewUser
, &allow_new_user
);
62 bool allow_guest
= true;
63 cros_settings
->GetBoolean(kAccountsPrefAllowGuest
, &allow_guest
);
64 // Account creation depends on Guest sign-in (http://crosbug.com/24570).
65 params
->SetBoolean("createAccount", allow_new_user
&& allow_guest
);
66 params
->SetBoolean("guestSignin", allow_guest
);
68 // Allow supervised user creation only if:
69 // 1. Enterprise managed device > is allowed by policy.
70 // 2. Consumer device > owner exists.
71 // 3. New users are allowed by owner.
72 // 4. Supervised users are allowed by owner.
73 bool supervised_users_allowed
=
74 user_manager::UserManager::Get()->AreSupervisedUsersAllowed();
75 bool supervised_users_can_create
= true;
78 supervised_users_can_create
= false;
79 message_id
= IDS_CREATE_SUPERVISED_USER_NO_MANAGER_TEXT
;
81 if (!allow_new_user
|| !supervised_users_allowed
) {
82 supervised_users_can_create
= false;
83 message_id
= IDS_CREATE_SUPERVISED_USER_CREATION_RESTRICTED_TEXT
;
85 if (supervised_users_can_create
&&
86 ChromeUserManager::Get()
87 ->GetUsersAllowedForSupervisedUsersCreation()
89 supervised_users_can_create
= false;
90 message_id
= IDS_CREATE_SUPERVISED_USER_NO_MANAGER_EXCEPT_KIDS_TEXT
;
93 params
->SetBoolean("supervisedUsersEnabled", supervised_users_allowed
);
94 params
->SetBoolean("supervisedUsersCanCreate", supervised_users_can_create
);
95 if (!supervised_users_can_create
) {
96 params
->SetString("supervisedUsersRestrictionReason",
97 l10n_util::GetStringUTF16(message_id
));
100 // Now check whether we're in multi-profiles user adding scenario and
101 // disable GAIA right panel features if that's the case.
102 // For consumer management enrollment, we also hide all right panel components
103 // and show only an enrollment message.
104 if (UserAddingScreen::Get()->IsRunning() ||
105 is_enrolling_consumer_management
) {
106 params
->SetBoolean("createAccount", false);
107 params
->SetBoolean("guestSignin", false);
108 params
->SetBoolean("supervisedUsersEnabled", false);
112 void RecordSAMLScrapingVerificationResultInHistogram(bool success
) {
113 UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.Scraping.VerificationResult", success
);
116 // The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO
118 void ClearDnsCache(IOThread
* io_thread
) {
119 DCHECK_CURRENTLY_ON(BrowserThread::IO
);
120 if (browser_shutdown::IsTryingToQuit())
123 io_thread
->ClearHostCache();
126 void PushFrontIMIfNotExists(const std::string
& input_method
,
127 std::vector
<std::string
>* input_methods
) {
128 if (input_method
.empty())
131 if (std::find(input_methods
->begin(), input_methods
->end(), input_method
) ==
132 input_methods
->end())
133 input_methods
->insert(input_methods
->begin(), input_method
);
138 GaiaContext::GaiaContext()
139 : force_reload(false),
141 password_changed(false),
146 GaiaScreenHandler::GaiaScreenHandler(
147 CoreOobeActor
* core_oobe_actor
,
148 const scoped_refptr
<NetworkStateInformer
>& network_state_informer
,
149 policy::ConsumerManagementService
* consumer_management
)
150 : BaseScreenHandler(kJsScreenPath
),
151 frame_state_(FRAME_STATE_UNKNOWN
),
152 frame_error_(net::OK
),
153 network_state_informer_(network_state_informer
),
154 consumer_management_(consumer_management
),
155 core_oobe_actor_(core_oobe_actor
),
157 dns_clear_task_running_(false),
158 cookies_cleared_(false),
159 show_when_dns_and_cookies_cleared_(false),
160 focus_stolen_(false),
161 gaia_silent_load_(false),
162 using_saml_api_(false),
163 is_enrolling_consumer_management_(false),
164 test_expects_complete_login_(false),
165 embedded_signin_enabled_by_shortcut_(false),
166 signin_screen_handler_(NULL
),
167 weak_factory_(this) {
168 DCHECK(network_state_informer_
.get());
171 GaiaScreenHandler::~GaiaScreenHandler() {
174 void GaiaScreenHandler::LoadGaia(const GaiaContext
& context
) {
175 if (!auth_extension_
) {
176 Profile
* signin_profile
= ProfileHelper::GetSigninProfile();
177 auth_extension_
.reset(new ScopedGaiaAuthExtension(signin_profile
));
180 base::DictionaryValue params
;
181 const bool is_enrolling_consumer_management
=
182 context
.is_enrolling_consumer_management
;
184 params
.SetBoolean("forceReload", context
.force_reload
);
185 params
.SetBoolean("isLocal", context
.is_local
);
186 params
.SetBoolean("passwordChanged", context
.password_changed
);
187 params
.SetBoolean("isShowUsers", context
.show_users
);
188 params
.SetBoolean("useOffline", context
.use_offline
);
189 params
.SetString("email", context
.email
);
190 params
.SetBoolean("isEnrollingConsumerManagement",
191 is_enrolling_consumer_management
);
193 UpdateAuthParams(¶ms
,
195 is_enrolling_consumer_management
);
197 if (!context
.use_offline
) {
198 const std::string app_locale
= g_browser_process
->GetApplicationLocale();
199 if (!app_locale
.empty())
200 params
.SetString("hl", app_locale
);
202 base::DictionaryValue
* localized_strings
= new base::DictionaryValue();
203 localized_strings
->SetString(
204 "stringEmail", l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMAIL
));
205 localized_strings
->SetString(
207 l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_PASSWORD
));
208 localized_strings
->SetString(
209 "stringSignIn", l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_SIGNIN
));
210 localized_strings
->SetString(
212 l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMPTY_EMAIL
));
213 localized_strings
->SetString(
214 "stringEmptyPassword",
215 l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMPTY_PASSWORD
));
216 localized_strings
->SetString(
217 "stringError", l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_ERROR
));
218 params
.Set("localizedStrings", localized_strings
);
221 base::CommandLine
* command_line
= base::CommandLine::ForCurrentProcess();
223 const GURL gaia_url
=
224 command_line
->HasSwitch(::switches::kGaiaUrl
)
225 ? GURL(command_line
->GetSwitchValueASCII(::switches::kGaiaUrl
))
226 : GaiaUrls::GetInstance()->gaia_url();
227 params
.SetString("gaiaUrl", gaia_url
.spec());
229 if (command_line
->HasSwitch(switches::kGaiaEndpointChromeOS
)) {
230 params
.SetString("gaiaEndpoint", command_line
->GetSwitchValueASCII(
231 switches::kGaiaEndpointChromeOS
));
233 if (context
.embedded_signin_enabled
) {
234 params
.SetBoolean("useEmbedded", true);
235 // We set 'constrained' here to switch troubleshooting page on embedded
236 // signin to full tab.
237 params
.SetInteger("constrained", 1);
240 frame_state_
= FRAME_STATE_LOADING
;
241 CallJS("loadAuthExtension", params
);
244 void GaiaScreenHandler::UpdateGaia(const GaiaContext
& context
) {
245 base::DictionaryValue params
;
246 UpdateAuthParams(¶ms
, context
.has_users
,
247 context
.is_enrolling_consumer_management
);
248 CallJS("updateAuthExtension", params
);
251 void GaiaScreenHandler::ReloadGaia(bool force_reload
) {
252 if (frame_state_
== FRAME_STATE_LOADING
&& !force_reload
) {
253 VLOG(1) << "Skipping reloading of Gaia since gaia is loading.";
256 NetworkStateInformer::State state
= network_state_informer_
->state();
257 if (state
!= NetworkStateInformer::ONLINE
) {
258 VLOG(1) << "Skipping reloading of Gaia since network state="
259 << NetworkStateInformer::StatusString(state
);
262 VLOG(1) << "Reloading Gaia.";
263 frame_state_
= FRAME_STATE_LOADING
;
267 void GaiaScreenHandler::SwitchToEmbeddedSignin() {
268 // This feature should not be working on Stable,Beta images.
269 chrome::VersionInfo::Channel channel
= chrome::VersionInfo::GetChannel();
270 if (channel
== chrome::VersionInfo::CHANNEL_STABLE
||
271 channel
== chrome::VersionInfo::CHANNEL_BETA
) {
274 embedded_signin_enabled_by_shortcut_
= true;
276 true /* force */, true /* silent_load */, false /* offline */);
279 void GaiaScreenHandler::CancelEmbeddedSignin() {
280 embedded_signin_enabled_by_shortcut_
= false;
283 void GaiaScreenHandler::DeclareLocalizedValues(
284 ::login::LocalizedValuesBuilder
* builder
) {
285 builder
->Add("signinScreenTitle", IDS_SIGNIN_SCREEN_TITLE
);
286 builder
->Add("signinScreenPasswordChanged",
287 IDS_SIGNIN_SCREEN_PASSWORD_CHANGED
);
288 builder
->Add("createAccount", IDS_CREATE_ACCOUNT_HTML
);
289 builder
->Add("guestSignin", IDS_BROWSE_WITHOUT_SIGNING_IN_HTML
);
290 builder
->Add("createSupervisedUser",
291 IDS_CREATE_SUPERVISED_USER_HTML
);
292 builder
->Add("createSupervisedUserFeatureName",
293 IDS_CREATE_SUPERVISED_USER_FEATURE_NAME
);
294 builder
->Add("consumerManagementEnrollmentSigninMessage",
295 IDS_LOGIN_CONSUMER_MANAGEMENT_ENROLLMENT
);
297 // Strings used by the SAML fatal error dialog.
298 builder
->Add("fatalErrorMessageNoAccountDetails",
299 IDS_LOGIN_FATAL_ERROR_NO_ACCOUNT_DETAILS
);
300 builder
->Add("fatalErrorMessageNoPassword",
301 IDS_LOGIN_FATAL_ERROR_NO_PASSWORD
);
302 builder
->Add("fatalErrorMessageVerificationFailed",
303 IDS_LOGIN_FATAL_ERROR_PASSWORD_VERIFICATION
);
304 builder
->Add("fatalErrorMessageInsecureURL",
305 IDS_LOGIN_FATAL_ERROR_TEXT_INSECURE_URL
);
306 builder
->Add("fatalErrorInstructions", IDS_LOGIN_FATAL_ERROR_INSTRUCTIONS
);
307 builder
->Add("fatalErrorDismissButton", IDS_OK
);
310 void GaiaScreenHandler::GetAdditionalParameters(base::DictionaryValue
* dict
) {
311 dict
->SetBoolean("isWebviewSignin", StartupUtils::IsWebviewSigninEnabled());
314 void GaiaScreenHandler::Initialize() {
317 void GaiaScreenHandler::RegisterMessages() {
318 AddCallback("frameLoadingCompleted",
319 &GaiaScreenHandler::HandleFrameLoadingCompleted
);
320 AddCallback("completeLogin", &GaiaScreenHandler::HandleCompleteLogin
);
321 AddCallback("completeAuthentication",
322 &GaiaScreenHandler::HandleCompleteAuthentication
);
323 AddCallback("usingSAMLAPI", &GaiaScreenHandler::HandleUsingSAMLAPI
);
324 AddCallback("scrapedPasswordCount",
325 &GaiaScreenHandler::HandleScrapedPasswordCount
);
326 AddCallback("scrapedPasswordVerificationFailed",
327 &GaiaScreenHandler::HandleScrapedPasswordVerificationFailed
);
328 AddCallback("loginWebuiReady", &GaiaScreenHandler::HandleGaiaUIReady
);
329 AddCallback("switchToFullTab", &GaiaScreenHandler::HandleSwitchToFullTab
);
330 AddCallback("toggleWebviewSignin",
331 &GaiaScreenHandler::HandleToggleWebviewSignin
);
334 void GaiaScreenHandler::HandleFrameLoadingCompleted(int status
) {
335 const net::Error frame_error
= static_cast<net::Error
>(-status
);
336 if (frame_error
== net::ERR_ABORTED
) {
337 LOG(WARNING
) << "Ignoring Gaia frame error: " << frame_error
;
340 frame_error_
= frame_error
;
341 if (frame_error
== net::OK
) {
342 VLOG(1) << "Gaia is loaded";
343 frame_state_
= FRAME_STATE_LOADED
;
345 LOG(WARNING
) << "Gaia frame error: " << frame_error_
;
346 frame_state_
= FRAME_STATE_ERROR
;
349 if (network_state_informer_
->state() != NetworkStateInformer::ONLINE
)
351 if (frame_state_
== FRAME_STATE_LOADED
)
352 UpdateState(NetworkError::ERROR_REASON_UPDATE
);
353 else if (frame_state_
== FRAME_STATE_ERROR
)
354 UpdateState(NetworkError::ERROR_REASON_FRAME_ERROR
);
357 void GaiaScreenHandler::HandleCompleteAuthentication(
358 const std::string
& gaia_id
,
359 const std::string
& email
,
360 const std::string
& password
,
361 const std::string
& auth_code
) {
365 DCHECK(!email
.empty());
366 DCHECK(!gaia_id
.empty());
367 Delegate()->SetDisplayEmail(gaia::SanitizeEmail(email
));
368 UserContext
user_context(email
);
369 user_context
.SetGaiaID(gaia_id
);
370 user_context
.SetKey(Key(password
));
371 user_context
.SetAuthCode(auth_code
);
372 Delegate()->CompleteLogin(user_context
);
375 void GaiaScreenHandler::HandleCompleteLogin(const std::string
& gaia_id
,
376 const std::string
& typed_email
,
377 const std::string
& password
,
379 if (!is_enrolling_consumer_management_
) {
380 DoCompleteLogin(gaia_id
, typed_email
, password
, using_saml
);
384 // Consumer management enrollment is in progress.
385 const std::string owner_email
=
386 user_manager::UserManager::Get()->GetOwnerEmail();
387 if (typed_email
!= owner_email
) {
388 // Show Gaia sign-in screen again, since we only allow the owner to sign
390 populated_email_
= owner_email
;
391 ShowGaiaAsync(is_enrolling_consumer_management_
);
395 CHECK(consumer_management_
);
396 consumer_management_
->SetOwner(owner_email
,
397 base::Bind(&GaiaScreenHandler::OnSetOwnerDone
,
398 weak_factory_
.GetWeakPtr(),
405 void GaiaScreenHandler::HandleUsingSAMLAPI() {
406 SetSAMLPrincipalsAPIUsed(true);
409 void GaiaScreenHandler::HandleScrapedPasswordCount(int password_count
) {
410 SetSAMLPrincipalsAPIUsed(false);
411 // Use a histogram that has 11 buckets, one for each of the values in [0, 9]
412 // and an overflow bucket at the end.
413 UMA_HISTOGRAM_ENUMERATION(
414 "ChromeOS.SAML.Scraping.PasswordCount", std::min(password_count
, 10), 11);
415 if (password_count
== 0)
416 HandleScrapedPasswordVerificationFailed();
419 void GaiaScreenHandler::HandleScrapedPasswordVerificationFailed() {
420 RecordSAMLScrapingVerificationResultInHistogram(false);
423 void GaiaScreenHandler::HandleSwitchToFullTab() {
424 CallJS("switchToFullTab");
427 void GaiaScreenHandler::HandleToggleWebviewSignin() {
428 if (StartupUtils::EnableWebviewSignin(
429 !StartupUtils::IsWebviewSigninEnabled())) {
430 chrome::AttemptRestart();
434 void GaiaScreenHandler::HandleGaiaUIReady() {
436 // Set focus to the Gaia page.
437 // TODO(altimofeev): temporary solution, until focus parameters are
438 // implemented on the Gaia side.
439 // Do this only once. Any subsequent call would relod GAIA frame.
440 focus_stolen_
= false;
442 "if (typeof gWindowOnLoad != 'undefined') gWindowOnLoad();";
443 content::RenderFrameHost
* frame
= InlineLoginUI::GetAuthIframe(
444 web_ui()->GetWebContents(),
445 GURL(kAuthIframeParentOrigin
),
446 kAuthIframeParentName
);
447 frame
->ExecuteJavaScript(base::ASCIIToUTF16(code
));
449 if (gaia_silent_load_
) {
450 focus_stolen_
= true;
451 // Prevent focus stealing by the Gaia page.
452 // TODO(altimofeev): temporary solution, until focus parameters are
453 // implemented on the Gaia side.
455 "var gWindowOnLoad = window.onload; "
456 "window.onload=function() {};";
457 content::RenderFrameHost
* frame
= InlineLoginUI::GetAuthIframe(
458 web_ui()->GetWebContents(),
459 GURL(kAuthIframeParentOrigin
),
460 kAuthIframeParentName
);
461 frame
->ExecuteJavaScript(base::ASCIIToUTF16(code
));
463 // As we could miss and window.onload could already be called, restore
464 // focus to current pod (see crbug/175243).
465 DCHECK(signin_screen_handler_
);
466 signin_screen_handler_
->RefocusCurrentPod();
468 HandleFrameLoadingCompleted(0);
470 if (test_expects_complete_login_
)
471 SubmitLoginFormForTest();
474 void GaiaScreenHandler::OnSetOwnerDone(const std::string
& gaia_id
,
475 const std::string
& typed_email
,
476 const std::string
& password
,
479 CHECK(consumer_management_
);
481 consumer_management_
->SetStage(
482 policy::ConsumerManagementStage::EnrollmentOwnerStored());
484 LOG(ERROR
) << "Failed to write owner e-mail to boot lockbox.";
485 consumer_management_
->SetStage(
486 policy::ConsumerManagementStage::EnrollmentBootLockboxFailed());
487 // We should continue logging in the user, as there's not much we can do
490 DoCompleteLogin(gaia_id
, typed_email
, password
, using_saml
);
493 void GaiaScreenHandler::DoCompleteLogin(const std::string
& gaia_id
,
494 const std::string
& typed_email
,
495 const std::string
& password
,
500 if (using_saml
&& !using_saml_api_
)
501 RecordSAMLScrapingVerificationResultInHistogram(true);
503 DCHECK(!typed_email
.empty());
504 DCHECK(!gaia_id
.empty());
505 const std::string sanitized_email
= gaia::SanitizeEmail(typed_email
);
506 Delegate()->SetDisplayEmail(sanitized_email
);
507 UserContext
user_context(sanitized_email
);
508 user_context
.SetGaiaID(gaia_id
);
509 user_context
.SetKey(Key(password
));
510 user_context
.SetAuthFlow(using_saml
511 ? UserContext::AUTH_FLOW_GAIA_WITH_SAML
512 : UserContext::AUTH_FLOW_GAIA_WITHOUT_SAML
);
513 Delegate()->CompleteLogin(user_context
);
515 if (test_expects_complete_login_
) {
516 VLOG(2) << "Complete test login for " << typed_email
517 << ", requested=" << test_user_
;
519 test_expects_complete_login_
= false;
525 void GaiaScreenHandler::PopulateEmail(const std::string
& user_id
) {
526 populated_email_
= user_id
;
529 void GaiaScreenHandler::PasswordChangedFor(const std::string
& user_id
) {
530 password_changed_for_
.insert(user_id
);
533 void GaiaScreenHandler::StartClearingDnsCache() {
534 if (dns_clear_task_running_
|| !g_browser_process
->io_thread())
537 dns_cleared_
= false;
538 BrowserThread::PostTaskAndReply(
541 base::Bind(&ClearDnsCache
, g_browser_process
->io_thread()),
542 base::Bind(&GaiaScreenHandler::OnDnsCleared
, weak_factory_
.GetWeakPtr()));
543 dns_clear_task_running_
= true;
546 void GaiaScreenHandler::OnDnsCleared() {
547 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
548 dns_clear_task_running_
= false;
550 ShowGaiaScreenIfReady();
553 void GaiaScreenHandler::StartClearingCookies(
554 const base::Closure
& on_clear_callback
) {
555 cookies_cleared_
= false;
556 ProfileHelper
* profile_helper
= ProfileHelper::Get();
557 LOG_ASSERT(Profile::FromWebUI(web_ui()) ==
558 profile_helper
->GetSigninProfile());
559 profile_helper
->ClearSigninProfile(
560 base::Bind(&GaiaScreenHandler::OnCookiesCleared
,
561 weak_factory_
.GetWeakPtr(),
565 void GaiaScreenHandler::OnCookiesCleared(
566 const base::Closure
& on_clear_callback
) {
567 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
568 cookies_cleared_
= true;
569 on_clear_callback
.Run();
572 void GaiaScreenHandler::ShowSigninScreenForCreds(const std::string
& username
,
573 const std::string
& password
) {
574 VLOG(2) << "ShowSigninScreenForCreds for user " << username
575 << ", frame_state=" << frame_state();
577 test_user_
= username
;
578 test_pass_
= password
;
579 test_expects_complete_login_
= true;
581 // Submit login form for test if gaia is ready. If gaia is loading, login
582 // will be attempted in HandleLoginWebuiReady after gaia is ready. Otherwise,
583 // reload gaia then follow the loading case.
584 if (frame_state() == GaiaScreenHandler::FRAME_STATE_LOADED
) {
585 SubmitLoginFormForTest();
586 } else if (frame_state() != GaiaScreenHandler::FRAME_STATE_LOADING
) {
587 DCHECK(signin_screen_handler_
);
588 signin_screen_handler_
->OnShowAddUser();
592 void GaiaScreenHandler::SubmitLoginFormForTest() {
593 VLOG(2) << "Submit login form for test, user=" << test_user_
;
596 code
+= "document.getElementById('Email').value = '" + test_user_
+ "';";
597 code
+= "document.getElementById('Passwd').value = '" + test_pass_
+ "';";
598 code
+= "document.getElementById('signIn').click();";
600 content::RenderFrameHost
* frame
= InlineLoginUI::GetAuthIframe(
601 web_ui()->GetWebContents(),
602 GURL(kAuthIframeParentOrigin
),
603 kAuthIframeParentName
);
604 frame
->ExecuteJavaScript(base::ASCIIToUTF16(code
));
606 // Test properties are cleared in HandleCompleteLogin because the form
607 // submission might fail and login will not be attempted after reloading
608 // if they are cleared here.
611 void GaiaScreenHandler::SetSAMLPrincipalsAPIUsed(bool api_used
) {
612 using_saml_api_
= api_used
;
613 UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.APIUsed", api_used
);
616 void GaiaScreenHandler::ShowGaiaAsync(bool is_enrolling_consumer_management
) {
617 is_enrolling_consumer_management_
= is_enrolling_consumer_management
;
618 show_when_dns_and_cookies_cleared_
= true;
619 if (gaia_silent_load_
&& populated_email_
.empty()) {
621 cookies_cleared_
= true;
622 ShowGaiaScreenIfReady();
624 StartClearingDnsCache();
625 StartClearingCookies(base::Bind(&GaiaScreenHandler::ShowGaiaScreenIfReady
,
626 weak_factory_
.GetWeakPtr()));
630 void GaiaScreenHandler::CancelShowGaiaAsync() {
631 show_when_dns_and_cookies_cleared_
= false;
634 void GaiaScreenHandler::ShowGaiaScreenIfReady() {
637 !show_when_dns_and_cookies_cleared_
||
642 std::string active_network_path
= network_state_informer_
->network_path();
643 if (gaia_silent_load_
&&
644 (network_state_informer_
->state() != NetworkStateInformer::ONLINE
||
645 gaia_silent_load_network_
!= active_network_path
)) {
646 // Network has changed. Force Gaia reload.
647 gaia_silent_load_
= false;
648 // Gaia page will be realoded, so focus isn't stolen anymore.
649 focus_stolen_
= false;
652 // Note that LoadAuthExtension clears |populated_email_|.
653 if (populated_email_
.empty())
654 Delegate()->LoadSigninWallpaper();
656 Delegate()->LoadWallpaper(populated_email_
);
658 input_method::InputMethodManager
* imm
=
659 input_method::InputMethodManager::Get();
661 scoped_refptr
<input_method::InputMethodManager::State
> gaia_ime_state
=
662 imm
->GetActiveIMEState()->Clone();
663 imm
->SetState(gaia_ime_state
);
665 // Set Least Recently Used input method for the user.
666 if (!populated_email_
.empty()) {
667 SigninScreenHandler::SetUserInputMethod(populated_email_
,
668 gaia_ime_state
.get());
670 std::vector
<std::string
> input_methods
=
671 imm
->GetInputMethodUtil()->GetHardwareLoginInputMethodIds();
672 const std::string owner_im
= SigninScreenHandler::GetUserLRUInputMethod(
673 user_manager::UserManager::Get()->GetOwnerEmail());
674 const std::string system_im
= g_browser_process
->local_state()->GetString(
675 language_prefs::kPreferredKeyboardLayout
);
677 PushFrontIMIfNotExists(owner_im
, &input_methods
);
678 PushFrontIMIfNotExists(system_im
, &input_methods
);
680 gaia_ime_state
->EnableLoginLayouts(
681 g_browser_process
->GetApplicationLocale(), input_methods
);
683 if (!system_im
.empty()) {
684 gaia_ime_state
->ChangeInputMethod(system_im
, false /* show_message */);
685 } else if (!owner_im
.empty()) {
686 gaia_ime_state
->ChangeInputMethod(owner_im
, false /* show_message */);
690 LoadAuthExtension(!gaia_silent_load_
, false, false);
691 signin_screen_handler_
->UpdateUIState(
692 SigninScreenHandler::UI_STATE_GAIA_SIGNIN
, NULL
);
694 if (gaia_silent_load_
) {
695 // The variable is assigned to false because silently loaded Gaia page was
697 gaia_silent_load_
= false;
701 signin_screen_handler_
->UpdateState(NetworkError::ERROR_REASON_UPDATE
);
703 if (core_oobe_actor_
) {
704 PrefService
* prefs
= g_browser_process
->local_state();
705 if (prefs
->GetBoolean(prefs::kFactoryResetRequested
)) {
706 core_oobe_actor_
->ShowDeviceResetScreen();
707 } else if (prefs
->GetBoolean(prefs::kDebuggingFeaturesRequested
)) {
708 core_oobe_actor_
->ShowEnableDebuggingScreen();
713 void GaiaScreenHandler::MaybePreloadAuthExtension() {
714 VLOG(1) << "MaybePreloadAuthExtension() call.";
716 // If cookies clearing was initiated or |dns_clear_task_running_| then auth
717 // extension showing has already been initiated and preloading is senseless.
718 if (signin_screen_handler_
->ShouldLoadGaia() &&
719 !gaia_silent_load_
&&
721 !dns_clear_task_running_
&&
722 network_state_informer_
->state() == NetworkStateInformer::ONLINE
) {
723 gaia_silent_load_
= true;
724 gaia_silent_load_network_
= network_state_informer_
->network_path();
725 LoadAuthExtension(true, true, false);
729 void GaiaScreenHandler::LoadAuthExtension(bool force
,
733 context
.force_reload
= force
;
734 context
.is_local
= offline
;
735 context
.password_changed
= !populated_email_
.empty() &&
736 password_changed_for_
.count(populated_email_
);
737 context
.use_offline
= offline
;
738 context
.email
= populated_email_
;
739 context
.is_enrolling_consumer_management
= is_enrolling_consumer_management_
;
741 context
.show_users
= Delegate()->IsShowUsers();
742 context
.has_users
= !Delegate()->GetUsers().empty();
745 context
.embedded_signin_enabled
=
746 base::CommandLine::ForCurrentProcess()->HasSwitch(
747 chromeos::switches::kEnableEmbeddedSignin
) ||
748 embedded_signin_enabled_by_shortcut_
;
750 populated_email_
.clear();
755 void GaiaScreenHandler::UpdateState(NetworkError::ErrorReason reason
) {
756 if (signin_screen_handler_
)
757 signin_screen_handler_
->UpdateState(reason
);
760 SigninScreenHandlerDelegate
* GaiaScreenHandler::Delegate() {
761 DCHECK(signin_screen_handler_
);
762 return signin_screen_handler_
->delegate_
;
765 void GaiaScreenHandler::SetSigninScreenHandler(SigninScreenHandler
* handler
) {
766 signin_screen_handler_
= handler
;
768 } // namespace chromeos