If a RemoteFrame asks to navigate, send an OpenURL IPC
[chromium-blink-merge.git] / google_apis / gaia / merge_session_helper.h
blobca82643eefd8940664e7c1ad078cdbb42dce4f94
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
3 // found in the LICENSE file.
5 #ifndef GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_
6 #define GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_
8 #include <deque>
10 #include "base/observer_list.h"
11 #include "base/timer/timer.h"
12 #include "google_apis/gaia/gaia_auth_consumer.h"
13 #include "google_apis/gaia/ubertoken_fetcher.h"
14 #include "net/url_request/url_fetcher_delegate.h"
16 class GaiaAuthFetcher;
17 class GoogleServiceAuthError;
18 class OAuth2TokenService;
20 namespace net {
21 class URLFetcher;
22 class URLRequestContextGetter;
25 // Merges a Google account known to Chrome into the cookie jar. When merging
26 // multiple accounts, one instance of the helper is better than multiple
27 // instances if there is the possibility that they run concurrently, since
28 // changes to the cookie must be serialized.
30 // By default instances of MergeSessionHelper delete themselves when done.
31 class MergeSessionHelper : public GaiaAuthConsumer,
32 public UbertokenConsumer,
33 public net::URLFetcherDelegate {
34 public:
35 class Observer {
36 public:
37 // Called whenever a merge session is completed. The account that was
38 // merged is given by |account_id|. If |error| is equal to
39 // GoogleServiceAuthError::AuthErrorNone() then the merge succeeeded.
40 virtual void MergeSessionCompleted(const std::string& account_id,
41 const GoogleServiceAuthError& error) = 0;
42 protected:
43 virtual ~Observer() {}
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;
56 // Maps tokens to the fetched result for that token.
57 typedef std::map<std::string, std::string> ResultMap;
59 ExternalCcResultFetcher(MergeSessionHelper* helper);
60 virtual ~ExternalCcResultFetcher();
62 // Gets the current value of the external connection check result string.
63 std::string GetExternalCcResult();
65 // Start fetching the external CC result. If a fetch is already in progress
66 // it is canceled.
67 void Start();
69 // Are external URLs still being checked?
70 bool IsRunning();
72 // Returns a copy of the internal token to fetcher map.
73 URLToTokenAndFetcher get_fetcher_map_for_testing() {
74 return fetchers_;
77 // Simulate a timeout for tests.
78 void TimeoutForTests();
80 private:
81 // Overridden from GaiaAuthConsumer.
82 virtual void OnGetCheckConnectionInfoSuccess(
83 const std::string& data) OVERRIDE;
85 // Creates and initializes a URL fetcher for doing a connection check.
86 net::URLFetcher* CreateFetcher(const GURL& url);
88 // Overridden from URLFetcherDelgate.
89 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
91 // Any fetches still ongoing after this call are considered timed out.
92 void Timeout();
94 void CleanupTransientState();
96 MergeSessionHelper* helper_;
97 base::OneShotTimer<ExternalCcResultFetcher> timer_;
98 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_;
99 URLToTokenAndFetcher fetchers_;
100 ResultMap results_;
102 DISALLOW_COPY_AND_ASSIGN(ExternalCcResultFetcher);
105 MergeSessionHelper(OAuth2TokenService* token_service,
106 const std::string& source,
107 net::URLRequestContextGetter* request_context,
108 Observer* observer);
109 virtual ~MergeSessionHelper();
111 void LogIn(const std::string& account_id);
113 // Add or remove observers of this helper.
114 void AddObserver(Observer* observer);
115 void RemoveObserver(Observer* observer);
117 // Cancel all login requests.
118 void CancelAll();
120 // Signout of |account_id| given a list of accounts already signed in.
121 // Since this involves signing out of all accounts and resigning back in,
122 // the order which |accounts| are given is important as it will dictate
123 // the sign in order. |account_id| does not have to be in |accounts|.
124 void LogOut(const std::string& account_id,
125 const std::vector<std::string>& accounts);
127 // Signout all accounts.
128 void LogOutAllAccounts();
130 // Call observers when merge session completes. This public so that callers
131 // that know that a given account is already in the cookie jar can simply
132 // inform the observers.
133 void SignalComplete(const std::string& account_id,
134 const GoogleServiceAuthError& error);
136 // Returns true of there are pending log ins or outs.
137 bool is_running() const { return accounts_.size() > 0; }
139 // Start the process of fetching the external check connection result so that
140 // its ready when we try to perform a merge session.
141 void StartFetchingExternalCcResult();
143 // Returns true if the helper is still fetching external check connection
144 // results.
145 bool StillFetchingExternalCcResult();
147 private:
148 net::URLRequestContextGetter* request_context() { return request_context_; }
150 // Overridden from UbertokenConsumer.
151 virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE;
152 virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
154 // Overridden from GaiaAuthConsumer.
155 virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE;
156 virtual void OnMergeSessionFailure(const GoogleServiceAuthError& error)
157 OVERRIDE;
159 void LogOutInternal(const std::string& account_id,
160 const std::vector<std::string>& accounts);
162 // Starts the proess of fetching the uber token and performing a merge session
163 // for the next account. Virtual so that it can be overriden in tests.
164 virtual void StartFetching();
166 // Virtual for testing purpose.
167 virtual void StartLogOutUrlFetch();
169 // Start the next merge session, if needed.
170 void HandleNextAccount();
172 // Overridden from URLFetcherDelgate.
173 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
175 OAuth2TokenService* token_service_;
176 net::URLRequestContextGetter* request_context_;
177 scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_;
178 scoped_ptr<UbertokenFetcher> uber_token_fetcher_;
179 ExternalCcResultFetcher result_fetcher_;
181 // A worklist for this class. Accounts names are stored here if
182 // we are pending a signin action for that account. Empty strings
183 // represent a signout request.
184 std::deque<std::string> accounts_;
186 // List of observers to notify when merge session completes.
187 // Makes sure list is empty on destruction.
188 ObserverList<Observer, true> observer_list_;
190 // Source to use with GAIA endpoints for accounting.
191 std::string source_;
193 DISALLOW_COPY_AND_ASSIGN(MergeSessionHelper);
196 #endif // GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_