Index: chrome/browser/ui/sync/one_click_signin_helper.h |
diff --git a/chrome/browser/ui/sync/one_click_signin_helper.h b/chrome/browser/ui/sync/one_click_signin_helper.h |
deleted file mode 100644 |
index 335ad333f65b495ee8a6a3c3ee4deee7471ac9d1..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/sync/one_click_signin_helper.h |
+++ /dev/null |
@@ -1,380 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef CHROME_BROWSER_UI_SYNC_ONE_CLICK_SIGNIN_HELPER_H_ |
-#define CHROME_BROWSER_UI_SYNC_ONE_CLICK_SIGNIN_HELPER_H_ |
- |
-#include <string> |
- |
-#include "base/gtest_prod_util.h" |
-#include "base/memory/weak_ptr.h" |
-#include "chrome/browser/signin/signin_promo.h" |
-#include "chrome/browser/sync/profile_sync_service_observer.h" |
-#include "chrome/browser/ui/sync/one_click_signin_sync_starter.h" |
-#include "components/signin/core/browser/signin_oauth_helper.h" |
-#include "content/public/browser/navigation_controller.h" |
-#include "content/public/browser/web_contents_observer.h" |
-#include "content/public/browser/web_contents_user_data.h" |
-#include "google_apis/gaia/google_service_auth_error.h" |
- |
-class Browser; |
-class GURL; |
-class ProfileIOData; |
- |
-namespace autofill { |
-struct PasswordForm; |
-} |
- |
-namespace content { |
-class WebContents; |
-struct FrameNavigateParams; |
-struct LoadCommittedDetails; |
-} |
- |
-namespace net { |
-class URLRequest; |
-} |
- |
-namespace password_manager { |
-class PasswordManager; |
-} |
- |
-// Per-tab one-click signin helper. When a user signs in to a Google service |
-// and the profile is not yet connected to a Google account, will start the |
-// process of helping the user connect his profile with one click. The process |
-// begins with an infobar and is followed with a confirmation dialog explaining |
-// more about what this means. |
-class OneClickSigninHelper |
- : public content::WebContentsObserver, |
- public content::WebContentsUserData<OneClickSigninHelper> { |
- public: |
- // Represents user's decision about sign in process. |
- enum AutoAccept { |
- // User decision not yet known. Assume cancel. |
- AUTO_ACCEPT_NONE, |
- |
- // User has explicitly accepted to sign in. A bubble is shown with the |
- // option to start sync, configure it first, or abort. |
- AUTO_ACCEPT_ACCEPTED, |
- |
- // User has explicitly accepted to sign in, but wants to configure sync |
- // settings before turning it on. |
- AUTO_ACCEPT_CONFIGURE, |
- |
- // User has explicitly rejected to sign in. Furthermore, the user does |
- // not want to be prompted to see the interstitial again in this profile. |
- AUTO_ACCEPT_REJECTED_FOR_PROFILE, |
- |
- // This is an explicit sign in from either first run, NTP, wrench menu, |
- // or settings page. The user will be signed in automatically with sync |
- // enabled using default settings. |
- AUTO_ACCEPT_EXPLICIT |
- }; |
- |
- // Return value of CanOfferOnIOThread(). |
- enum Offer { |
- CAN_OFFER, |
- DONT_OFFER, |
- IGNORE_REQUEST |
- }; |
- |
- // Argument to CanOffer(). |
- enum CanOfferFor { |
- CAN_OFFER_FOR_ALL, |
- CAN_OFFER_FOR_INTERSTITAL_ONLY, |
- CAN_OFFER_FOR_SECONDARY_ACCOUNT |
- // TODO(guohui): needs to handle adding secondary account through |
- // interstitial. |
- }; |
- |
- // Arguments used with StartSync function. base::Bind() cannot support too |
- // many args for performance reasons, so they are packaged up into a struct. |
- struct StartSyncArgs { |
- // Default contructor for testing only. |
- StartSyncArgs(); |
- StartSyncArgs(Profile* profile, |
- Browser* browser, |
- OneClickSigninHelper::AutoAccept auto_accept, |
- const std::string& session_index, |
- const std::string& email, |
- const std::string& password, |
- const std::string& refresh_token, |
- content::WebContents* web_contents, |
- bool untrusted_confirmation_required, |
- signin_metrics::Source source, |
- OneClickSigninSyncStarter::Callback callback); |
- ~StartSyncArgs(); |
- |
- Profile* profile; |
- Browser* browser; |
- OneClickSigninHelper::AutoAccept auto_accept; |
- std::string session_index; |
- std::string email; |
- std::string password; |
- std::string refresh_token; |
- |
- // Web contents in which the sync setup page should be displayed, |
- // if necessary. Can be NULL. |
- content::WebContents* web_contents; |
- |
- OneClickSigninSyncStarter::ConfirmationRequired confirmation_required; |
- signin_metrics::Source source; |
- OneClickSigninSyncStarter::Callback callback; |
- }; |
- |
- // Wrapper to call OneClickSigninSyncStarter after fetching the refresh token |
- // if needed. Also verifies that the cookies are correct if no password is |
- // specified, and checks that the email from the cookies match the expected |
- // email address. |
- class SyncStarterWrapper : public SigninOAuthHelper::Consumer, |
- public chrome::BrowserListObserver { |
- public: |
- SyncStarterWrapper( |
- const OneClickSigninHelper::StartSyncArgs& args, |
- OneClickSigninSyncStarter::StartSyncMode start_mode); |
- ~SyncStarterWrapper() override; |
- |
- void Start(); |
- |
- private: |
- void VerifyGaiaCookiesBeforeSignIn(); |
- void OnGaiaCookiesFetched(const std::string session_index, |
- const net::CookieList& cookie_list); |
- |
- // Virtual to be overridden in tests. |
- virtual void DisplayErrorBubble(const std::string& error_message); |
- virtual void StartSigninOAuthHelper(); |
- virtual void StartOneClickSigninSyncStarter( |
- const std::string& email, |
- const std::string& refresh_token); |
- |
- // Overriden from SigninOAuthHelper::Consumer. |
- void OnSigninOAuthInformationAvailable( |
- const std::string& email, |
- const std::string& display_email, |
- const std::string& refresh_token) override; |
- void OnSigninOAuthInformationFailure( |
- const GoogleServiceAuthError& error) override; |
- |
- // Overriden from chrome::BrowserListObserver. |
- void OnBrowserRemoved(Browser* browser) override; |
- |
- OneClickSigninHelper::StartSyncArgs args_; |
- chrome::HostDesktopType desktop_type_; |
- OneClickSigninSyncStarter::StartSyncMode start_mode_; |
- scoped_ptr<SigninOAuthHelper> signin_oauth_helper_; |
- base::WeakPtrFactory<SyncStarterWrapper> weak_pointer_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SyncStarterWrapper); |
- }; |
- |
- static void LogHistogramValue(int action); |
- |
- // Returns true if the one-click signin feature can be offered at this time. |
- // If |email| is not empty, then the profile is checked to see if it's |
- // already connected to a google account or if the user has already rejected |
- // one-click sign-in with this email, in which cases a one click signin |
- // should not be offered. |
- // |
- // If |can_offer_for| is |CAN_OFFER_FOR_INTERSTITAL_ONLY|, then only do the |
- // checks that would affect the interstitial page. Otherwise, do the checks |
- // that would affect the interstitial and the explicit sign ins. |
- // |
- // Returns in |error_message_id| an explanation as a string resource ID for |
- // why one-clicked cannot be offered. |error_message_id| is valid only if |
- // the return value is false. If no explanation is needed, |error_message_id| |
- // may be null. |
- static bool CanOffer(content::WebContents* web_contents, |
- CanOfferFor can_offer_for, |
- const std::string& email, |
- std::string* error_message); |
- |
- // Returns true if the one-click signin feature can be offered at this time. |
- // It can be offered if the io_data is not in an incognito window and if the |
- // origin of |url| is a valid Gaia sign in origin. This function is meant |
- // to called only from the IO thread. |
- static Offer CanOfferOnIOThread(net::URLRequest* request, |
- ProfileIOData* io_data); |
- |
- // Looks for the Google-Accounts-SignIn response header, and if found, |
- // tries to display an infobar in the tab contents identified by the |
- // child/route id. |
- static void ShowInfoBarIfPossible(net::URLRequest* request, |
- ProfileIOData* io_data, |
- int child_id, |
- int route_id); |
- |
- // Handles cross account sign in error. If the supplied |email| does not match |
- // the last signed in email of the current profile, then Chrome will show a |
- // confirmation dialog before starting sync. It returns true if there is a |
- // cross account error, and false otherwise. |
- static bool HandleCrossAccountError( |
- Profile* profile, |
- const std::string& session_index, |
- const std::string& email, |
- const std::string& password, |
- const std::string& refresh_token, |
- OneClickSigninHelper::AutoAccept auto_accept, |
- signin_metrics::Source source, |
- OneClickSigninSyncStarter::StartSyncMode start_mode, |
- OneClickSigninSyncStarter::Callback sync_callback); |
- |
- static void RedirectToNtpOrAppsPage( |
- content::WebContents* contents, signin_metrics::Source source); |
- |
- // If the |source| is not settings page/webstore, redirects to |
- // the NTP/Apps page. |
- static void RedirectToNtpOrAppsPageIfNecessary( |
- content::WebContents* contents, signin_metrics::Source source); |
- |
- // Remove the item currently at the top of the history list if it's |
- // the Gaia redirect URL. Due to limitations of the NavigationController |
- // this cannot be done until a new page becomes "current". |
- static void RemoveSigninRedirectURLHistoryItem( |
- content::WebContents* web_contents); |
- |
- static void LogConfirmHistogramValue(int action); |
- |
- private: |
- friend class content::WebContentsUserData<OneClickSigninHelper>; |
- friend class OneClickSigninHelperTest; |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIncognitoTest, |
- ShowInfoBarUIThreadIncognito); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperTest, |
- SigninFromWebstoreWithConfigSyncfirst); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperTest, |
- ShowSigninBubbleAfterSigninComplete); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperTest, SigninCancelled); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperTest, SigninFailed); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperTest, |
- CleanTransientStateOnNavigate); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, CanOfferOnIOThread); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadIncognito); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadNoIOData); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadBadURL); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadDisabled); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadSignedIn); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadEmailNotAllowed); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadEmailAlreadyUsed); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CreateTestProfileIOData); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadWithRejectedEmail); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadNoSigninCookies); |
- FRIEND_TEST_ALL_PREFIXES(OneClickSigninHelperIOTest, |
- CanOfferOnIOThreadDisabledByPolicy); |
- |
- // Maximum number of navigations away from the set of valid Gaia URLs before |
- // clearing the internal state of the helper. This is necessary to support |
- // SAML-based accounts, but causes bug crbug.com/181163. |
- static const int kMaxNavigationsSince; |
- |
- explicit OneClickSigninHelper(content::WebContents* web_contents); |
- |
- ~OneClickSigninHelper() override; |
- |
- // Returns true if the one-click signin feature can be offered at this time. |
- // It can be offered if the io_data is not in an incognito window and if the |
- // origin of |url| is a valid Gaia sign in origin. This function is meant |
- // to called only from the IO thread. |
- static Offer CanOfferOnIOThreadImpl(const GURL& url, |
- base::SupportsUserData* request, |
- ProfileIOData* io_data); |
- |
- // The portion of ShowInfoBarIfPossible() that needs to run on the UI thread. |
- // |session_index| and |email| are extracted from the Google-Accounts-SignIn |
- // header. |auto_accept| is extracted from the Google-Chrome-SignIn header. |
- // |source| is used to determine which of the explicit sign in mechanism is |
- // being used. |
- // |
- // |continue_url| is where Gaia will continue to when the sign in process is |
- // done. For explicit sign ins, this is a URL chrome controls. For one-click |
- // sign in, this could be any google property. This URL is used to know |
- // when the sign process is over and to collect infomation from the user |
- // entered on the Gaia sign in page (for explicit sign ins). |
- static void ShowInfoBarUIThread(const std::string& session_index, |
- const std::string& email, |
- AutoAccept auto_accept, |
- signin_metrics::Source source, |
- const GURL& continue_url, |
- int child_id, |
- int route_id); |
- |
- void RedirectToSignin(); |
- |
- // Clear all data member of the helper, except for the error. |
- void CleanTransientState(); |
- |
- // Unitests that use a TestingProfile should call this. |
- // Otherwise, clearing the pending e-mail crashes because the code expects |
- // a real ResourceContext rather than the MockResourceContext a |
- // TestingProfile provides. |
- void SetDoNotClearPendingEmailForTesting(); |
- |
- // In unit tests, disable starting the actual sync. |
- void set_do_not_start_sync_for_testing(); |
- |
- // Called when password has been submitted. |
- void PasswordSubmitted(const autofill::PasswordForm& form); |
- |
- // content::WebContentsObserver overrides. |
- void DidStartNavigationToPendingEntry( |
- const GURL& url, |
- content::NavigationController::ReloadType reload_type) override; |
- void DidNavigateMainFrame( |
- const content::LoadCommittedDetails& details, |
- const content::FrameNavigateParams& params) override; |
- void DidStopLoading(content::RenderViewHost* render_view_host) override; |
- |
- // Tracks if we are in the process of showing the signin or one click |
- // interstitial page. It's set to true the first time we load one of those |
- // pages and set to false when transient state is cleaned. |
- // Note: This should only be used for logging purposes. |
- bool showing_signin_; |
- |
- // Information about the account that has just logged in. |
- std::string session_index_; |
- std::string email_; |
- std::string password_; |
- AutoAccept auto_accept_; |
- signin_metrics::Source source_; |
- bool switched_to_advanced_; |
- GURL continue_url_; |
- // The orignal continue URL after sync setup is complete. |
- GURL original_continue_url_; |
- std::string error_message_; |
- |
- // Number of navigations since starting a sign in that is outside the |
- // the set of trusted Gaia URLs. Sign in attempts that include visits to |
- // one more untrusted will cause a modal dialog to appear asking the user |
- // to confirm, similar to the interstitial flow. |
- int untrusted_navigations_since_signin_visit_; |
- |
- // Whether a Gaia URL during the sign in process was not handled by the |
- // dedicated sign in process (e.g. SAML login, which redirects to a |
- // non-google-controlled domain). |
- // This is set to true if at least one such URL is detected. |
- bool untrusted_confirmation_required_; |
- |
- // Allows unittests to avoid accessing the ResourceContext for clearing a |
- // pending e-mail. |
- bool do_not_clear_pending_email_; |
- |
- // Allows unittest to avoid starting sync for real. |
- bool do_not_start_sync_for_testing_; |
- |
- base::WeakPtrFactory<OneClickSigninHelper> weak_pointer_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(OneClickSigninHelper); |
-}; |
- |
-#endif // CHROME_BROWSER_UI_SYNC_ONE_CLICK_SIGNIN_HELPER_H_ |