one_click_signin_sync_starter.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/one_click_signin_sync_starter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_policy_signin_service.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile_io_data.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "chrome/browser/profiles/profile_window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_prefs.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/signin/profile_signin_confirmation_dialog.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
39b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "grit/chromium_strings.h"
40b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "grit/generated_resources.h"
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OneClickSigninSyncStarter::OneClickSigninSyncStarter(
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& session_index,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& email,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& password,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StartSyncMode start_mode,
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    content::WebContents* web_contents,
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ConfirmationRequired confirmation_required,
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    signin::Source source,
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Callback sync_setup_completed_callback)
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : content::WebContentsObserver(web_contents),
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      start_mode_(start_mode),
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      desktop_type_(chrome::HOST_DESKTOP_TYPE_NATIVE),
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      confirmation_required_(confirmation_required),
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      source_(source),
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      sync_setup_completed_callback_(sync_setup_completed_callback),
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_pointer_factory_(this) {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(profile);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BrowserList::AddObserver(this);
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Initialize(profile, browser);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Start the signin process using the cookies in the cookie jar.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManager* manager = SigninManagerFactory::GetForProfile(profile_);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManager::OAuthTokenFetchedCallback callback;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Policy is enabled, so pass in a callback to do extra policy-related UI
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // before signin completes.
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback = base::Bind(&OneClickSigninSyncStarter::ConfirmSignin,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        weak_pointer_factory_.GetWeakPtr());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->StartSignInWithCredentials(session_index, email, password, callback);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void OneClickSigninSyncStarter::OnBrowserRemoved(Browser* browser) {
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (browser == browser_)
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    browser_ = NULL;
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)OneClickSigninSyncStarter::~OneClickSigninSyncStarter() {
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BrowserList::RemoveObserver(this);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::Initialize(Profile* profile, Browser* browser) {
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(profile);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile_ = profile;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser_ = browser;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Cache the parent desktop for the browser, so we can reuse that same
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // desktop for any UI we want to display.
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (browser)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    desktop_type_ = browser->host_desktop_type();
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  signin_tracker_.reset(new SigninTracker(profile_, this));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the sync service know that setup is in progress so it doesn't start
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // syncing until the user has finished any configuration.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileSyncService* profile_sync_service = GetProfileSyncService();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile_sync_service)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    profile_sync_service->SetSetupInProgress(true);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the syncing is not suppressed, otherwise the SigninManager
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // will not be able to complete sucessfully.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_sync::SyncPrefs sync_prefs(profile_->GetPrefs());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_prefs.SetStartSuppressed(false);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::ConfirmSignin(const std::string& oauth_token) {
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!oauth_token.empty());
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManager* signin = SigninManagerFactory::GetForProfile(profile_);
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If this is a new signin (no authenticated username yet) try loading
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // policy for this user now, before any signed in services are initialized.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This callback is only invoked for the web-based signin flow - for the old
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ClientLogin flow, policy will get loaded once the TokenService finishes
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // initializing (not ideal, but it's a reasonable fallback).
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (signin->GetAuthenticatedUsername().empty()) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    policy::UserPolicySigninService* policy_service =
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    policy_service->RegisterPolicyClient(
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        signin->GetUsernameForAuthInProgress(),
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        oauth_token,
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&OneClickSigninSyncStarter::OnRegisteredForPolicy,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   weak_pointer_factory_.GetWeakPtr()));
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
129b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ConfirmAndSignin();
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The user is already signed in - just tell SigninManager to continue
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // with its re-auth flow.
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    signin->CompletePendingSignin();
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY)
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)OneClickSigninSyncStarter::SigninDialogDelegate::SigninDialogDelegate(
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::WeakPtr<OneClickSigninSyncStarter> sync_starter)
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  : sync_starter_(sync_starter) {
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)OneClickSigninSyncStarter::SigninDialogDelegate::~SigninDialogDelegate() {
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void OneClickSigninSyncStarter::SigninDialogDelegate::OnCancelSignin() {
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  sync_starter_->CancelSigninAndDelete();
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void OneClickSigninSyncStarter::SigninDialogDelegate::OnContinueSignin() {
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  sync_starter_->LoadPolicyWithCachedClient();
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void OneClickSigninSyncStarter::SigninDialogDelegate::OnSigninWithNewProfile() {
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  sync_starter_->CreateNewSignedInProfile();
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::OnRegisteredForPolicy(
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<policy::CloudPolicyClient> client) {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManager* signin = SigninManagerFactory::GetForProfile(profile_);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If there's no token for the user (policy registration did not succeed) just
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // finish signing in.
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!client.get()) {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DVLOG(1) << "Policy registration failed";
166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ConfirmAndSignin();
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(client->is_registered());
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DVLOG(1) << "Policy registration succeeded: dm_token=" << client->dm_token();
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Stash away a copy of our CloudPolicyClient (should not already have one).
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!policy_client_);
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy_client_.swap(client);
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Allow user to create a new profile before continuing with sign-in.
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EnsureBrowser();
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::WebContents* web_contents =
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser_->tab_strip_model()->GetActiveWebContents();
181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!web_contents) {
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CancelSigninAndDelete();
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  chrome::ShowProfileSigninConfirmationDialog(
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      browser_,
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      web_contents,
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      profile_,
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      signin->GetUsernameForAuthInProgress(),
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new SigninDialogDelegate(weak_pointer_factory_.GetWeakPtr()));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::CancelSigninAndDelete() {
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_)->SignOut();
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The statement above results in a call to SigninFailed() which will free
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this object, so do not refer to the OneClickSigninSyncStarter object
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // after this point.
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::LoadPolicyWithCachedClient() {
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(policy_client_);
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy::UserPolicySigninService* policy_service =
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy_service->FetchPolicyForSignedInUser(
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      policy_client_.Pass(),
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&OneClickSigninSyncStarter::OnPolicyFetchComplete,
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 weak_pointer_factory_.GetWeakPtr()));
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::OnPolicyFetchComplete(bool success) {
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For now, we allow signin to complete even if the policy fetch fails. If
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we ever want to change this behavior, we could call
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // SigninManager::SignOut() here instead.
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DLOG_IF(ERROR, !success) << "Error fetching policy for user";
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DVLOG_IF(1, success) << "Policy fetch successful - completing signin";
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManagerFactory::GetForProfile(profile_)->CompletePendingSignin();
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OneClickSigninSyncStarter::CreateNewSignedInProfile() {
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManager* signin = SigninManagerFactory::GetForProfile(profile_);
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(!signin->GetUsernameForAuthInProgress().empty());
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(policy_client_);
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create a new profile and have it call back when done so we can inject our
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // signin credentials.
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  size_t icon_index = g_browser_process->profile_manager()->
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GetProfileInfoCache().ChooseAvatarIconIndexForNewProfile();
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfileManager::CreateMultiProfileAsync(
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      UTF8ToUTF16(signin->GetUsernameForAuthInProgress()),
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      UTF8ToUTF16(ProfileInfoCache::GetDefaultAvatarIconUrl(icon_index)),
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&OneClickSigninSyncStarter::CompleteInitForNewProfile,
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 weak_pointer_factory_.GetWeakPtr(), desktop_type_),
2322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      std::string());
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void OneClickSigninSyncStarter::CompleteInitForNewProfile(
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    chrome::HostDesktopType desktop_type,
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile* new_profile,
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Profile::CreateStatus status) {
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_NE(profile_, new_profile);
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(atwilson): On error, unregister the client to release the DMToken
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // and surface a better error for the user.
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  switch (status) {
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case Profile::CREATE_STATUS_LOCAL_FAIL: {
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      NOTREACHED() << "Error creating new profile";
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CancelSigninAndDelete();
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case Profile::CREATE_STATUS_CREATED: {
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case Profile::CREATE_STATUS_INITIALIZED: {
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Wait until the profile is initialized before we transfer credentials.
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SigninManager* old_signin_manager =
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          SigninManagerFactory::GetForProfile(profile_);
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SigninManager* new_signin_manager =
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          SigninManagerFactory::GetForProfile(new_profile);
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK(!old_signin_manager->GetUsernameForAuthInProgress().empty());
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK(old_signin_manager->GetAuthenticatedUsername().empty());
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK(new_signin_manager->GetAuthenticatedUsername().empty());
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK(policy_client_);
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Copy credentials from the old profile to the just-created profile,
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // and switch over to tracking that profile.
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new_signin_manager->CopyCredentialsFrom(*old_signin_manager);
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FinishProfileSyncServiceSetup();
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      Initialize(new_profile, NULL);
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK_EQ(profile_, new_profile);
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // We've transferred our credentials to the new profile - notify that
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // the signin for the original profile was cancelled (must do this after
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // we have called Initialize() with the new profile, as otherwise this
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // object will get freed when the signin on the old profile is cancelled.
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      old_signin_manager->SignOut();
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Load policy for the just-created profile - once policy has finished
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // loading the signin process will complete.
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      LoadPolicyWithCachedClient();
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Open the profile's first window, after all initialization.
2819ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      profiles::FindOrCreateNewWindowForProfile(
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new_profile,
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        chrome::startup::IS_PROCESS_STARTUP,
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        chrome::startup::IS_FIRST_RUN,
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        desktop_type,
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        false);
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      break;
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case Profile::CREATE_STATUS_REMOTE_FAIL:
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case Profile::CREATE_STATUS_CANCELED:
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case Profile::MAX_CREATE_STATUS: {
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      NOTREACHED() << "Invalid profile creation status";
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CancelSigninAndDelete();
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return;
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void OneClickSigninSyncStarter::ConfirmAndSignin() {
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SigninManager* signin = SigninManagerFactory::GetForProfile(profile_);
302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (confirmation_required_ == CONFIRM_UNTRUSTED_SIGNIN) {
303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EnsureBrowser();
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Display a confirmation dialog to the user.
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    browser_->window()->ShowOneClickSigninBubble(
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG,
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        UTF8ToUTF16(signin->GetUsernameForAuthInProgress()),
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        string16(), // No error message to display.
309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        base::Bind(&OneClickSigninSyncStarter::UntrustedSigninConfirmed,
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   weak_pointer_factory_.GetWeakPtr()));
311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } else {
312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // No confirmation required - just sign in the user.
313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    signin->CompletePendingSignin();
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void OneClickSigninSyncStarter::UntrustedSigninConfirmed(
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StartSyncMode response) {
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (response == UNDO_SYNC) {
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    CancelSigninAndDelete();  // This statement frees this object.
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // If the user clicked the "Advanced" link in the confirmation dialog, then
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // override the current start_mode_ to bring up the advanced sync settings.
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (response == CONFIGURE_SYNC_FIRST)
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      start_mode_ = response;
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SigninManager* signin = SigninManagerFactory::GetForProfile(profile_);
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    signin->CompletePendingSignin();
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninSyncStarter::SigninFailed(
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GoogleServiceAuthError& error) {
333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!sync_setup_completed_callback_.is_null())
334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sync_setup_completed_callback_.Run(SYNC_SETUP_FAILURE);
335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
336868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FinishProfileSyncServiceSetup();
337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (confirmation_required_ == CONFIRM_AFTER_SIGNIN) {
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    switch (error.state()) {
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case GoogleServiceAuthError::SERVICE_UNAVAILABLE:
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        DisplayFinalConfirmationBubble(l10n_util::GetStringUTF16(
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            IDS_SYNC_UNRECOVERABLE_ERROR));
342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      case GoogleServiceAuthError::REQUEST_CANCELED:
344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        // No error notification needed if the user manually cancelled signin.
345b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
346b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      default:
347b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        DisplayFinalConfirmationBubble(l10n_util::GetStringUTF16(
348b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            IDS_SYNC_ERROR_SIGNING_IN));
349b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        break;
350b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
351b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OneClickSigninSyncStarter::SigninSuccess() {
356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!sync_setup_completed_callback_.is_null())
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sync_setup_completed_callback_.Run(SYNC_SETUP_SUCCESS);
358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (start_mode_) {
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case SYNC_WITH_DEFAULT_SETTINGS: {
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Just kick off the sync machine, no need to configure it first.
362bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      ProfileSyncService* profile_sync_service = GetProfileSyncService();
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (profile_sync_service)
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_sync_service->SetSyncSetupCompleted();
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      FinishProfileSyncServiceSetup();
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (confirmation_required_ == CONFIRM_AFTER_SIGNIN) {
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        string16 message;
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        if (!profile_sync_service) {
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          // Sync is disabled by policy.
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          message = l10n_util::GetStringUTF16(
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              IDS_ONE_CLICK_SIGNIN_BUBBLE_SYNC_DISABLED_MESSAGE);
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        }
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        DisplayFinalConfirmationBubble(message);
374b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      }
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case CONFIGURE_SYNC_FIRST:
3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ShowSettingsPage(true);  // Show sync config UI.
379ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      break;
380ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    case SHOW_SETTINGS_WITHOUT_CONFIGURE:
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ShowSettingsPage(false);  // Don't show sync config UI.
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    default:
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      NOTREACHED();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void OneClickSigninSyncStarter::DisplayFinalConfirmationBubble(
390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    const string16& custom_message) {
391b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EnsureBrowser();
392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  browser_->window()->ShowOneClickSigninBubble(
393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      BrowserWindow::ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE,
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      string16(),  // No email required - this is not a SAML confirmation.
395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      custom_message,
396b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      // Callback is ignored.
397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      BrowserWindow::StartSyncCallback());
398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void OneClickSigninSyncStarter::EnsureBrowser() {
401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!browser_) {
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // The user just created a new profile or has closed the browser that
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // we used previously. Grab the most recently active browser or else
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // create a new one.
405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    browser_ = chrome::FindLastActiveWithProfile(profile_, desktop_type_);
406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (!browser_) {
407b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      browser_ = new Browser(Browser::CreateParams(profile_,
408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                                   desktop_type_));
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chrome::AddBlankTabAt(browser_, -1, true);
410b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
411b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    browser_->window()->Show();
412b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
413b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
414b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void OneClickSigninSyncStarter::ShowSettingsPage(bool configure_sync) {
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Give the user a chance to configure things. We don't clear the
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ProfileSyncService::setup_in_progress flag because we don't want sync
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to start up until after the configure UI is displayed (the configure UI
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // will clear the flag when the user is done setting up sync).
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfileSyncService* profile_sync_service = GetProfileSyncService();
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LoginUIService* login_ui = LoginUIServiceFactory::GetForProfile(profile_);
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (login_ui->current_login_ui()) {
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    login_ui->current_login_ui()->FocusUI();
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
425b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    EnsureBrowser();
4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // If the sign in tab is showing a blank page and is not about to be
4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // closed, use it to show the settings UI.
4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool use_same_tab = false;
4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (web_contents()) {
4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      GURL current_url = web_contents()->GetLastCommittedURL();
4323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      use_same_tab = signin::IsContinueUrlForWebBasedSigninFlow(current_url) &&
4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          !signin::IsAutoCloseEnabledInURL(current_url);
4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (profile_sync_service) {
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Need to navigate to the settings page and display the sync UI.
4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (use_same_tab) {
4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ShowSettingsPageInWebContents(web_contents(),
4393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                      chrome::kSyncSetupSubPage);
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      } else {
441ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        // If the user is setting up sync for the first time, let them configure
442ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        // advanced sync settings. However, in the case of re-authentication,
443ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        // return the user to the settings page without showing any config UI.
444ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        if (configure_sync) {
445ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          chrome::ShowSettingsSubPage(browser_, chrome::kSyncSetupSubPage);
446ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        } else {
447ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          FinishProfileSyncServiceSetup();
448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          chrome::ShowSettings(browser_);
449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Sync is disabled - just display the settings page.
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      FinishProfileSyncServiceSetup();
4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (use_same_tab)
4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        ShowSettingsPageInWebContents(web_contents(), std::string());
4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      else
4573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        chrome::ShowSettings(browser_);
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ProfileSyncService* OneClickSigninSyncStarter::GetProfileSyncService() {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileSyncService* service = NULL;
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile_->IsSyncAccessible())
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    service = ProfileSyncServiceFactory::GetForProfile(profile_);
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return service;
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void OneClickSigninSyncStarter::FinishProfileSyncServiceSetup() {
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProfileSyncService* service =
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ProfileSyncServiceFactory::GetForProfile(profile_);
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (service)
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    service->SetSetupInProgress(false);
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void OneClickSigninSyncStarter::ShowSettingsPageInWebContents(
4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    content::WebContents* contents,
4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::string& sub_page) {
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string url = std::string(chrome::kChromeUISettingsURL) + sub_page;
480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::OpenURLParams params(GURL(url),
481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                content::Referrer(),
482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                CURRENT_TAB,
483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                content::PAGE_TRANSITION_AUTO_TOPLEVEL,
484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                false);
485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  contents->OpenURL(params);
486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Activate the tab.
488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(contents);
489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int content_index =
490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      browser->tab_strip_model()->GetIndexOfWebContents(contents);
491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  browser->tab_strip_model()->ActivateTabAt(content_index,
492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                            false /* user_gesture */);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
494