Chromium Code Reviews| 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 class ExternalCcResultFetcher : public GaiaAuthConsumer, | |
|
Alexei Svitkine (slow)
2014/08/08 21:16:48
Is there a reason this class is in the public sect
Roger Tawa OOO till Jul 10th
2014/08/09 15:58:28
Yes for unit tests.
Alexei Svitkine (slow)
2014/08/11 14:04:51
Makes sense. Please add a line to the comment to m
Roger Tawa OOO till Jul 10th
2014/08/11 20:20:54
Done.
| |
| 48 public net::URLFetcherDelegate { | |
| 49 public: | |
| 50 // Maps connection URLs, as returned by StartGetCheckConnectionInfo() to | |
| 51 // token and URLFetcher used to fetch the URL. | |
| 52 typedef std::map<GURL, std::pair<std::string, net::URLFetcher*> > | |
| 53 URLToTokenAndFetcher; | |
| 54 | |
| 55 // Maps tokens to the fetched result for that token. | |
| 56 typedef std::map<std::string, std::string> ResultMap; | |
| 57 | |
| 58 ExternalCcResultFetcher(MergeSessionHelper* helper); | |
| 59 virtual ~ExternalCcResultFetcher(); | |
| 60 | |
| 61 // Gets the current value of the external connection check result string. | |
| 62 std::string GetExternalCcResult(); | |
| 63 | |
| 64 // Start fetching the external CC result. If a fetch is already in progress | |
| 65 // it is canceled. | |
| 66 void Start(); | |
| 67 | |
| 68 // Are external URLs still being checked? | |
| 69 bool IsRunning(); | |
| 70 | |
| 71 // Returns a copy of the internal token to fetcher map. | |
| 72 URLToTokenAndFetcher get_fetcher_map_for_testing() { | |
| 73 return fetchers_; | |
| 74 } | |
| 75 | |
| 76 // Simulate a timeout for tests. | |
| 77 void TimeoutForTests() { | |
|
Alexei Svitkine (slow)
2014/08/08 21:16:48
Nit: Non-trivial methods (those not using hacker_s
Roger Tawa OOO till Jul 10th
2014/08/09 15:58:28
It is trivial.
Alexei Svitkine (slow)
2014/08/11 14:04:51
I don't think it qualifiers per our style guide:
Roger Tawa OOO till Jul 10th
2014/08/11 20:20:54
Done.
| |
| 78 Timeout(); | |
| 79 } | |
| 80 | |
| 81 private: | |
| 82 // Overridden from GaiaAuthConsumer. | |
| 83 virtual void OnGetCheckConnectionInfoSuccess( | |
| 84 const std::string& data) OVERRIDE; | |
| 85 | |
| 86 // Creates and initializes a URL fetcher for doing a connection check. | |
| 87 net::URLFetcher* CreateFetcher(const GURL& url); | |
| 88 | |
| 89 // Overridden from URLFetcherDelgate. | |
| 90 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; | |
| 91 | |
| 92 // Any fetches still ongoing after this call are considered timed out. | |
| 93 void Timeout(); | |
| 94 | |
| 95 void CleanupTransientState(); | |
| 96 | |
| 97 MergeSessionHelper* helper_; | |
| 98 base::OneShotTimer<ExternalCcResultFetcher> timer_; | |
| 99 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; | |
| 100 URLToTokenAndFetcher fetchers_; | |
| 101 ResultMap results_; | |
| 102 }; | |
|
Alexei Svitkine (slow)
2014/08/08 21:16:48
Nit: DISALLOW_COPY_AND_ASSIGN.
Roger Tawa OOO till Jul 10th
2014/08/09 15:58:28
Done.
| |
| 103 | |
| 44 MergeSessionHelper(OAuth2TokenService* token_service, | 104 MergeSessionHelper(OAuth2TokenService* token_service, |
| 45 net::URLRequestContextGetter* request_context, | 105 net::URLRequestContextGetter* request_context, |
| 46 Observer* observer); | 106 Observer* observer); |
| 47 virtual ~MergeSessionHelper(); | 107 virtual ~MergeSessionHelper(); |
| 48 | 108 |
| 49 void LogIn(const std::string& account_id); | 109 void LogIn(const std::string& account_id); |
| 50 | 110 |
| 51 // Add or remove observers of this helper. | 111 // Add or remove observers of this helper. |
| 52 void AddObserver(Observer* observer); | 112 void AddObserver(Observer* observer); |
| 53 void RemoveObserver(Observer* observer); | 113 void RemoveObserver(Observer* observer); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 67 | 127 |
| 68 // Call observers when merge session completes. This public so that callers | 128 // 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 | 129 // that know that a given account is already in the cookie jar can simply |
| 70 // inform the observers. | 130 // inform the observers. |
| 71 void SignalComplete(const std::string& account_id, | 131 void SignalComplete(const std::string& account_id, |
| 72 const GoogleServiceAuthError& error); | 132 const GoogleServiceAuthError& error); |
| 73 | 133 |
| 74 // Returns true of there are pending log ins or outs. | 134 // Returns true of there are pending log ins or outs. |
| 75 bool is_running() const { return accounts_.size() > 0; } | 135 bool is_running() const { return accounts_.size() > 0; } |
| 76 | 136 |
| 137 // Start the process of fetching the external check connection result so that | |
| 138 // its ready when we try to perform a merge session. | |
| 139 void StartFetchingExternalCcResult(); | |
| 140 | |
| 141 // Returns true if the helper is still fetching external check connection | |
| 142 // results. | |
| 143 bool StillFetchingExternalCcResult(); | |
| 144 | |
| 77 private: | 145 private: |
| 146 net::URLRequestContextGetter* request_context() { return request_context_; } | |
| 147 | |
| 78 // Overridden from UbertokenConsumer. | 148 // Overridden from UbertokenConsumer. |
| 79 virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE; | 149 virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE; |
| 80 virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE; | 150 virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE; |
| 81 | 151 |
| 82 // Overridden from GaiaAuthConsumer. | 152 // Overridden from GaiaAuthConsumer. |
| 83 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE; | 153 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE; |
| 84 virtual void OnMergeSessionFailure(const GoogleServiceAuthError& error) | 154 virtual void OnMergeSessionFailure(const GoogleServiceAuthError& error) |
| 85 OVERRIDE; | 155 OVERRIDE; |
| 86 | 156 |
| 87 void LogOutInternal(const std::string& account_id, | 157 void LogOutInternal(const std::string& account_id, |
| 88 const std::vector<std::string>& accounts); | 158 const std::vector<std::string>& accounts); |
| 89 | 159 |
| 90 // Starts the proess of fetching the uber token and performing a merge session | 160 // 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. | 161 // for the next account. Virtual so that it can be overriden in tests. |
| 92 virtual void StartFetching(); | 162 virtual void StartFetching(); |
| 93 | 163 |
| 94 // Virtual for testing purpose. | 164 // Virtual for testing purpose. |
| 95 virtual void StartLogOutUrlFetch(); | 165 virtual void StartLogOutUrlFetch(); |
| 96 | 166 |
| 97 // Start the next merge session, if needed. | 167 // Start the next merge session, if needed. |
| 98 void HandleNextAccount(); | 168 void HandleNextAccount(); |
| 99 | 169 |
| 100 // Overridden from URLFetcherDelgate. | 170 // Overridden from URLFetcherDelgate. |
| 101 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; | 171 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; |
| 102 | 172 |
| 103 OAuth2TokenService* token_service_; | 173 OAuth2TokenService* token_service_; |
| 104 net::URLRequestContextGetter* request_context_; | 174 net::URLRequestContextGetter* request_context_; |
| 105 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; | 175 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_; |
| 106 scoped_ptr<UbertokenFetcher> uber_token_fetcher_; | 176 scoped_ptr<UbertokenFetcher> uber_token_fetcher_; |
| 177 ExternalCcResultFetcher result_fetcher_; | |
| 107 | 178 |
| 108 // A worklist for this class. Accounts names are stored here if | 179 // A worklist for this class. Accounts names are stored here if |
| 109 // we are pending a signin action for that account. Empty strings | 180 // we are pending a signin action for that account. Empty strings |
| 110 // represent a signout request. | 181 // represent a signout request. |
| 111 std::deque<std::string> accounts_; | 182 std::deque<std::string> accounts_; |
| 112 | 183 |
| 113 // List of observers to notify when merge session completes. | 184 // List of observers to notify when merge session completes. |
| 114 // Makes sure list is empty on destruction. | 185 // Makes sure list is empty on destruction. |
| 115 ObserverList<Observer, true> observer_list_; | 186 ObserverList<Observer, true> observer_list_; |
| 116 | 187 |
| 117 DISALLOW_COPY_AND_ASSIGN(MergeSessionHelper); | 188 DISALLOW_COPY_AND_ASSIGN(MergeSessionHelper); |
| 118 }; | 189 }; |
| 119 | 190 |
| 120 #endif // GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ | 191 #endif // GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_ |
| OLD | NEW |