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 |