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