| Index: components/signin/core/browser/gaia_cookie_manager_service.h
|
| diff --git a/components/signin/core/browser/gaia_cookie_manager_service.h b/components/signin/core/browser/gaia_cookie_manager_service.h
|
| index ff9d4b0a07212f90dfaa94bd0cd66aae29008472..74df85d6be98c4cf96abd1788b9d5982cbe8f497 100644
|
| --- a/components/signin/core/browser/gaia_cookie_manager_service.h
|
| +++ b/components/signin/core/browser/gaia_cookie_manager_service.h
|
| @@ -16,6 +16,7 @@
|
| #include "net/url_request/url_fetcher_delegate.h"
|
|
|
| class GaiaAuthFetcher;
|
| +class GaiaCookieRequest;
|
| class GoogleServiceAuthError;
|
| class OAuth2TokenService;
|
|
|
| @@ -36,11 +37,6 @@ class GaiaCookieManagerService : public KeyedService,
|
| public UbertokenConsumer,
|
| public net::URLFetcherDelegate {
|
| public:
|
| - typedef base::Callback<void(const std::string& data,
|
| - const GoogleServiceAuthError& error)>
|
| - ListAccountsCallback;
|
| -
|
| -
|
| enum GaiaCookieRequestType {
|
| ADD_ACCOUNT,
|
| LOG_OUT,
|
| @@ -54,28 +50,19 @@ class GaiaCookieManagerService : public KeyedService,
|
|
|
| GaiaCookieRequestType request_type() const { return request_type_; }
|
| const std::string& account_id() const {return account_id_; }
|
| - const GaiaCookieManagerService::ListAccountsCallback&
|
| - list_accounts_callback() const {
|
| - return list_accounts_callback_;
|
| - }
|
|
|
| static GaiaCookieRequest CreateAddAccountRequest(
|
| const std::string& account_id);
|
| static GaiaCookieRequest CreateLogOutRequest();
|
| - static GaiaCookieRequest CreateListAccountsRequest(
|
| - const GaiaCookieManagerService::ListAccountsCallback&
|
| - list_accounts_callback);
|
| + static GaiaCookieRequest CreateListAccountsRequest();
|
|
|
| private:
|
| GaiaCookieRequest(
|
| GaiaCookieRequestType request_type,
|
| - const std::string& account_id,
|
| - const GaiaCookieManagerService::ListAccountsCallback&
|
| - list_accounts_callback);
|
| + const std::string& account_id);
|
|
|
| GaiaCookieRequestType request_type_;
|
| std::string account_id_;
|
| - GaiaCookieManagerService::ListAccountsCallback list_accounts_callback_;
|
| };
|
|
|
| class Observer {
|
| @@ -85,7 +72,18 @@ class GaiaCookieManagerService : public KeyedService,
|
| // GoogleServiceAuthError::AuthErrorNone() then the merge succeeeded.
|
| virtual void OnAddAccountToCookieCompleted(
|
| const std::string& account_id,
|
| - const GoogleServiceAuthError& error) = 0;
|
| + const GoogleServiceAuthError& error) {}
|
| +
|
| + // Called whenever the GaiaCookieManagerService's list of GAIA accounts is
|
| + // updated. The GCMS monitors the APISID cookie and triggers a /ListAccounts
|
| + // call on change. The GCMS will also call ListAccounts upon the first call
|
| + // to ListAccounts(). The GCMS will delay calling ListAccounts if other
|
| + // requests are in queue that would modify the APISID cookie.
|
| + // If the ListAccounts call fails and the GCMS cannot recover, the reason
|
| + // is passed in |error|.
|
| + virtual void OnGaiaAccountsInCookieUpdated(
|
| + const std::vector<std::pair<std::string, bool> >& accounts,
|
| + const GoogleServiceAuthError& error) {}
|
|
|
| protected:
|
| virtual ~Observer() {}
|
| @@ -158,9 +156,16 @@ class GaiaCookieManagerService : public KeyedService,
|
| SigninClient* signin_client);
|
| ~GaiaCookieManagerService() override;
|
|
|
| + void Init();
|
| + void Shutdown() override;
|
| +
|
| void AddAccountToCookie(const std::string& account_id);
|
|
|
| - void ListAccounts(const ListAccountsCallback& callback);
|
| + // Returns if the listed accounts are up to date or not (ignore the out
|
| + // parameter if return is false). The parameter will be assigned the current
|
| + // cached accounts. If the accounts are not up to date, a ListAccounts fetch
|
| + // is sent GAIA and Observer::OnGaiaAccountsInCookieUpdated will be called.
|
| + bool ListAccounts(std::vector<std::pair<std::string,bool> >* accounts);
|
|
|
| // Add or remove observers of this helper.
|
| void AddObserver(Observer* observer);
|
| @@ -186,11 +191,19 @@ class GaiaCookieManagerService : public KeyedService,
|
| return &external_cc_result_fetcher_;
|
| }
|
|
|
| + void set_list_accounts_fetched_once_for_testing(bool fetched) {
|
| + list_accounts_fetched_once_ = fetched;
|
| + }
|
| +
|
| private:
|
| net::URLRequestContextGetter* request_context() {
|
| return signin_client_->GetURLRequestContext();
|
| }
|
|
|
| + // Called when a cookie changes. If the cookie relates to a GAIA APISID
|
| + // cookie, then we call ListAccounts and fire OnGaiaAccountsInCookieUpdated.
|
| + void OnCookieChanged(const net::CanonicalCookie& cookie, bool removed);
|
| +
|
| // Overridden from UbertokenConsumer.
|
| void OnUbertokenSuccess(const std::string& token) override;
|
| void OnUbertokenFailure(const GoogleServiceAuthError& error) override;
|
| @@ -198,6 +211,8 @@ class GaiaCookieManagerService : public KeyedService,
|
| // Overridden from GaiaAuthConsumer.
|
| void OnMergeSessionSuccess(const std::string& data) override;
|
| void OnMergeSessionFailure(const GoogleServiceAuthError& error) override;
|
| + void OnListAccountsSuccess(const std::string& data) override;
|
| + void OnListAccountsFailure(const GoogleServiceAuthError& error) override;
|
|
|
| // Starts the proess of fetching the uber token and performing a merge session
|
| // for the next account. Virtual so that it can be overriden in tests.
|
| @@ -209,6 +224,9 @@ class GaiaCookieManagerService : public KeyedService,
|
| // Virtual for testing purpose.
|
| virtual void StartLogOutUrlFetch();
|
|
|
| + // Virtual for testing purposes.
|
| + virtual void StartFetchingListAccounts();
|
| +
|
| // Start the next request, if needed.
|
| void HandleNextRequest();
|
|
|
| @@ -229,6 +247,10 @@ class GaiaCookieManagerService : public KeyedService,
|
| // The last fetched ubertoken, for use in MergeSession retries.
|
| std::string uber_token_;
|
|
|
| + // Subscription to be called whenever the GAIA cookies change.
|
| + scoped_ptr<SigninClient::CookieChangedSubscription>
|
| + cookie_changed_subscription_;
|
| +
|
| // A worklist for this class. Stores any pending requests that couldn't be
|
| // executed right away, since this class only permits one request to be
|
| // executed at a time.
|
| @@ -244,6 +266,10 @@ class GaiaCookieManagerService : public KeyedService,
|
| // True once the ExternalCCResultFetcher has completed once.
|
| bool external_cc_result_fetched_;
|
|
|
| + std::vector<std::pair<std::string, bool> > listed_accounts_;
|
| +
|
| + bool list_accounts_fetched_once_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(GaiaCookieManagerService);
|
| };
|
|
|
|
|