gaia_screen_handler.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GAIA_SCREEN_HANDLER_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GAIA_SCREEN_HANDLER_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/base/net_errors.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace chromeos { 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SigninScreenHandler; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A class that's used to specify the way how Gaia should be loaded. 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct GaiaContext { 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GaiaContext(); 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Forces Gaia to reload. 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool force_reload; 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Whether local verison of Gaia is used. 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_local; 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // True if password was changed for the current user. 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool password_changed; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // True if user pods can be displyed. 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool show_users; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Whether Gaia should be loaded in offline mode. 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool use_offline; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // True if user list is non-empty. 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool has_users; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Email of current user. 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string email; 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Whether consumer management enrollment is in progress. 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_enrolling_consumer_management; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A class that handles WebUI hooks in Gaia screen. 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class GaiaScreenHandler : public BaseScreenHandler { 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) enum FrameState { 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FRAME_STATE_UNKNOWN = 0, 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FRAME_STATE_LOADING, 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FRAME_STATE_LOADED, 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FRAME_STATE_ERROR 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) explicit GaiaScreenHandler( 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<NetworkStateInformer>& network_state_informer); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~GaiaScreenHandler(); 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void LoadGaia(const GaiaContext& context); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateGaia(const GaiaContext& context); 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Sends request to reload Gaia. If |force_reload| is true, request 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // will be sent in any case, otherwise it will be sent only when Gaia is 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // not loading right now. 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void ReloadGaia(bool force_reload); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FrameState frame_state() const { return frame_state_; } 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::Error frame_error() const { return frame_error_; } 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO (ygorshenin@): remove this dependency. 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class SigninScreenHandler; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // BaseScreenHandler implementation: 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DeclareLocalizedValues(LocalizedValuesBuilder* builder) OVERRIDE; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Initialize() OVERRIDE; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // WebUIMessageHandler implementation: 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RegisterMessages() OVERRIDE; 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // WebUI message handlers. 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void HandleFrameLoadingCompleted(int status); 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HandleCompleteAuthentication(const std::string& email, 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& password, 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& auth_code); 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HandleCompleteLogin(const std::string& typed_email, 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& password, 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool using_saml); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HandleUsingSAMLAPI(); 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HandleScrapedPasswordCount(int password_count); 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HandleScrapedPasswordVerificationFailed(); 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void HandleGaiaUIReady(); 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Fill GAIA user name. 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void PopulateEmail(const std::string& user_id); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Mark user as having password changed: 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void PasswordChangedFor(const std::string& user_id); 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Kick off cookie / local storage cleanup. 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void StartClearingCookies(const base::Closure& on_clear_callback); 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnCookiesCleared(const base::Closure& on_clear_callback); 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Kick off DNS cache flushing. 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void StartClearingDnsCache(); 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void OnDnsCleared(); 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Show sign-in screen for the given credentials. 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void ShowSigninScreenForCreds(const std::string& username, 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& password); 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Attempts login for test. 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SubmitLoginFormForTest(); 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Updates the member variable and UMA histogram indicating whether the 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // principals API was used during SAML login. 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetSAMLPrincipalsAPIUsed(bool api_used); 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void ShowGaia(bool is_enrolling_consumer_management); 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Shows signin screen after dns cache and cookie cleanup operations finish. 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void ShowGaiaScreenIfReady(); 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Decides whether an auth extension should be pre-loaded. If it should, 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // pre-loads it. 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void MaybePreloadAuthExtension(); 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Tells webui to load authentication extension. |force| is used to force the 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // extension reloading, if it has already been loaded. |silent_load| is true 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // for cases when extension should be loaded in the background and it 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // shouldn't grab the focus. |offline| is true when offline version of the 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // extension should be used. 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void LoadAuthExtension(bool force, bool silent_load, bool offline); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO (ygorshenin@): GaiaScreenHandler should implement 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // NetworkStateInformer::Observer. 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateState(ErrorScreenActor::ErrorReason reason); 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO (ygorshenin@): remove this dependency. 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetSigninScreenHandler(SigninScreenHandler* handler); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SigninScreenHandlerDelegate* Delegate(); 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Current state of Gaia frame. 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FrameState frame_state_; 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Latest Gaia frame error. 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::Error frame_error_; 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Network state informer used to keep signin screen up. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<NetworkStateInformer> network_state_informer_; 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Email to pre-populate with. 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string populated_email_; 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Emails of the users, whose passwords have recently been changed. 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::set<std::string> password_changed_for_; 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // True if dns cache cleanup is done. 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool dns_cleared_; 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // True if DNS cache task is already running. 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool dns_clear_task_running_; 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // True if cookie jar cleanup is done. 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool cookies_cleared_; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Is focus still stolen from Gaia page? 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool focus_stolen_; 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Has Gaia page silent load been started for the current sign-in attempt? 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool gaia_silent_load_; 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The active network at the moment when Gaia page was preloaded. 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string gaia_silent_load_network_; 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If the user authenticated via SAML, this indicates whether the principals 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // API was used. 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool using_saml_api_; 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Whether consumer management enrollment is in progress. 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool is_enrolling_consumer_management_; 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Test credentials. 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string test_user_; 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string test_pass_; 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool test_expects_complete_login_; 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Non-owning ptr to SigninScreenHandler instance. Should not be used 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // in dtor. 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO (ygorshenin@): GaiaScreenHandler shouldn't communicate with 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // signin_screen_handler directly. 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SigninScreenHandler* signin_screen_handler_; 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::WeakPtrFactory<GaiaScreenHandler> weak_factory_; 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GaiaScreenHandler); 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace chromeos 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_GAIA_SCREEN_HANDLER_H_ 206