15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/bind.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/bind_helpers.h"
11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/compiler_specific.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/macros.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/message_loop/message_loop.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string_util.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/stringprintf.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h"
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/browser_process.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_helper.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_remover.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/signin/gaia_auth_extension_loader.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/authenticated_user_email_retriever.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/network_state.h"
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/network_state_handler.h"
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/browser/cloud/message_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "google_apis/gaia/gaia_auth_fetcher.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kJsScreenPath[] = "login.OAuthEnrollmentScreen";
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enrollment step names.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEnrollmentStepSignin[] = "signin";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kEnrollmentStepSuccess[] = "success";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Enrollment mode strings.
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* const kModeStrings[EnrollmentScreenActor::ENROLLMENT_MODE_COUNT] =
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "manual", "forced", "auto", "recovery" };
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstd::string EnrollmentModeToString(EnrollmentScreenActor::EnrollmentMode mode) {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CHECK(0 <= mode && mode < EnrollmentScreenActor::ENROLLMENT_MODE_COUNT);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return kModeStrings[mode];
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A helper class that takes care of asynchronously revoking a given token.
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class TokenRevoker : public GaiaAuthConsumer {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TokenRevoker()
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : gaia_fetcher_(this,
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      GaiaConstants::kChromeOSSource,
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      g_browser_process->system_request_context()) {}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TokenRevoker() {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void Start(const std::string& token) {
67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    gaia_fetcher_.StartRevokeOAuth2Token(token);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // GaiaAuthConsumer:
71558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual void OnOAuth2RevokeTokenCompleted() OVERRIDE {
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
76558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  GaiaAuthFetcher gaia_fetcher_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TokenRevoker);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Returns network name by service path.
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string GetNetworkName(const std::string& service_path) {
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const NetworkState* network =
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NetworkHandler::Get()->network_state_handler()->GetNetworkState(
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          service_path);
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!network)
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return std::string();
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return network->name();
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IsBehindCaptivePortal(NetworkStateInformer::State state,
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           ErrorScreenActor::ErrorReason reason) {
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return state == NetworkStateInformer::CAPTIVE_PORTAL ||
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         reason == ErrorScreenActor::ERROR_REASON_PORTAL_DETECTED;
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool IsProxyError(NetworkStateInformer::State state,
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  ErrorScreenActor::ErrorReason reason) {
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return state == NetworkStateInformer::PROXY_AUTH_REQUIRED ||
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         reason == ErrorScreenActor::ERROR_REASON_PROXY_AUTH_CANCELLED ||
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         reason == ErrorScreenActor::ERROR_REASON_PROXY_CONNECTION_FAILED;
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EnrollmentScreenHandler, public ------------------------------
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108116680a4aac90f2aa7413d9095a592090648e557Ben MurdochEnrollmentScreenHandler::EnrollmentScreenHandler(
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const scoped_refptr<NetworkStateInformer>& network_state_informer,
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ErrorScreenActor* error_screen_actor)
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : BaseScreenHandler(kJsScreenPath),
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      controller_(NULL),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      show_on_init_(false),
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      enrollment_mode_(ENROLLMENT_MODE_MANUAL),
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      browsing_data_remover_(NULL),
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      frame_error_(net::OK),
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      network_state_informer_(network_state_informer),
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_screen_actor_(error_screen_actor),
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      weak_ptr_factory_(this) {
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  set_async_assets_load_id(OobeUI::kScreenOobeEnrollment);
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(network_state_informer_.get());
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(error_screen_actor_);
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  network_state_informer_->AddObserver(this);
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (chromeos::LoginDisplayHostImpl::default_host()) {
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    chromeos::WebUILoginView* login_view =
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (login_view)
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      login_view->AddFrameObserver(this);
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)EnrollmentScreenHandler::~EnrollmentScreenHandler() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browsing_data_remover_)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browsing_data_remover_->RemoveObserver(this);
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  network_state_informer_->RemoveObserver(this);
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (chromeos::LoginDisplayHostImpl::default_host()) {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    chromeos::WebUILoginView* login_view =
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        chromeos::LoginDisplayHostImpl::default_host()->GetWebUILoginView();
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (login_view)
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      login_view->RemoveFrameObserver(this);
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EnrollmentScreenHandler, WebUIMessageHandler implementation --
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::RegisterMessages() {
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddCallback("oauthEnrollRetrieveAuthenticatedUserEmail",
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              &EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail);
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("oauthEnrollClose",
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &EnrollmentScreenHandler::HandleClose);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("oauthEnrollCompleteLogin",
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &EnrollmentScreenHandler::HandleCompleteLogin);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddCallback("oauthEnrollRetry",
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &EnrollmentScreenHandler::HandleRetry);
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddCallback("frameLoadingCompleted",
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              &EnrollmentScreenHandler::HandleFrameLoadingCompleted);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EnrollmentScreenHandler
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//      EnrollmentScreenActor implementation -----------------------------------
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid EnrollmentScreenHandler::SetParameters(
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    Controller* controller,
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EnrollmentMode enrollment_mode,
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const std::string& management_domain) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_ = controller;
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enrollment_mode_ = enrollment_mode;
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  management_domain_ = management_domain;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::PrepareToShow() {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::Show() {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!page_is_ready())
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = true;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DoShow();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::Hide() {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::FetchOAuthToken() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oauth_fetcher_.reset(
189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      new policy::PolicyOAuth2TokenFetcher(
190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          profile->GetRequestContext(),
191558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          g_browser_process->system_request_context(),
192558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          base::Bind(&EnrollmentScreenHandler::OnTokenFetched,
193558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                     base::Unretained(this))));
194558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  oauth_fetcher_->Start();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void EnrollmentScreenHandler::ResetAuth(const base::Closure& callback) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auth_reset_callbacks_.push_back(callback);
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (browsing_data_remover_)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (oauth_fetcher_) {
2031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!oauth_fetcher_->oauth2_access_token().empty())
2041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (new TokenRevoker())->Start(oauth_fetcher_->oauth2_access_token());
2051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (!oauth_fetcher_->oauth2_refresh_token().empty())
2071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      (new TokenRevoker())->Start(oauth_fetcher_->oauth2_refresh_token());
208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetWebContents()->GetBrowserContext());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browsing_data_remover_ =
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowsingDataRemover::CreateForUnboundedRange(profile);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browsing_data_remover_->AddObserver(this);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browsing_data_remover_->Remove(BrowsingDataRemover::REMOVE_SITE_DATA,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 BrowsingDataHelper::UNPROTECTED_WEB);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowSigninScreen() {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowStep(kEnrollmentStepSignin);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowEnrollmentSpinnerScreen() {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowWorking(IDS_ENTERPRISE_ENROLLMENT_WORKING);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowLoginSpinnerScreen() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowWorking(IDS_ENTERPRISE_ENROLLMENT_RESUMING_LOGIN);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowAuthError(
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GoogleServiceAuthError& error) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (error.state()) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::NONE:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::CAPTCHA_REQUIRED:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::TWO_FACTOR:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::HOSTED_NOT_ALLOWED:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS:
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::REQUEST_CANCELED:
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE:
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case GoogleServiceAuthError::SERVICE_ERROR:
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_AUTH_FATAL_ERROR, false);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::USER_NOT_SIGNED_UP:
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::ACCOUNT_DELETED:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::ACCOUNT_DISABLED:
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_AUTH_ACCOUNT_ERROR, true);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::CONNECTION_FAILED:
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::SERVICE_UNAVAILABLE:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_AUTH_NETWORK_ERROR, true);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GoogleServiceAuthError::NUM_STATES:
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowUIError(UIError error) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (error) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UI_ERROR_DOMAIN_MISMATCH:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_WRONG_USER, true);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UI_ERROR_AUTO_ENROLLMENT_BAD_MODE:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_AUTO_ENROLLMENT_BAD_MODE, true);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UI_ERROR_FATAL:
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_FATAL_ENROLLMENT_ERROR, true);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowEnrollmentStatus(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy::EnrollmentStatus status) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (status.status()) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_SUCCESS:
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowStep(kEnrollmentStepSuccess);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case policy::EnrollmentStatus::STATUS_NO_STATE_KEYS:
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_NO_STATE_KEYS, false);
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_REGISTRATION_FAILED:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Some special cases for generating a nicer message that's more helpful.
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (status.client_status()) {
286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        case policy::DM_STATUS_SERVICE_MANAGEMENT_NOT_SUPPORTED:
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          ShowError(IDS_ENTERPRISE_ENROLLMENT_ACCOUNT_ERROR, true);
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          break;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case policy::DM_STATUS_SERVICE_MISSING_LICENSES:
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ShowError(IDS_ENTERPRISE_ENROLLMENT_MISSING_LICENSES_ERROR, true);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        case policy::DM_STATUS_SERVICE_DEPROVISIONED:
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ShowError(IDS_ENTERPRISE_ENROLLMENT_DEPROVISIONED_ERROR, true);
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          break;
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        case policy::DM_STATUS_SERVICE_DOMAIN_MISMATCH:
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          ShowError(IDS_ENTERPRISE_ENROLLMENT_DOMAIN_MISMATCH_ERROR, true);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ShowErrorMessage(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              l10n_util::GetStringFUTF8(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  IDS_ENTERPRISE_ENROLLMENT_STATUS_REGISTRATION_FAILED,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  policy::FormatDeviceManagementStatus(status.client_status())),
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              true);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_ROBOT_AUTH_FETCH_FAILED:
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_ROBOT_AUTH_FETCH_FAILED, true);
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_ROBOT_REFRESH_FETCH_FAILED:
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_ROBOT_REFRESH_FETCH_FAILED, true);
3111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_ROBOT_REFRESH_STORE_FAILED:
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_ROBOT_REFRESH_STORE_FAILED, true);
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      return;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_REGISTRATION_BAD_MODE:
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_REGISTRATION_BAD_MODE, false);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_POLICY_FETCH_FAILED:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowErrorMessage(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringFUTF8(
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_ENTERPRISE_ENROLLMENT_STATUS_POLICY_FETCH_FAILED,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              policy::FormatDeviceManagementStatus(status.client_status())),
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          true);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_VALIDATION_FAILED:
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowErrorMessage(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringFUTF8(
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              IDS_ENTERPRISE_ENROLLMENT_STATUS_VALIDATION_FAILED,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              policy::FormatValidationStatus(status.validation_status())),
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          true);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_LOCK_ERROR:
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_ERROR, false);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_LOCK_TIMEOUT:
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_TIMEOUT, false);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_LOCK_WRONG_USER:
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_LOCK_WRONG_USER, true);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case policy::EnrollmentStatus::STATUS_STORE_ERROR:
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShowErrorMessage(
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringFUTF8(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_ENTERPRISE_ENROLLMENT_STATUS_STORE_ERROR,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              policy::FormatStoreStatus(status.store_status(),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        status.validation_status())),
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          true);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case policy::EnrollmentStatus::STATUS_STORE_TOKEN_AND_ID_FAILED:
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      // This error should not happen for enterprise enrollment.
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ShowError(IDS_ENTERPRISE_ENROLLMENT_STATUS_STORE_TOKEN_AND_ID_FAILED,
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                true);
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NOTREACHED();
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EnrollmentScreenHandler BaseScreenHandler implementation -----
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::Initialize() {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (show_on_init_) {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Show();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_on_init_ = false;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::DeclareLocalizedValues(
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LocalizedValuesBuilder* builder) {
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollScreenTitle",
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_SCREEN_TITLE);
372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("oauthEnrollDescription", IDS_ENTERPRISE_ENROLLMENT_DESCRIPTION);
373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  builder->Add("oauthEnrollReEnrollmentText",
374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               IDS_ENTERPRISE_ENROLLMENT_RE_ENROLLMENT_TEXT);
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollRetry", IDS_ENTERPRISE_ENROLLMENT_RETRY);
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollCancel", IDS_ENTERPRISE_ENROLLMENT_CANCEL);
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollDone", IDS_ENTERPRISE_ENROLLMENT_DONE);
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollSuccess", IDS_ENTERPRISE_ENROLLMENT_SUCCESS);
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollExplain", IDS_ENTERPRISE_ENROLLMENT_EXPLAIN);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollExplainLink",
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_EXPLAIN_LINK);
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollExplainButton",
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_EXPLAIN_BUTTON);
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollCancelAutoEnrollmentReally",
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_CANCEL_AUTO_REALLY);
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollCancelAutoEnrollmentConfirm",
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_CANCEL_AUTO_CONFIRM);
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  builder->Add("oauthEnrollCancelAutoEnrollmentGoBack",
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               IDS_ENTERPRISE_ENROLLMENT_CANCEL_AUTO_GO_BACK);
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::OnBrowsingDataRemoverDone() {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browsing_data_remover_->RemoveObserver(this);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browsing_data_remover_ = NULL;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<base::Closure> callbacks_to_run;
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  callbacks_to_run.swap(auth_reset_callbacks_);
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::vector<base::Closure>::iterator callback(callbacks_to_run.begin());
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       callback != callbacks_to_run.end(); ++callback) {
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    callback->Run();
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
404116680a4aac90f2aa7413d9095a592090648e557Ben MurdochOobeUI::Screen EnrollmentScreenHandler::GetCurrentScreen() const {
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OobeUI::Screen screen = OobeUI::SCREEN_UNKNOWN;
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OobeUI* oobe_ui = static_cast<OobeUI*>(web_ui()->GetController());
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (oobe_ui)
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    screen = oobe_ui->current_screen();
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return screen;
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool EnrollmentScreenHandler::IsOnEnrollmentScreen() const {
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return (GetCurrentScreen() == OobeUI::SCREEN_OOBE_ENROLLMENT);
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool EnrollmentScreenHandler::IsEnrollmentScreenHiddenByError() const {
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return (GetCurrentScreen() == OobeUI::SCREEN_ERROR_MESSAGE &&
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          error_screen_actor_->parent_screen() ==
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              OobeUI::SCREEN_OOBE_ENROLLMENT);
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(rsorokin): This function is mostly copied from SigninScreenHandler and
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// should be refactored in the future.
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EnrollmentScreenHandler::UpdateState(
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ErrorScreenActor::ErrorReason reason) {
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!IsOnEnrollmentScreen() && !IsEnrollmentScreenHiddenByError())
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  NetworkStateInformer::State state = network_state_informer_->state();
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string network_path = network_state_informer_->network_path();
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool is_online = (state == NetworkStateInformer::ONLINE);
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool is_behind_captive_portal =
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (state == NetworkStateInformer::CAPTIVE_PORTAL);
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool is_frame_error =
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (frame_error() != net::OK) ||
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LOG(WARNING) << "EnrollmentScreenHandler::UpdateState(): "
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << "state=" << NetworkStateInformer::StatusString(state) << ", "
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               << "reason=" << ErrorScreenActor::ErrorReasonString(reason);
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (is_online || !is_behind_captive_portal)
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->HideCaptivePortal();
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (is_frame_error) {
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(WARNING) << "Retry page load";
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // TODO(rsorokin): Too many consecutive reloads.
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CallJS("doReload");
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!is_online || is_frame_error)
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SetupAndShowOfflineMessage(state, reason);
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HideOfflineMessage(state, reason);
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EnrollmentScreenHandler::SetupAndShowOfflineMessage(
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NetworkStateInformer::State state,
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ErrorScreenActor::ErrorReason reason) {
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const std::string network_path = network_state_informer_->network_path();
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool is_behind_captive_portal = IsBehindCaptivePortal(state, reason);
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool is_proxy_error = IsProxyError(state, reason);
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const bool is_frame_error =
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (frame_error() != net::OK) ||
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      (reason == ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (is_proxy_error) {
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PROXY,
469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       std::string());
470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (is_behind_captive_portal) {
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Do not bother a user with obsessive captive portal showing. This
472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // check makes captive portal being shown only once: either when error
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // screen is shown for the first time or when switching from another
474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // error screen (offline, proxy).
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (IsOnEnrollmentScreen() || (error_screen_actor_->error_state() !=
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   ErrorScreen::ERROR_STATE_PORTAL)) {
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      error_screen_actor_->FixCaptivePortal();
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string network_name = GetNetworkName(network_path);
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_PORTAL,
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       network_name);
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (is_frame_error) {
483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->SetErrorState(
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ErrorScreen::ERROR_STATE_AUTH_EXT_TIMEOUT, std::string());
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->SetErrorState(ErrorScreen::ERROR_STATE_OFFLINE,
487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       std::string());
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (GetCurrentScreen() != OobeUI::SCREEN_ERROR_MESSAGE) {
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::DictionaryValue params;
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string network_type = network_state_informer_->network_type();
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    params.SetString("lastNetworkType", network_type);
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->SetUIState(ErrorScreen::UI_STATE_SIGNIN);
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->Show(OobeUI::SCREEN_OOBE_ENROLLMENT,
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              &params,
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              base::Bind(&EnrollmentScreenHandler::DoShow,
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         weak_ptr_factory_.GetWeakPtr()));
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EnrollmentScreenHandler::HideOfflineMessage(
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NetworkStateInformer::State state,
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ErrorScreenActor::ErrorReason reason) {
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (IsEnrollmentScreenHiddenByError())
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    error_screen_actor_->Hide();
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EnrollmentScreenHandler::OnFrameError(
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& frame_unique_name) {
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (frame_unique_name == "oauth-enroll-signin-frame") {
512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    HandleFrameLoadingCompleted(net::ERR_FAILED);
513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EnrollmentScreenHandler, private -----------------------------
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void EnrollmentScreenHandler::HandleRetrieveAuthenticatedUserEmail(
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    double attempt_token) {
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  email_retriever_.reset(new AuthenticatedUserEmailRetriever(
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&EnrollmentScreenHandler::CallJS<double, std::string>,
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this),
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 "setAuthenticatedUserEmail",
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 attempt_token),
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile::FromWebUI(web_ui())->GetRequestContext()));
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void EnrollmentScreenHandler::HandleClose(const std::string& reason) {
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(controller_);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reason == "cancel" || reason == "autocancel")
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_->OnCancel();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (reason == "done")
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_->OnConfirmationClosed();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::HandleCompleteLogin(const std::string& user) {
539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(controller_);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->OnLoginDone(gaia::SanitizeEmail(user));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::HandleRetry() {
544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(controller_);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->OnRetry();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid EnrollmentScreenHandler::HandleFrameLoadingCompleted(int status) {
549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const net::Error frame_error = static_cast<net::Error>(status);
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  frame_error_ = frame_error;
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (network_state_informer_->state() != NetworkStateInformer::ONLINE)
553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (frame_error_)
555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UpdateState(ErrorScreenActor::ERROR_REASON_FRAME_ERROR);
556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  else
557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowStep(const char* step) {
561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CallJS("showStep", std::string(step));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void EnrollmentScreenHandler::ShowError(int message_id, bool retry) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowErrorMessage(l10n_util::GetStringUTF8(message_id), retry);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void EnrollmentScreenHandler::ShowErrorMessage(const std::string& message,
5691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                               bool retry) {
570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CallJS("showError", message, retry);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::ShowWorking(int message_id) {
574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CallJS("showWorking", l10n_util::GetStringUTF16(message_id));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid EnrollmentScreenHandler::OnTokenFetched(
578558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const std::string& token,
579558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const GoogleServiceAuthError& error) {
580558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!controller_)
581558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
583558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (error.state() != GoogleServiceAuthError::NONE)
584558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    controller_->OnAuthError(error);
585558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  else
586558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    controller_->OnOAuthTokenAvailable(token);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void EnrollmentScreenHandler::DoShow() {
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue screen_data;
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  screen_data.SetString(
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "signin_url",
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::StringPrintf("%s/main.html", extensions::kGaiaAuthExtensionOrigin));
59490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  screen_data.SetString("gaiaUrl", GaiaUrls::GetInstance()->gaia_url().spec());
595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  screen_data.SetString("enrollment_mode",
596effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        EnrollmentModeToString(enrollment_mode_));
597effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  screen_data.SetString("management_domain", management_domain_);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShowScreen(OobeUI::kScreenOobeEnrollment, &screen_data);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
603