blob: f4af8f0413235ed138a5b385a967a09b9f4483d8 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_
#define GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_
#include <deque>
#include "base/observer_list.h"
#include "google_apis/gaia/gaia_auth_consumer.h"
#include "google_apis/gaia/ubertoken_fetcher.h"
#include "net/url_request/url_fetcher_delegate.h"
class GaiaAuthFetcher;
class GoogleServiceAuthError;
class OAuth2TokenService;
namespace net {
class URLRequestContextGetter;
}
// Merges a Google account known to Chrome into the cookie jar. When merging
// multiple accounts, one instance of the helper is better than multiple
// instances if there is the possibility that they run concurrently, since
// changes to the cookie must be serialized.
//
// By default instances of MergeSessionHelper delete themselves when done.
class MergeSessionHelper : public GaiaAuthConsumer,
public UbertokenConsumer,
public net::URLFetcherDelegate {
public:
class Observer {
public:
// Called whenever a merge session is completed. The account that was
// merged is given by |account_id|. If |error| is equal to
// GoogleServiceAuthError::AuthErrorNone() then the merge succeeeded.
virtual void MergeSessionCompleted(const std::string& account_id,
const GoogleServiceAuthError& error) = 0;
protected:
virtual ~Observer() {}
};
MergeSessionHelper(OAuth2TokenService* token_service,
net::URLRequestContextGetter* request_context,
Observer* observer);
virtual ~MergeSessionHelper();
void LogIn(const std::string& account_id);
// Add or remove observers of this helper.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
// Cancel all login requests.
void CancelAll();
// Signout of |account_id| given a list of accounts already signed in.
// Since this involves signing out of all accounts and resigning back in,
// the order which |accounts| are given is important as it will dictate
// the sign in order. |account_id| does not have to be in |accounts|.
void LogOut(const std::string& account_id,
const std::vector<std::string>& accounts);
// Signout all accounts.
void LogOutAllAccounts();
// Call observers when merge session completes. This public so that callers
// that know that a given account is already in the cookie jar can simply
// inform the observers.
void SignalComplete(const std::string& account_id,
const GoogleServiceAuthError& error);
private:
// Overridden from UbertokenConsumer.
virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE;
virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
// Overridden from GaiaAuthConsumer.
virtual void OnMergeSessionSuccess(const std::string& data) OVERRIDE;
virtual void OnMergeSessionFailure(const GoogleServiceAuthError& error)
OVERRIDE;
void LogOutInternal(const std::string& account_id,
const std::vector<std::string>& accounts);
// 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.
virtual void StartFetching();
// Virtual for testing purpose.
virtual void StartLogOutUrlFetch();
// Start the next merge session, if needed.
void HandleNextAccount();
// Overridden from URLFetcherDelgate.
virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
OAuth2TokenService* token_service_;
net::URLRequestContextGetter* request_context_;
scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_;
scoped_ptr<UbertokenFetcher> uber_token_fetcher_;
// A worklist for this class. Accounts names are stored here if
// we are pending a signin action for that account. Empty strings
// represent a signout request.
std::deque<std::string> accounts_;
// List of observers to notify when merge session completes.
// Makes sure list is empty on destruction.
ObserverList<Observer, true> observer_list_;
DISALLOW_COPY_AND_ASSIGN(MergeSessionHelper);
};
#endif // GOOGLE_APIS_GAIA_MERGE_SESSION_HELPER_H_