signin_screen_handler.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/debug/trace_event.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/browser_process_platform_part_chromeos.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_settings.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/hwid_checker.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/login_display_host_impl.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/screen_locker.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/user.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/webui_login_display.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/net/network_portal_detector.h"
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/native_window_delegate.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/power_manager_client.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/xkeyboard.h"
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state.h"
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_state_handler.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_switches.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chromium_strings.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// User dictionary keys.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyUsername[] = "username";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyDisplayName[] = "displayName";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyEmailAddress[] = "emailAddress";
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kKeyEnterpriseDomain[] = "enterpriseDomain";
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kKeyPublicAccount[] = "publicAccount";
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kKeyLocallyManagedUser[] = "locallyManagedUser";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeySignedIn[] = "signedIn";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyCanRemove[] = "canRemove";
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kKeyIsOwner[] = "isOwner";
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kKeyOauthTokenStatus[] = "oauthTokenStatus";
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Max number of users to show.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxUsers = 18;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Timeout to delay first notification about offline state for a
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// current network.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kOfflineTimeoutSec = 5;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Timeout used to prevent infinite connecting to a flaky network.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kConnectingTimeoutSec = 60;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Type of the login screen UI that is currently presented to user.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSourceGaiaSignin[] = "gaia-signin";
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSourceAccountPicker[] = "account-picker";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Task posted to PostTaskAndReply in StartClearingDnsCache on the IO
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClearDnsCache(IOThread* io_thread) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_shutdown::IsTryingToQuit())
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io_thread->ClearHostCache();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kNetworkStateOffline[] = "offline";
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kNetworkStateOnline[] = "online";
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kNetworkStateCaptivePortal[] = "behind captive portal";
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kNetworkStateConnecting[] = "connecting";
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kNetworkStateProxyAuthRequired[] = "proxy auth required";
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonProxyAuthCancelled[] = "proxy auth cancelled";
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonProxyAuthSupplied[] = "proxy auth supplied";
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonProxyConnectionFailed[] = "proxy connection failed";
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonProxyConfigChanged[] = "proxy config changed";
122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonLoadingTimeout[] = "loading timeout";
123a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonPortalDetected[] = "portal detected";
124a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonNetworkStateChanged[] = "network state changed";
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonUpdate[] = "update";
126a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char kErrorReasonFrameError[] = "frame error";
127a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char* NetworkStateStatusString(NetworkStateInformer::State state) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (state) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkStateInformer::OFFLINE:
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kNetworkStateOffline;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkStateInformer::ONLINE:
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kNetworkStateOnline;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkStateInformer::CAPTIVE_PORTAL:
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kNetworkStateCaptivePortal;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkStateInformer::CONNECTING:
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kNetworkStateConnecting;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkStateInformer::PROXY_AUTH_REQUIRED:
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return kNetworkStateProxyAuthRequired;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return NULL;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)const char* ErrorReasonString(ErrorScreenActor::ErrorReason reason) {
147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  switch (reason) {
148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED:
149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonProxyAuthCancelled;
150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_PROXY_AUTH_SUPPLIED:
151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonProxyAuthSupplied;
152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED:
153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonProxyConnectionFailed;
154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED:
155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonProxyConfigChanged;
156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT:
157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonLoadingTimeout;
158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED:
159a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonPortalDetected;
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED:
161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonNetworkStateChanged;
162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_UPDATE:
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonUpdate;
164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    case ErrorScreenActor::ERROR_REASON_FRAME_ERROR:
165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return kErrorReasonFrameError;
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    default:
167a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      NOTREACHED();
168a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return NULL;
169a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
171a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Updates params dictionary passed to the auth extension with related
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preferences from CrosSettings.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UpdateAuthParamsFromSettings(DictionaryValue* params,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const CrosSettings* cros_settings) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_new_user = true;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_guest = true;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowGuest, &allow_guest);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Account creation depends on Guest sign-in (http://crosbug.com/24570).
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->SetBoolean("createAccount", allow_new_user && allow_guest);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params->SetBoolean("guestSignin", allow_guest);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool IsOnline(NetworkStateInformer::State state,
186a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              ErrorScreenActor::ErrorReason reason) {
187a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return state == NetworkStateInformer::ONLINE &&
188a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason != ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED &&
189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason != ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool IsUnderCaptivePortal(NetworkStateInformer::State state,
193a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                          ErrorScreenActor::ErrorReason reason) {
194a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return state == NetworkStateInformer::CAPTIVE_PORTAL ||
195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason == ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED;
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsProxyError(NetworkStateInformer::State state,
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                  ErrorScreenActor::ErrorReason reason,
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                  net::Error frame_error) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return state == NetworkStateInformer::PROXY_AUTH_REQUIRED ||
202a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason == ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED ||
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      reason == ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED ||
204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR &&
205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       (frame_error == net::ERR_PROXY_CONNECTION_FAILED ||
206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        frame_error == net::ERR_TUNNEL_CONNECTION_FAILED));
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsSigninScreen(const OobeUI::Screen screen) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return screen == OobeUI::SCREEN_GAIA_SIGNIN ||
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      screen == OobeUI::SCREEN_ACCOUNT_PICKER;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsSigninScreenError(ErrorScreen::ErrorState error_state) {
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return error_state == ErrorScreen::ERROR_STATE_PORTAL ||
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_state == ErrorScreen::ERROR_STATE_OFFLINE ||
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_state == ErrorScreen::ERROR_STATE_PROXY ||
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_state == ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns network name by service path.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetNetworkName(const std::string& service_path) {
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNetworkState(service_path);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return network->name();
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns network unique id by service path.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetNetworkUniqueId(const std::string& service_path) {
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNetworkState(service_path);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return network->guid();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns captive portal state for a network by its service path.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkPortalDetector::CaptivePortalState GetCaptivePortalState(
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& service_path) {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkPortalDetector* detector = NetworkPortalDetector::GetInstance();
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNetworkState(service_path);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!detector || !network)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NetworkPortalDetector::CaptivePortalState();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return detector->GetCaptivePortalState(network);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RecordDiscrepancyWithShill(
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const NetworkState* network,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NetworkPortalDetector::CaptivePortalStatus status) {
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (network->connection_state() == flimflam::kStateOnline) {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION(
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "CaptivePortal.OOBE.DiscrepancyWithShill_Online",
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status,
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT);
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  } else if (network->connection_state() == flimflam::kStatePortal) {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION(
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "CaptivePortal.OOBE.DiscrepancyWithShill_RestrictedPool",
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION(
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "CaptivePortal.OOBE.DiscrepancyWithShill_Offline",
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        status,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Record state and descripancies with shill (e.g. shill thinks that
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// network is online but NetworkPortalDetector claims that it's behind
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// portal) for the network identified by |service_path|.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RecordNetworkPortalDetectorStats(const std::string& service_path) {
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNetworkState(service_path);
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!network)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkPortalDetector::CaptivePortalState state =
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCaptivePortalState(service_path);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state.status == NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("CaptivePortal.OOBE.DetectionResult",
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            state.status,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (state.status) {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN:
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE:
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (network->connection_state() == flimflam::kStateOnline ||
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          network->connection_state() == flimflam::kStatePortal)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RecordDiscrepancyWithShill(network, state.status);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE:
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (network->connection_state() != flimflam::kStateOnline)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RecordDiscrepancyWithShill(network, state.status);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL:
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (network->connection_state() != flimflam::kStatePortal)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RecordDiscrepancyWithShill(network, state.status);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED:
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (network->connection_state() != flimflam::kStateOnline)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RecordDiscrepancyWithShill(network, state.status);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT:
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SigninScreenHandler implementation ------------------------------------------
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninScreenHandler::SigninScreenHandler(
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const scoped_refptr<NetworkStateInformer>& network_state_informer,
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ErrorScreenActor* error_screen_actor)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ui_state_(UI_STATE_UNKNOWN),
323a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      frame_state_(FRAME_STATE_UNKNOWN),
324a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      frame_error_(net::OK),
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delegate_(NULL),
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_window_delegate_(NULL),
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_on_init_(false),
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      oobe_ui_(false),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      focus_stolen_(false),
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gaia_silent_load_(false),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_account_picker_showing_first_time_(false),
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dns_cleared_(false),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dns_clear_task_running_(false),
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookies_cleared_(false),
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_state_informer_(network_state_informer),
336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      test_expects_complete_login_(false),
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this),
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webui_visible_(false),
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      preferences_changed_delayed_(false),
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      error_screen_actor_(error_screen_actor),
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_first_update_state_call_(true),
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offline_login_active_(false),
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_network_state_(NetworkStateInformer::UNKNOWN),
344ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      has_pending_auth_ui_(false) {
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(network_state_informer_.get());
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(error_screen_actor_);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_informer_->AddObserver(this);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings::Get()->AddSettingsObserver(kAccountsPrefAllowNewUser, this);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings::Get()->AddSettingsObserver(kAccountsPrefAllowGuest, this);
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_AUTH_NEEDED,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_AUTH_SUPPLIED,
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_AUTH_CANCELLED,
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninScreenHandler::~SigninScreenHandler() {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  weak_factory_.InvalidateWeakPtrs();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemKeyEventListener* key_event_listener =
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SystemKeyEventListener::GetInstance();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key_event_listener)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    key_event_listener->RemoveCapsLockObserver(this);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SetWebUIHandler(NULL);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  network_state_informer_->RemoveObserver(this);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings::Get()->RemoveSettingsObserver(kAccountsPrefAllowNewUser, this);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings::Get()->RemoveSettingsObserver(kAccountsPrefAllowGuest, this);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::DeclareLocalizedValues(
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LocalizedValuesBuilder* builder) {
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signinScreenTitle", IDS_SIGNIN_SCREEN_TITLE);
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signinScreenPasswordChanged",
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_SIGNIN_SCREEN_PASSWORD_CHANGED);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordHint", IDS_LOGIN_POD_EMPTY_PASSWORD_TEXT);
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("podMenuButtonAccessibleName",
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_POD_MENU_BUTTON_ACCESSIBLE_NAME);
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("podMenuRemoveItemAccessibleName",
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_POD_MENU_REMOVE_ITEM_ACCESSIBLE_NAME);
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordFieldAccessibleName",
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME);
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signedIn", IDS_SCREEN_LOCK_ACTIVE_USER);
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signinButton", IDS_LOGIN_BUTTON);
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("shutDown", IDS_SHUTDOWN_BUTTON);
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("addUser", IDS_ADD_USER_BUTTON);
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  builder->Add("cancelUserAdding", IDS_CANCEL_USER_ADDING);
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("browseAsGuest", IDS_GO_INCOGNITO_BUTTON);
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("cancel", IDS_CANCEL);
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("signOutUser", IDS_SCREEN_LOCK_SIGN_OUT);
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("createAccount", IDS_CREATE_ACCOUNT_HTML);
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("guestSignin", IDS_BROWSE_WITHOUT_SIGNING_IN_HTML);
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("createLocallyManagedUser",
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_CREATE_LOCALLY_MANAGED_USER_HTML);
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("createManagedUserFeatureName",
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_CREATE_LOCALLY_MANAGED_USER_FEATURE_NAME);
40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  builder->Add("createManagedUserNoManagerText",
40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               IDS_CREATE_LOCALLY_MANAGED_USER_NO_MANAGER_TEXT);
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("offlineLogin", IDS_OFFLINE_LOGIN_HTML);
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("ownerUserPattern", IDS_LOGIN_POD_OWNER_USER);
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("removeUser", IDS_LOGIN_POD_REMOVE_USER);
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("errorTpmFailureTitle", IDS_LOGIN_ERROR_TPM_FAILURE_TITLE);
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("errorTpmFailureReboot", IDS_LOGIN_ERROR_TPM_FAILURE_REBOOT);
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("errorTpmFailureRebootButton",
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_ERROR_TPM_FAILURE_REBOOT_BUTTON);
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add(
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "disabledAddUserTooltip",
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      g_browser_process->browser_policy_connector()->IsEnterpriseManaged() ?
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          IDS_DISABLED_ADD_USER_TOOLTIP_ENTERPRISE :
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          IDS_DISABLED_ADD_USER_TOOLTIP);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Strings used by password changed dialog.
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedTitle", IDS_LOGIN_PASSWORD_CHANGED_TITLE);
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedDesc", IDS_LOGIN_PASSWORD_CHANGED_DESC);
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->AddF("passwordChangedMoreInfo",
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                IDS_LOGIN_PASSWORD_CHANGED_MORE_INFO,
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                IDS_SHORT_PRODUCT_OS_NAME);
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oldPasswordHint", IDS_LOGIN_PASSWORD_CHANGED_OLD_PASSWORD_HINT);
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oldPasswordIncorrect",
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_INCORRECT_OLD_PASSWORD);
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedCantRemember",
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_CANT_REMEMBER);
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedBackButton",
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_BACK_BUTTON);
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedsOkButton", IDS_OK);
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("passwordChangedProceedAnyway",
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_PROCEED_ANYWAY);
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("proceedAnywayButton",
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PASSWORD_CHANGED_PROCEED_ANYWAY_BUTTON);
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountInfoFormat", IDS_LOGIN_PUBLIC_ACCOUNT_INFO_FORMAT);
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountReminder",
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PUBLIC_ACCOUNT_SIGNOUT_REMINDER);
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountEnter", IDS_LOGIN_PUBLIC_ACCOUNT_ENTER);
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("publicAccountEnterAccessibleName",
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_LOGIN_PUBLIC_ACCOUNT_ENTER_ACCESSIBLE_NAME);
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  builder->AddF("removeManagedUserWarningText",
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               IDS_USER_IS_LOCALLY_MANAGED_REMOVE_WARNING,
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch               UTF8ToUTF16(chrome::kSupervisedUserManagementDisplayURL));
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  builder->Add("removeManagedUserWarningButtonTitle",
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               IDS_USER_IS_LOCALLY_MANAGED_REMOVE_WARNING_BUTTON);
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (chromeos::KioskModeSettings::Get()->IsKioskModeEnabled())
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    builder->Add("demoLoginMessage", IDS_KIOSK_MODE_LOGIN_MESSAGE);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::Show(bool oobe_ui) {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(delegate_);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oobe_ui_ = oobe_ui;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_is_ready()) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = true;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (oobe_ui) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shows new user sign-in for OOBE.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HandleShowAddUser(NULL);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Populates account picker. Animation is turned off for now until we
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // figure out how to make it fast enough.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendUserList(false);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset Caps Lock state when login screen is shown.
468a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    input_method::InputMethodManager::Get()->GetXKeyboard()->
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SetCapsLockEnabled(false);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue params;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.SetBoolean("disableAddUser", AllWhitelistedUsersPresent());
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateUIState(UI_STATE_ACCOUNT_PICKER, &params);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowRetailModeLoginSpinner() {
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("showLoginSpinner");
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::SetDelegate(SigninScreenHandlerDelegate* delegate) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SetWebUIHandler(this);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::SetNativeWindowDelegate(
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeWindowDelegate* native_window_delegate) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_window_delegate_ = native_window_delegate;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnNetworkReady() {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePreloadAuthExtension();
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::UpdateState(NetworkStateInformer::State state,
497a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                      ErrorScreenActor::ErrorReason reason) {
498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  UpdateStateInternal(state, reason, false);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SigninScreenHandler, private: -----------------------------------------------
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::UpdateUIState(UIState ui_state,
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        DictionaryValue* params) {
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (ui_state) {
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case UI_STATE_GAIA_SIGNIN:
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_state_ = UI_STATE_GAIA_SIGNIN;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowScreen(OobeUI::kScreenGaiaSignin, params);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case UI_STATE_ACCOUNT_PICKER:
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_state_ = UI_STATE_ACCOUNT_PICKER;
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShowScreen(OobeUI::kScreenAccountPicker, params);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO (ygorshenin@): split this method into small parts.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::UpdateStateInternal(
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkStateInformer::State state,
523a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ErrorScreenActor::ErrorReason reason,
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool force_update) {
525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Do nothing once user has signed in or sign in is in progress.
526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // TODO(ygorshenin): We will end up here when processing network state
527a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // notification but no ShowSigninScreen() was called so delegate_ will be
528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // NULL. Network state processing logic does not belong here.
529a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (delegate_ &&
530a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      (delegate_->IsUserSigninCompleted() || delegate_->IsSigninInProgress())) {
531a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
533a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::string service_path =
535a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      network_state_informer_->last_network_service_path();
536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::string network_id =
537a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetNetworkUniqueId(service_path);
538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Skip "update" notification about OFFLINE state from
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NetworkStateInformer if previous notification already was
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delayed.
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state == NetworkStateInformer::OFFLINE &&
543a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      reason == ErrorScreenActor::ERROR_REASON_UPDATE &&
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !update_state_closure_.IsCancelled()) {
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO (ygorshenin@): switch log level to INFO once signin screen
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will be tested well.
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOG(WARNING) << "SigninScreenHandler::UpdateStateInternal(): "
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << "state=" << NetworkStateStatusString(state) << ", "
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << "network_id=" << network_id << ", "
553a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               << "reason=" << ErrorReasonString(reason) << ", "
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               << "force_update=" << force_update;
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_state_closure_.Cancel();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delay UpdateStateInternal() call in the following cases:
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 1. this is the first call and it's about offline state of the
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //    current network. This can happen because device is just powered
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //    up and network stack isn't ready now.
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 2. proxy auth ui is displayed. UpdateStateCall() is delayed to
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //    prevent screen change behind proxy auth ui.
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((state == NetworkStateInformer::OFFLINE && is_first_update_state_call_) ||
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_first_update_state_call_ = false;
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    update_state_closure_.Reset(
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &SigninScreenHandler::UpdateStateInternal,
569a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            weak_factory_.GetWeakPtr(), state, reason, force_update));
57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FROM_HERE,
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        update_state_closure_.callback(),
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromSeconds(kOfflineTimeoutSec));
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_first_update_state_call_ = false;
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't show or hide error screen if we're in connecting state.
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state == NetworkStateInformer::CONNECTING && !force_update) {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (connecting_closure_.IsCancelled()) {
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // First notification about CONNECTING state.
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      connecting_closure_.Reset(
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(&SigninScreenHandler::UpdateStateInternal,
584a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                     weak_factory_.GetWeakPtr(), state, reason, true));
58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->PostDelayedTask(
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          FROM_HERE,
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          connecting_closure_.callback(),
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::TimeDelta::FromSeconds(kConnectingTimeoutSec));
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  connecting_closure_.Cancel();
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
594a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_online = IsOnline(state, reason);
595a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_under_captive_portal = IsUnderCaptivePortal(state, reason);
596a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_loading_timeout =
597a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      (reason == ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT);
598a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_error = frame_error_ != net::OK &&
599a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      frame_error_ != net::ERR_NETWORK_CHANGED;
600a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_signin = IsGaiaVisible() || IsGaiaHiddenByError();
601a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool error_screen_should_overlay =
602a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      !offline_login_active_ && IsGaiaVisible();
603a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool from_not_online_to_online_transition =
604a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      is_online && last_network_state_ != NetworkStateInformer::ONLINE;
605a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  last_network_state_ = state;
606a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
607a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (is_online || !is_under_captive_portal)
608a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    error_screen_actor_->HideCaptivePortal();
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
610a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Hide offline message (if needed) and return if current screen is
611a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // not a Gaia frame.
612a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (!is_gaia_signin) {
613a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (!IsSigninScreenHiddenByError())
614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      HideOfflineMessage(state, reason);
615a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
616a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Reload frame if network state is changed from {!ONLINE} -> ONLINE state.
619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (reason == ErrorScreenActor::ERROR_REASON_NETWORK_STATE_CHANGED &&
620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      from_not_online_to_online_transition) {
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Schedules a immediate retry.
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(WARNING) << "Retry page load since network has been changed.";
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReloadGaiaScreen();
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
626a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (reason == ErrorScreenActor::ERROR_REASON_PROXY_CONFIG_CHANGED &&
627a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      error_screen_should_overlay) {
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Schedules a immediate retry.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(WARNING) << "Retry page load since proxy settings has been changed.";
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReloadGaiaScreen();
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR &&
634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      !IsProxyError(state, reason, frame_error_)) {
635a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LOG(WARNING) << "Retry page load due to reason: "
636a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                 << ErrorReasonString(reason);
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReloadGaiaScreen();
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
640a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if ((!is_online || is_gaia_loading_timeout || is_gaia_error) &&
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !offline_login_active_) {
642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    SetupAndShowOfflineMessage(state, reason);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
644a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    HideOfflineMessage(state, reason);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::SetupAndShowOfflineMessage(
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NetworkStateInformer:: State state,
650a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ErrorScreenActor::ErrorReason reason) {
651a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::string service_path =
652a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      network_state_informer_->last_network_service_path();
653a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::string network_id = GetNetworkUniqueId(service_path);
654a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_under_captive_portal = IsUnderCaptivePortal(state, reason);
655ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const bool is_proxy_error = IsProxyError(state, reason, frame_error_);
656a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool is_gaia_loading_timeout =
657a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      (reason == ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT);
658a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
659a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  LOG(WARNING) << "Offline message is displayed";
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Record portal detection stats only if we're going to show or
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // change state of the error screen.
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RecordNetworkPortalDetectorStats(service_path);
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_proxy_error) {
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PROXY,
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string());
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (is_under_captive_portal) {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do not bother a user with obsessive captive portal showing. This
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // check makes captive portal being shown only once: either when error
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // screen is shown for the first time or when switching from another
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // error screen (offline, proxy).
673a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (IsGaiaVisible() ||
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        (error_screen_actor_->error_state() !=
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         ErrorScreen::ERROR_STATE_PORTAL)) {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      error_screen_actor_->FixCaptivePortal();
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
678a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const std::string network_name = GetNetworkName(service_path);
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL,
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       network_name);
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (is_gaia_loading_timeout) {
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT, std::string());
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE,
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string());
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
689a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool guest_signin_allowed = IsGuestSigninAllowed() &&
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IsSigninScreenError(error_screen_actor_->error_state());
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error_screen_actor_->AllowGuestSignin(guest_signin_allowed);
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
693a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const bool offline_login_allowed = IsOfflineLoginAllowed() &&
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IsSigninScreenError(error_screen_actor_->error_state()) &&
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      error_screen_actor_->error_state() !=
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT;
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error_screen_actor_->AllowOfflineLogin(offline_login_allowed);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetCurrentScreen() != OobeUI::SCREEN_ERROR_MESSAGE) {
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DictionaryValue params;
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string connection_type =
702a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        network_state_informer_->last_network_type();
70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    params.SetString("lastNetworkType", connection_type);
704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_SIGNIN);
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    error_screen_actor_->Show(OobeUI::SCREEN_GAIA_SIGNIN, &params);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
709a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void SigninScreenHandler::HideOfflineMessage(
710a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    NetworkStateInformer::State state,
711a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ErrorScreenActor::ErrorReason reason) {
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!IsSigninScreenHiddenByError())
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
714a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
715a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  LOG(WARNING) << "Offline message is hidden";
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  error_screen_actor_->Hide();
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Forces a reload for Gaia screen on hiding error message.
719a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (IsGaiaVisible() || IsGaiaHiddenByError())
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReloadGaiaScreen();
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ReloadGaiaScreen() {
724a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (frame_state_ == FRAME_STATE_LOADING)
725a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return;
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetworkStateInformer::State state = network_state_informer_->state();
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (state != NetworkStateInformer::ONLINE) {
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOG(WARNING) << "Skipping reload of auth extension frame since "
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 << "network state=" << NetworkStateStatusString(state);
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LOG(WARNING) << "Reload auth extension frame.";
733a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  frame_state_ = FRAME_STATE_LOADING;
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("login.GaiaSigninScreen.doReload");
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::Initialize() {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If delegate_ is NULL here (e.g. WebUIScreenLocker has been destroyed),
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // don't do anything, just return.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register for Caps Lock state change notifications;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SystemKeyEventListener* key_event_listener =
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SystemKeyEventListener::GetInstance();
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (key_event_listener)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    key_event_listener->AddCapsLockObserver(this);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show_on_init_) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = false;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Show(oobe_ui_);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow SigninScreenHandler::GetNativeWindow() {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_window_delegate_)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return native_window_delegate_->GetNativeWindow();
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::RegisterMessages() {
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("authenticateUser", &SigninScreenHandler::HandleAuthenticateUser);
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("completeLogin", &SigninScreenHandler::HandleCompleteLogin);
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("completeAuthentication",
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleCompleteAuthentication);
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("getUsers", &SigninScreenHandler::HandleGetUsers);
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("launchDemoUser", &SigninScreenHandler::HandleLaunchDemoUser);
768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("launchIncognito", &SigninScreenHandler::HandleLaunchIncognito);
769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("showLocallyManagedUserCreationScreen",
770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleShowLocallyManagedUserCreationScreen);
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("launchPublicAccount",
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleLaunchPublicAccount);
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddRawCallback("offlineLogin", &SigninScreenHandler::HandleOfflineLogin);
774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("rebootSystem", &SigninScreenHandler::HandleRebootSystem);
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddRawCallback("showAddUser", &SigninScreenHandler::HandleShowAddUser);
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("shutdownSystem", &SigninScreenHandler::HandleShutdownSystem);
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loadWallpaper", &SigninScreenHandler::HandleLoadWallpaper);
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("removeUser", &SigninScreenHandler::HandleRemoveUser);
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("toggleEnrollmentScreen",
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleToggleEnrollmentScreen);
7817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddCallback("toggleKioskEnableScreen",
7827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              &SigninScreenHandler::HandleToggleKioskEnableScreen);
783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("toggleResetScreen",
784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleToggleResetScreen);
785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("launchHelpApp", &SigninScreenHandler::HandleLaunchHelpApp);
786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("createAccount", &SigninScreenHandler::HandleCreateAccount);
787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("accountPickerReady",
788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleAccountPickerReady);
789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("wallpaperReady", &SigninScreenHandler::HandleWallpaperReady);
790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loginWebuiReady", &SigninScreenHandler::HandleLoginWebuiReady);
791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("demoWebuiReady", &SigninScreenHandler::HandleDemoWebuiReady);
792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("signOutUser", &SigninScreenHandler::HandleSignOutUser);
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("userImagesLoaded", &SigninScreenHandler::HandleUserImagesLoaded);
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("networkErrorShown",
795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleNetworkErrorShown);
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("openProxySettings",
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleOpenProxySettings);
798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loginVisible", &SigninScreenHandler::HandleLoginVisible);
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("cancelPasswordChangedFlow",
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleCancelPasswordChangedFlow);
801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddCallback("cancelUserAdding",
802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              &SigninScreenHandler::HandleCancelUserAdding);
803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("migrateUserData", &SigninScreenHandler::HandleMigrateUserData);
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("resyncUserData", &SigninScreenHandler::HandleResyncUserData);
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("loginUIStateChanged",
806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleLoginUIStateChanged);
807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("unlockOnLoginSuccess",
808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleUnlockOnLoginSuccess);
809a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  AddCallback("frameLoadingCompleted",
810a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              &SigninScreenHandler::HandleFrameLoadingCompleted);
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("showLoadingTimeoutError",
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleShowLoadingTimeoutError);
813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("updateOfflineLogin",
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &SigninScreenHandler::HandleUpdateOfflineLogin);
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleGetUsers() {
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendUserList(false);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ClearAndEnablePassword() {
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.resetSigninUI", false);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ClearUserPodPassword() {
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.clearUserPodPassword");
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SigninScreenHandler::RefocusCurrentPod() {
83090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CallJS("cr.ui.Oobe.refocusCurrentPod");
83190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
83290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnLoginSuccess(const std::string& username) {
834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.onLoginSuccess", username);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnUserRemoved(const std::string& username) {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendUserList(false);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnUserImageChanged(const User& user) {
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (page_is_ready())
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CallJS("login.AccountPickerScreen.updateUserImage", user.email());
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnPreferencesChanged() {
84790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Make sure that one of the login UI is fully functional now, otherwise
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preferences update would be picked up next time it will be shown.
84990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!webui_visible_) {
85090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LOG(WARNING) << "Login UI is not active - postponed prefs change.";
85190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    preferences_changed_delayed_ = true;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && !delegate_->IsShowUsers()) {
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HandleShowAddUser(NULL);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SendUserList(false);
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateUIState(UI_STATE_ACCOUNT_PICKER, NULL);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
86190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  preferences_changed_delayed_ = false;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ResetSigninScreenHandlerDelegate() {
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDelegate(NULL);
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowError(int login_attempts,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& error_text,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& help_link_text,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    HelpAppLauncher::HelpTopic help_topic_id) {
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.showSignInError", login_attempts, error_text,
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         help_link_text, static_cast<int>(help_topic_id));
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowErrorScreen(LoginDisplay::SigninError error_id) {
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (error_id) {
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LoginDisplay::TPM_ERROR:
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CallJS("cr.ui.Oobe.showTpmError");
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unknown sign in error";
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowSigninUI(const std::string& email) {
888c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.showSigninUI", email);
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowGaiaPasswordChanged(const std::string& username) {
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_ = username;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_changed_for_.insert(email_);
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.showSigninUI", email_);
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("login.AccountPickerScreen.updateUserGaiaNeeded", email_);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowPasswordChangedDialog(bool show_password_error) {
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.Oobe.showPasswordChangedScreen", show_password_error);
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::ShowSigninScreenForCreds(
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& username,
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& password) {
905eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VLOG(2) << "ShowSigninScreenForCreds  for user " << username
906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          << ", frame_state=" << frame_state_;
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_user_ = username;
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_pass_ = password;
910eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  test_expects_complete_login_ = true;
911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Submit login form for test if gaia is ready. If gaia is loading, login
913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // will be attempted in HandleLoginWebuiReady after gaia is ready. Otherwise,
914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // reload gaia then follow the loading case.
915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (frame_state_ == FRAME_STATE_LOADED)
916eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SubmitLoginFormForTest();
917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else if (frame_state_ != FRAME_STATE_LOADING)
918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    HandleShowAddUser(NULL);
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
921b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void SigninScreenHandler::OnCookiesCleared(base::Closure on_clear_callback) {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookies_cleared_ = true;
924b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  on_clear_callback.Run();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnCapsLockChange(bool enabled) {
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (page_is_ready())
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CallJS("login.AccountPickerScreen.setCapsLockState", enabled);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::Observe(int type,
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const content::NotificationSource& source,
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const content::NotificationDetails& details) {
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED: {
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateAuthExtension();
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateAddButtonStatus();
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_AUTH_NEEDED: {
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_ = true;
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_AUTH_SUPPLIED:
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_ = false;
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (IsSigninScreenHiddenByError()) {
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Hide error screen and reload auth extension.
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        HideOfflineMessage(network_state_informer_->state(),
950a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                           ErrorScreenActor::ERROR_REASON_PROXY_AUTH_SUPPLIED);
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else if (ui_state_ == UI_STATE_GAIA_SIGNIN) {
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        // Reload auth extension as proxy credentials are supplied.
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ReloadGaiaScreen();
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_AUTH_CANCELLED: {
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Don't reload auth extension if proxy auth dialog was cancelled.
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      has_pending_auth_ui_ = false;
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED() << "Unexpected notification " << type;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::OnDnsCleared() {
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dns_clear_task_running_ = false;
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dns_cleared_ = true;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowSigninScreenIfReady();
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::ShowSigninScreenIfReady() {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dns_cleared_ || !cookies_cleared_ || !delegate_)
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string active_network =
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      network_state_informer_->active_network_service_path();
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gaia_silent_load_ &&
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (!network_state_informer_->is_online() ||
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       gaia_silent_load_network_ != active_network)) {
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Network has changed. Force Gaia reload.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gaia_silent_load_ = false;
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gaia page will be realoded, so focus isn't stolen anymore.
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focus_stolen_ = false;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that LoadAuthExtension clears |email_|.
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (email_.empty())
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LoadSigninWallpaper();
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LoadWallpaper(email_);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadAuthExtension(!gaia_silent_load_, false, false);
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gaia_silent_load_) {
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The variable is assigned to false because silently loaded Gaia page was
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // used.
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gaia_silent_load_ = false;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (focus_stolen_)
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      HandleLoginWebuiReady();
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateState(network_state_informer_->state(),
1006a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              ErrorScreenActor::ERROR_REASON_UPDATE);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
101090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void SigninScreenHandler::UpdateAuthParams(DictionaryValue* params) {
1011eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!delegate_)
1012eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
1013eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
101490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateAuthParamsFromSettings(params, CrosSettings::Get());
101590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1016eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Allow locally managed user creation only if:
101790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // 1. Enterprise managed device > is allowed by policy.
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // 2. Consumer device > owner exists.
1019ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // 3. New users are allowed by owner.
1020ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1021ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CrosSettings* cros_settings = CrosSettings::Get();
1022ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool allow_new_user = false;
1023ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
1024ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1025eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool managed_users_allowed =
1026eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UserManager::Get()->AreLocallyManagedUsersAllowed();
102790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool managed_users_can_create = false;
1028ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (managed_users_allowed) {
1029ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    managed_users_can_create =
1030ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        (delegate_->GetUsers().size() > 0) && allow_new_user;
1031ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  params->SetBoolean("managedUsersEnabled", managed_users_allowed);
103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params->SetBoolean("managedUsersCanCreate", managed_users_can_create);
103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::LoadAuthExtension(
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool force, bool silent_load, bool offline) {
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue params;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.SetBoolean("forceReload", force);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.SetBoolean("silentLoad", silent_load);
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.SetBoolean("isLocal", offline);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.SetBoolean("passwordChanged",
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    !email_.empty() && password_changed_for_.count(email_));
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.SetBoolean("isShowUsers", delegate_->IsShowUsers());
1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params.SetBoolean("useOffline", offline);
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.SetString("email", email_);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_.clear();
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateAuthParams(&params);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!offline) {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string app_locale = g_browser_process->GetApplicationLocale();
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!app_locale.empty())
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.SetString("hl", app_locale);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue *localized_strings = new base::DictionaryValue();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_strings->SetString("stringEmail",
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMAIL));
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_strings->SetString("stringPassword",
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_PASSWORD));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_strings->SetString("stringSignIn",
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_SIGNIN));
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    localized_strings->SetString("stringEmptyEmail",
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMPTY_EMAIL));
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    localized_strings->SetString("stringEmptyPassword",
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_EMPTY_PASSWORD));
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localized_strings->SetString("stringError",
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LOGIN_OFFLINE_ERROR));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.Set("localizedStrings", localized_strings);
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const GURL gaia_url =
10757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(::switches::kGaiaUrl) ?
10767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          GURL(CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
10777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    ::switches::kGaiaUrl)) :
10787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          GaiaUrls::GetInstance()->gaia_url();
107990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  params.SetString("gaiaUrl", gaia_url.spec());
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  frame_state_ = FRAME_STATE_LOADING;
1082c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("login.GaiaSigninScreen.loadAuthExtension", params);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::UpdateAuthExtension() {
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryValue params;
108790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateAuthParams(&params);
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("login.GaiaSigninScreen.updateAuthExtension", params);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::UpdateAddButtonStatus() {
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("cr.ui.login.DisplayManager.updateAddUserButtonStatus",
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         AllWhitelistedUsersPresent());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1096c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleCompleteLogin(const std::string& typed_email,
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                              const std::string& password) {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string sanitized_email = gaia::SanitizeEmail(typed_email);
1101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->SetDisplayEmail(sanitized_email);
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->CompleteLogin(UserContext(sanitized_email,
1103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       password,
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string()));  // auth_code
1105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (test_expects_complete_login_) {
1107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    VLOG(2) << "Complete test login for " << typed_email
1108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            << ", requested=" << test_user_;
1109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    test_expects_complete_login_ = false;
1111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    test_user_.clear();
1112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    test_pass_.clear();
1113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::HandleCompleteAuthentication(
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& email,
1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& password,
1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& auth_code) {
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!delegate_)
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string sanitized_email = gaia::SanitizeEmail(email);
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->SetDisplayEmail(sanitized_email);
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->CompleteLogin(UserContext(sanitized_email, password, auth_code));
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleAuthenticateUser(const std::string& username,
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                 const std::string& password) {
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delegate_->Login(UserContext(gaia::SanitizeEmail(username),
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               password,
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               std::string()));  // auth_code
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLaunchDemoUser() {
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->LoginAsRetailModeUser();
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLaunchIncognito() {
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->LoginAsGuest();
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleShowLocallyManagedUserCreationScreen() {
1147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!UserManager::Get()->AreLocallyManagedUsersAllowed()) {
1148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    LOG(ERROR) << "Managed users not allowed.";
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<DictionaryValue> params(new DictionaryValue());
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      StartWizard(WizardController::kLocallyManagedUserCreationScreenName,
1154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      params.Pass());
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::HandleLaunchPublicAccount(
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& username) {
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    delegate_->LoginAsPublicAccount(username);
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::HandleOfflineLogin(const base::ListValue* args) {
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_ || delegate_->IsShowUsers()) {
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &email_))
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    email_.clear();
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load auth extension. Parameters are: force reload, do not load extension in
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // background, use offline version.
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadAuthExtension(true, false, true);
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateUIState(UI_STATE_GAIA_SIGNIN, NULL);
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleShutdownSystem() {
1177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ash::Shell::GetInstance()->lock_state_controller()->RequestShutdown();
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoadWallpaper(const std::string& email) {
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    delegate_->LoadWallpaper(email);
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleRebootSystem() {
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleRemoveUser(const std::string& email) {
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_->RemoveUser(email);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateAddButtonStatus();
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::HandleShowAddUser(const base::ListValue* args) {
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_.clear();
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |args| can be null if it's OOBE.
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args->GetString(0, &email_);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_account_picker_showing_first_time_ = false;
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (gaia_silent_load_ && email_.empty()) {
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dns_cleared_ = true;
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookies_cleared_ = true;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowSigninScreenIfReady();
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    StartClearingDnsCache();
1209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    StartClearingCookies(base::Bind(
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &SigninScreenHandler::ShowSigninScreenIfReady,
1211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        weak_factory_.GetWeakPtr()));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleToggleEnrollmentScreen() {
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowEnterpriseEnrollmentScreen();
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void SigninScreenHandler::HandleToggleKioskEnableScreen() {
12217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (delegate_ &&
12227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) {
12237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    delegate_->ShowKioskEnableScreen();
12247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
12257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
12267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleToggleResetScreen() {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ &&
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) {
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowResetScreen();
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SigninScreenHandler::HandleToggleKioskAutolaunchScreen() {
1235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_ &&
1236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) {
1237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->ShowKioskAutolaunchScreen();
1238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLaunchHelpApp(double help_topic_id) {
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!help_app_.get())
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    help_app_ = new HelpAppLauncher(GetNativeWindow());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  help_app_->ShowHelpTopic(
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<HelpAppLauncher::HelpTopic>(help_topic_id));
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::FillUserDictionary(User* user,
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             bool is_owner,
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             DictionaryValue* user_dict) {
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& email = user->email();
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_public_account =
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT;
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool is_locally_managed_user =
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user->GetType() == User::USER_TYPE_LOCALLY_MANAGED;
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetString(kKeyUsername, email);
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetString(kKeyEmailAddress, user->display_email());
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetString(kKeyDisplayName, user->GetDisplayName());
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetBoolean(kKeyPublicAccount, is_public_account);
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetBoolean(kKeyLocallyManagedUser, is_locally_managed_user);
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetInteger(kKeyOauthTokenStatus, user->oauth_token_status());
1265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  user_dict->SetBoolean(kKeySignedIn, user->is_logged_in());
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_dict->SetBoolean(kKeyIsOwner, is_owner);
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_public_account) {
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy::BrowserPolicyConnector* policy_connector =
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        g_browser_process->browser_policy_connector();
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (policy_connector->IsEnterpriseManaged()) {
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_dict->SetString(kKeyEnterpriseDomain,
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           policy_connector->GetEnterpriseDomain());
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::SendUserList(bool animated) {
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t max_non_owner_users = kMaxUsers - 1;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t non_owner_count = 0;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue users_list;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const UserList& users = delegate_->GetUsers();
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(nkostylev): Show optional intro dialog about multi-profiles feature
1290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // based on user preferences. http://crbug.com/230862
1291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(nkostylev): Move to a separate method in UserManager.
1293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // http://crbug.com/230852
1294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_signin_to_add = LoginDisplayHostImpl::default_host() &&
1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      UserManager::Get()->IsUserLoggedIn();
1296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool single_user = users.size() == 1;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) {
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& email = (*it)->email();
1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string owner;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_owner = (email == owner);
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (non_owner_count < max_non_owner_users || is_owner) {
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* user_dict = new DictionaryValue();
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FillUserDictionary(*it, is_owner, user_dict);
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_public_account =
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT);
1310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      bool signed_in = (*it)->is_logged_in();
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Single user check here is necessary because owner info might not be
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // available when running into login screen on first boot.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // See http://crosbug.com/12723
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_dict->SetBoolean(kKeyCanRemove,
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            !single_user &&
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            !email.empty() &&
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            !is_owner &&
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            !is_public_account &&
1319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            !signed_in &&
1320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            !is_signin_to_add);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      users_list.Append(user_dict);
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!is_owner)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ++non_owner_count;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CallJS("login.AccountPickerScreen.loadUsers", users_list, animated,
1329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         delegate_->IsShowGuest());
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleAccountPickerReady() {
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(INFO) << "Login WebUI >> AccountPickerReady";
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_ && !ScreenLocker::default_screen_locker() &&
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !chromeos::IsMachineHWIDCorrect() &&
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !oobe_ui_) {
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ShowWrongHWIDScreen();
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = g_browser_process->local_state();
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetBoolean(prefs::kFactoryResetRequested)) {
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->SetBoolean(prefs::kFactoryResetRequested, false);
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->CommitPendingWrite();
1346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    HandleToggleResetScreen();
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_account_picker_showing_first_time_ = true;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybePreloadAuthExtension();
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ScreenLocker::default_screen_locker()) {
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_LOCK_WEBUI_READY,
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources(),
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->OnSigninScreenReady();
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleWallpaperReady() {
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ScreenLocker::default_screen_locker()) {
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_LOCK_BACKGROUND_DISPLAYED,
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources(),
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoginWebuiReady() {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focus_stolen_) {
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set focus to the Gaia page.
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(altimofeev): temporary solution, until focus parameters are
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // implemented on the Gaia side.
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do this only once. Any subsequent call would relod GAIA frame.
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focus_stolen_ = false;
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char code[] = "gWindowOnLoad();";
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = web_ui()->GetWebContents()->GetRenderViewHost();
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->ExecuteJavascriptInWebFrame(
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"),
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16(code));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!gaia_silent_load_) {
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_LOGIN_WEBUI_LOADED,
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources(),
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focus_stolen_ = true;
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Prevent focus stealing by the Gaia page.
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(altimofeev): temporary solution, until focus parameters are
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // implemented on the Gaia side.
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char code[] = "var gWindowOnLoad = window.onload; "
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        "window.onload=function() {};";
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = web_ui()->GetWebContents()->GetRenderViewHost();
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->ExecuteJavascriptInWebFrame(
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"),
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASCIIToUTF16(code));
140290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // As we could miss and window.onload could already be called, restore
140390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // focus to current pod (see crbug/175243).
140490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    RefocusCurrentPod();
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1406a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  HandleFrameLoadingCompleted(0);
1407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (test_expects_complete_login_)
1409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SubmitLoginFormForTest();
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleDemoWebuiReady() {
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_DEMO_WEBUI_LOADED,
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources(),
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleSignOutUser() {
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Signout();
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleUserImagesLoaded() {
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_LOGIN_USER_IMAGES_LOADED,
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources(),
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleNetworkErrorShown() {
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_LOGIN_NETWORK_ERROR_SHOWN,
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources(),
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleCreateAccount() {
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->CreateAccount();
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleOpenProxySettings() {
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginDisplayHostImpl::default_host()->OpenProxySettings();
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoginVisible(const std::string& source) {
1448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  LOG(WARNING) << "Login WebUI >> loginVisible, src: " << source << ", "
1449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch               << "webui_visible_: " << webui_visible_;
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!webui_visible_) {
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There might be multiple messages from OOBE UI so send notifications after
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the first one only.
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_LOGIN_WEBUI_VISIBLE,
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources(),
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
1457ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    TRACE_EVENT_ASYNC_END0(
1458ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        "ui", "ShowLoginWebUI", LoginDisplayHostImpl::kShowLoginWebUIid);
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_visible_ = true;
146190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (preferences_changed_delayed_)
146290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    OnPreferencesChanged();
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleCancelPasswordChangedFlow() {
1466b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  StartClearingCookies(base::Bind(
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &SigninScreenHandler::CancelPasswordChangedFlowInternal,
1468b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      weak_factory_.GetWeakPtr()));
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SigninScreenHandler::HandleCancelUserAdding() {
1472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (delegate_)
1473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    delegate_->CancelUserAdding();
1474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleMigrateUserData(
1477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string& old_password) {
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->MigrateUserData(old_password);
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleResyncUserData() {
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_)
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->ResyncUserData();
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleLoginUIStateChanged(const std::string& source,
1488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                    bool new_value) {
148990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LOG(INFO) << "Login WebUI >> active: " << new_value << ", "
149090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            << "source: " << source;
149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1492868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!KioskAppManager::Get()->GetAutoLaunchApp().empty() &&
1493868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      KioskAppManager::Get()->IsAutoLaunchRequested()) {
1494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LOG(INFO) << "Showing auto-launch warning";
1495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    HandleToggleKioskAutolaunchScreen();
1496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
1497868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (source == kSourceGaiaSignin) {
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_state_ = UI_STATE_GAIA_SIGNIN;
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (source == kSourceAccountPicker) {
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_state_ = UI_STATE_ACCOUNT_PICKER;
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleUnlockOnLoginSuccess() {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(UserManager::Get()->IsUserLoggedIn());
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ScreenLocker::default_screen_locker())
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScreenLocker::default_screen_locker()->UnlockOnLoginSuccess();
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void SigninScreenHandler::HandleFrameLoadingCompleted(int status) {
1516ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const net::Error frame_error = static_cast<net::Error>(-status);
1517ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (frame_error == net::ERR_ABORTED) {
1518ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LOG(WARNING) << "Ignore gaia frame error: " << frame_error;
1519ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
1520ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1521ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  frame_error_ = frame_error;
1522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (frame_error == net::OK) {
1523a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LOG(INFO) << "Gaia frame is loaded";
1524a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    frame_state_ = FRAME_STATE_LOADED;
1525a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  } else {
1526a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    LOG(WARNING) << "Gaia frame error: "  << frame_error_;
1527a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    frame_state_ = FRAME_STATE_ERROR;
1528a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
1529868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (network_state_informer_->state() != NetworkStateInformer::ONLINE)
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1532a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (frame_state_ == FRAME_STATE_LOADED) {
1533a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    UpdateState(network_state_informer_->state(),
1534a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                ErrorScreenActor::ERROR_REASON_UPDATE);
1535a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  } else if (frame_state_ == FRAME_STATE_ERROR) {
1536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    UpdateState(network_state_informer_->state(),
1537a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
1538a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  }
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleShowLoadingTimeoutError() {
1542a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  UpdateState(network_state_informer_->state(),
1543a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)              ErrorScreenActor::ERROR_REASON_LOADING_TIMEOUT);
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SigninScreenHandler::HandleUpdateOfflineLogin(bool offline_login_active) {
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  offline_login_active_ = offline_login_active;
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::StartClearingDnsCache() {
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dns_clear_task_running_ || !g_browser_process->io_thread())
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dns_cleared_ = false;
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTaskAndReply(
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ClearDnsCache, g_browser_process->io_thread()),
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&SigninScreenHandler::OnDnsCleared,
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_factory_.GetWeakPtr()));
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dns_clear_task_running_ = true;
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1563b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void SigninScreenHandler::StartClearingCookies(
1564b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const base::Closure& on_clear_callback) {
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookies_cleared_ = false;
1566b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ProfileHelper* profile_helper =
1567b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      g_browser_process->platform_part()->profile_helper();
1568b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  LOG_ASSERT(
1569b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Profile::FromWebUI(web_ui()) == profile_helper->GetSigninProfile());
1570b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  profile_helper->ClearSigninProfile(base::Bind(
1571b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      &SigninScreenHandler::OnCookiesCleared,
1572b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      weak_factory_.GetWeakPtr(), on_clear_callback));
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninScreenHandler::MaybePreloadAuthExtension() {
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetching of the extension is not started before account picker page is
1577b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // loaded because it can affect the loading speed. Also if cookies clearing
1578b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // was initiated or |dns_clear_task_running_| then auth extension showing has
1579b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // already been initiated and preloading is senseless.
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not load the extension for the screen locker, see crosbug.com/25018.
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_account_picker_showing_first_time_ &&
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !gaia_silent_load_ &&
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !ScreenLocker::default_screen_locker() &&
1584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      !cookies_cleared_ &&
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !dns_clear_task_running_ &&
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network_state_informer_->is_online()) {
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gaia_silent_load_ = true;
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gaia_silent_load_network_ =
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        network_state_informer_->active_network_service_path();
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadAuthExtension(true, true, false);
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SigninScreenHandler::AllWhitelistedUsersPresent() {
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_new_user = false;
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (allow_new_user)
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserManager* user_manager = UserManager::Get();
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const UserList& users = user_manager->GetUsers();
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_ || users.size() > kMaxUsers) {
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::ListValue* whitelist = NULL;
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cros_settings->GetList(kAccountsPrefUsers, &whitelist) || !whitelist)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < whitelist->GetSize(); ++i) {
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string whitelisted_user;
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NB: Wildcards in the whitelist are also detected as not present here.
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!whitelist->GetString(i, &whitelisted_user) ||
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !user_manager->IsKnownUser(whitelisted_user)) {
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SigninScreenHandler::CancelPasswordChangedFlowInternal() {
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_) {
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Show(oobe_ui_);
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_->CancelPasswordChangedFlow();
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OobeUI::Screen SigninScreenHandler::GetCurrentScreen() const {
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN;
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController());
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (oobe_ui)
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    screen = oobe_ui->current_screen();
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return screen;
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1634a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool SigninScreenHandler::IsGaiaVisible() const {
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IsSigninScreen(GetCurrentScreen()) &&
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_state_ == UI_STATE_GAIA_SIGNIN;
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1639a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool SigninScreenHandler::IsGaiaHiddenByError() const {
1640a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return IsSigninScreenHiddenByError() &&
1641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      ui_state_ == UI_STATE_GAIA_SIGNIN;
1642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1643a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SigninScreenHandler::IsSigninScreenHiddenByError() const {
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (GetCurrentScreen() == OobeUI::SCREEN_ERROR_MESSAGE) &&
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (IsSigninScreen(error_screen_actor_->parent_screen()));
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SigninScreenHandler::IsGuestSigninAllowed() const {
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!cros_settings)
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allow_guest;
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefAllowGuest, &allow_guest);
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return allow_guest;
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SigninScreenHandler::IsOfflineLoginAllowed() const {
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CrosSettings* cros_settings = CrosSettings::Get();
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!cros_settings)
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Offline login is allowed only when user pods are hidden.
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_pods;
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cros_settings->GetBoolean(kAccountsPrefShowUserNamesOnSignIn, &show_pods);
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !show_pods;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid SigninScreenHandler::SubmitLoginFormForTest() {
1670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VLOG(2) << "Submit login form for test, user=" << test_user_;
1671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string code;
1673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  code += "document.getElementById('Email').value = '" + test_user_ + "';";
1674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  code += "document.getElementById('Passwd').value = '" + test_pass_ + "';";
1675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  code += "document.getElementById('signIn').click();";
1676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RenderViewHost* rvh = web_ui()->GetWebContents()->GetRenderViewHost();
1678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  rvh->ExecuteJavascriptInWebFrame(
1679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASCIIToUTF16("//iframe[@id='signin-frame']\n//iframe"),
1680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ASCIIToUTF16(code));
1681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Test properties are cleared in HandleCompleteLogin because the form
1683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // submission might fail and login will not be attempted after reloading
1684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // if they are cleared here.
1685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
1686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1688