| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ | 5 #ifndef GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ |
| 6 #define GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ | 6 #define GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 | 9 |
| 10 #include "base/observer_list.h" | 10 #include "base/observer_list.h" |
| 11 #include "base/timer/timer.h" |
| 11 #include "google_apis/gaia/gaia_auth_consumer.h" | 12 #include "google_apis/gaia/gaia_auth_consumer.h" |
| 12 #include "google_apis/gaia/ubertoken_fetcher.h" | 13 #include "google_apis/gaia/ubertoken_fetcher.h" |
| 13 #include "net/url_request/url_fetcher_delegate.h" | 14 #include "net/url_request/url_fetcher_delegate.h" |
| 14 | 15 |
| 15 class GaiaAuthFetcher; | 16 class GaiaAuthFetcher; |
| 16 class GoogleServiceAuthError; | 17 class GoogleServiceAuthError; |
| 17 class OAuth2TokenService; | 18 class OAuth2TokenService; |
| 18 | 19 |
| 19 namespace net { | 20 namespace net { |
| 21 class URLFetcher; |
| 20 class URLRequestContextGetter; | 22 class URLRequestContextGetter; |
| 21 } | 23 } |
| 22 | 24 |
| 23 // Merges a Google account known to Chrome into the cookie jar. When merging | 25 // Merges a Google account known to Chrome into the cookie jar. When merging |
| 24 // multiple accounts, one instance of the helper is better than multiple | 26 // multiple accounts, one instance of the helper is better than multiple |
| 25 // instances if there is the possibility that they run concurrently, since | 27 // instances if there is the possibility that they run concurrently, since |
| 26 // changes to the cookie must be serialized. | 28 // changes to the cookie must be serialized. |
| 27 // | 29 // |
| 28 // By default instances of MergeSessionHelper delete themselves when done. | 30 // By default instances of MergeSessionHelper delete themselves when done. |
| 29 class MergeSessionHelper : public GaiaAuthConsumer, | 31 class MergeSessionHelper : public GaiaAuthConsumer, |
| 30 public UbertokenConsumer, | 32 public UbertokenConsumer, |
| 31 public net::URLFetcherDelegate { | 33 public net::URLFetcherDelegate { |
| 32 public: | 34 public: |
| 33 class Observer { | 35 class Observer { |
| 34 public: | 36 public: |
| 35 // Called whenever a merge session is completed. The account that was | 37 // Called whenever a merge session is completed. The account that was |
| 36 // merged is given by |account_id|. If |error| is equal to | 38 // merged is given by |account_id|. If |error| is equal to |
| 37 // GoogleServiceAuthError::AuthErrorNone() then the merge succeeeded. | 39 // GoogleServiceAuthError::AuthErrorNone() then the merge succeeeded. |
| 38 virtual void MergeSessionCompleted(const std::string& account_id, | 40 virtual void MergeSessionCompleted(const std::string& account_id, |
| 39 const GoogleServiceAuthError& error) = 0; | 41 const GoogleServiceAuthError& error) = 0; |
| 40 protected: | 42 protected: |
| 41 virtual ~Observer() {} | 43 virtual ~Observer() {} |
| 42 }; | 44 }; |
| 43 | 45 |
| 46 // Class to retrieve the external connection check results from gaia. |
| 47 // Declared publicly for unit tests. |
| 48 class ExternalCcResultFetcher : public GaiaAuthConsumer, |
| 49 public net::URLFetcherDelegate { |
| 50 public: |
| 51 // Maps connection URLs, as returned by StartGetCheckConnectionInfo() to |
| 52 // token and URLFetcher used to fetch the URL. |
| 53 typedef std::map<GURL, std::pair<std::string, net::URLFetcher*> > |
| 54 URLToTokenAndFetcher; |
| 55 |
| 56 // Maps tokens to the fetched result for that token. |
| 57 typedef std::map<std::string, std::string> ResultMap; |
| 58 |
| 59 ExternalCcResultFetcher(MergeSessionHelper* helper); |
| 60 virtual ~ExternalCcResultFetcher(); |
| 61 |
| 62 // Gets the current value of the external connection check result string. |
| 63 std::string GetExternalCcResult(); |
| 64 |
| 65 // Start fetching the external CC result. If a fetch is already in progress |
| 66 // it is canceled. |
| 67 void Start(); |
| 68 |
| 69 // Are external URLs still being checked? |
| 70 bool IsRunning(); |
| 71 |
| 72 // Returns a copy of the internal token to fetcher map. |
| 73 URLToTokenAndFetcher get_fetcher_map_for_testing() { |
| 74 return fetchers_; |
| 75 } |
| 76 |
| 77 // Simulate a timeout for tests. |
| 78 void TimeoutForTests(); |
| 79 |
| 80 private: |
| 81 // Overridden from GaiaAuthConsumer. |
| 82 virtual void OnGetCheckConnectionInfoSuccess( |
| 83 const std::string& data) OVERRIDE; |
| 84 |
| 85 // Creates and initializes a URL fetcher for doing a connection check. |
| 86 net::URLFetcher* CreateFetcher(const GURL& url); |
| 87 |
| 88 // Overridden from URLFetcherDelgate. |
| 89 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; |
| 90 |
| 91 // Any fetches still ongoing after this call are considered timed out. |
| 92 void Timeout(); |
| 93 |
| 94 void CleanupTransientState(); |
| 95 |
| 96 MergeSessionHelper* helper_; |
| 97 base::OneShotTimer<ExternalCcResultFetcher> timer_; |
| 98 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; |
| 99 URLToTokenAndFetcher fetchers_; |
| 100 ResultMap results_; |
| 101 |
| 102 DISALLOW_COPY_AND_ASSIGN(ExternalCcResultFetcher); |
| 103 }; |
| 104 |
| 44 MergeSessionHelper(OAuth2TokenService* token_service, | 105 MergeSessionHelper(OAuth2TokenService* token_service, |
| 45 net::URLRequestContextGetter* request_context, | 106 net::URLRequestContextGetter* request_context, |
| 46 Observer* observer); | 107 Observer* observer); |
| 47 virtual ~MergeSessionHelper(); | 108 virtual ~MergeSessionHelper(); |
| 48 | 109 |
| 49 void LogIn(const std::string& account_id); | 110 void LogIn(const std::string& account_id); |
| 50 | 111 |
| 51 // Add or remove observers of this helper. | 112 // Add or remove observers of this helper. |
| 52 void AddObserver(Observer* observer); | 113 void AddObserver(Observer* observer); |
| 53 void RemoveObserver(Observer* observer); | 114 void RemoveObserver(Observer* observer); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 67 | 128 |
| 68 // Call observers when merge session completes. This public so that callers | 129 // Call observers when merge session completes. This public so that callers |
| 69 // that know that a given account is already in the cookie jar can simply | 130 // that know that a given account is already in the cookie jar can simply |
| 70 // inform the observers. | 131 // inform the observers. |
| 71 void SignalComplete(const std::string& account_id, | 132 void SignalComplete(const std::string& account_id, |
| 72 const GoogleServiceAuthError& error); | 133 const GoogleServiceAuthError& error); |
| 73 | 134 |
| 74 // Returns true of there are pending log ins or outs. | 135 // Returns true of there are pending log ins or outs. |
| 75 bool is_running() const { return accounts_.size() > 0; } | 136 bool is_running() const { return accounts_.size() > 0; } |
| 76 | 137 |
| 138 // Start the process of fetching the external check connection result so that |
| 139 // its ready when we try to perform a merge session. |
| 140 void StartFetchingExternalCcResult(); |
| 141 |
| 142 // Returns true if the helper is still fetching external check connection |
| 143 // results. |
| 144 bool StillFetchingExternalCcResult(); |
| 145 |
| 77 private: | 146 private: |
| 147 net::URLRequestContextGetter* request_context() { return request_context_; } |
| 148 |
| 78 // Overridden from UbertokenConsumer. | 149 // Overridden from UbertokenConsumer. |
| 79 virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE; | 150 virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE; |
| 80 virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE; | 151 virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE; |
| 81 | 152 |
| 82 // Overridden from GaiaAuthConsumer. | 153 // Overridden from GaiaAuthConsumer. |
| 83 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE; | 154 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE; |
| 84 virtual void OnMergeSessionFailure(const GoogleServiceAuthError& error) | 155 virtual void OnMergeSessionFailure(const GoogleServiceAuthError& error) |
| 85 OVERRIDE; | 156 OVERRIDE; |
| 86 | 157 |
| 87 void LogOutInternal(const std::string& account_id, | 158 void LogOutInternal(const std::string& account_id, |
| 88 const std::vector<std::string>& accounts); | 159 const std::vector<std::string>& accounts); |
| 89 | 160 |
| 90 // Starts the proess of fetching the uber token and performing a merge session | 161 // Starts the proess of fetching the uber token and performing a merge session |
| 91 // for the next account. Virtual so that it can be overriden in tests. | 162 // for the next account. Virtual so that it can be overriden in tests. |
| 92 virtual void StartFetching(); | 163 virtual void StartFetching(); |
| 93 | 164 |
| 94 // Virtual for testing purpose. | 165 // Virtual for testing purpose. |
| 95 virtual void StartLogOutUrlFetch(); | 166 virtual void StartLogOutUrlFetch(); |
| 96 | 167 |
| 97 // Start the next merge session, if needed. | 168 // Start the next merge session, if needed. |
| 98 void HandleNextAccount(); | 169 void HandleNextAccount(); |
| 99 | 170 |
| 100 // Overridden from URLFetcherDelgate. | 171 // Overridden from URLFetcherDelgate. |
| 101 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; | 172 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; |
| 102 | 173 |
| 103 OAuth2TokenService* token_service_; | 174 OAuth2TokenService* token_service_; |
| 104 net::URLRequestContextGetter* request_context_; | 175 net::URLRequestContextGetter* request_context_; |
| 105 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; | 176 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; |
| 106 scoped_ptr<UbertokenFetcher> uber_token_fetcher_; | 177 scoped_ptr<UbertokenFetcher> uber_token_fetcher_; |
| 178 ExternalCcResultFetcher result_fetcher_; |
| 107 | 179 |
| 108 // A worklist for this class. Accounts names are stored here if | 180 // A worklist for this class. Accounts names are stored here if |
| 109 // we are pending a signin action for that account. Empty strings | 181 // we are pending a signin action for that account. Empty strings |
| 110 // represent a signout request. | 182 // represent a signout request. |
| 111 std::deque<std::string> accounts_; | 183 std::deque<std::string> accounts_; |
| 112 | 184 |
| 113 // List of observers to notify when merge session completes. | 185 // List of observers to notify when merge session completes. |
| 114 // Makes sure list is empty on destruction. | 186 // Makes sure list is empty on destruction. |
| 115 ObserverList<Observer, true> observer_list_; | 187 ObserverList<Observer, true> observer_list_; |
| 116 | 188 |
| 117 DISALLOW_COPY_AND_ASSIGN(MergeSessionHelper); | 189 DISALLOW_COPY_AND_ASSIGN(MergeSessionHelper); |
| 118 }; | 190 }; |
| 119 | 191 |
| 120 #endif // GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ | 192 #endif // GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ |
| OLD | NEW |