Commit 83062a96 authored by rogerta@chromium.org's avatar rogerta@chromium.org

Make OAuth2TokenService::Request class multi-login aware.

BUG=277149

Review URL: https://codereview.chromium.org/57103002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232941 0039d316-1c4b-4281-b951-d872f2087c98
parent a5ff2a81
...@@ -38,6 +38,7 @@ class DeviceOAuth2TokenService::ValidatingConsumer ...@@ -38,6 +38,7 @@ class DeviceOAuth2TokenService::ValidatingConsumer
public gaia::GaiaOAuthClient::Delegate { public gaia::GaiaOAuthClient::Delegate {
public: public:
explicit ValidatingConsumer(DeviceOAuth2TokenService* token_service, explicit ValidatingConsumer(DeviceOAuth2TokenService* token_service,
const std::string& account_id,
Consumer* consumer); Consumer* consumer);
virtual ~ValidatingConsumer(); virtual ~ValidatingConsumer();
...@@ -85,8 +86,9 @@ class DeviceOAuth2TokenService::ValidatingConsumer ...@@ -85,8 +86,9 @@ class DeviceOAuth2TokenService::ValidatingConsumer
DeviceOAuth2TokenService::ValidatingConsumer::ValidatingConsumer( DeviceOAuth2TokenService::ValidatingConsumer::ValidatingConsumer(
DeviceOAuth2TokenService* token_service, DeviceOAuth2TokenService* token_service,
const std::string& account_id,
Consumer* consumer) Consumer* consumer)
: OAuth2TokenService::RequestImpl(this), : OAuth2TokenService::RequestImpl(account_id, this),
token_service_(token_service), token_service_(token_service),
consumer_(consumer), consumer_(consumer),
token_validation_done_(false), token_validation_done_(false),
...@@ -276,13 +278,14 @@ net::URLRequestContextGetter* DeviceOAuth2TokenService::GetRequestContext() { ...@@ -276,13 +278,14 @@ net::URLRequestContextGetter* DeviceOAuth2TokenService::GetRequestContext() {
scoped_ptr<OAuth2TokenService::RequestImpl> scoped_ptr<OAuth2TokenService::RequestImpl>
DeviceOAuth2TokenService::CreateRequest( DeviceOAuth2TokenService::CreateRequest(
const std::string& account_id,
OAuth2TokenService::Consumer* consumer) { OAuth2TokenService::Consumer* consumer) {
if (refresh_token_is_valid_) if (refresh_token_is_valid_)
return OAuth2TokenService::CreateRequest(consumer); return OAuth2TokenService::CreateRequest(account_id, consumer);
// Substitute our own consumer to wait for refresh token validation. // Substitute our own consumer to wait for refresh token validation.
scoped_ptr<ValidatingConsumer> validating_consumer( scoped_ptr<ValidatingConsumer> validating_consumer(
new ValidatingConsumer(this, consumer)); new ValidatingConsumer(this, account_id, consumer));
validating_consumer->StartValidation(); validating_consumer->StartValidation();
return validating_consumer.PassAs<RequestImpl>(); return validating_consumer.PassAs<RequestImpl>();
} }
......
...@@ -61,6 +61,7 @@ class DeviceOAuth2TokenService : public OAuth2TokenService { ...@@ -61,6 +61,7 @@ class DeviceOAuth2TokenService : public OAuth2TokenService {
// Implementation of OAuth2TokenService. // Implementation of OAuth2TokenService.
virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE; virtual net::URLRequestContextGetter* GetRequestContext() OVERRIDE;
virtual scoped_ptr<OAuth2TokenService::RequestImpl> CreateRequest( virtual scoped_ptr<OAuth2TokenService::RequestImpl> CreateRequest(
const std::string& account_id,
OAuth2TokenService::Consumer* consumer) OVERRIDE; OAuth2TokenService::Consumer* consumer) OVERRIDE;
private: private:
......
...@@ -33,6 +33,8 @@ class ProfileOAuth2TokenServiceRequest::Core ...@@ -33,6 +33,8 @@ class ProfileOAuth2TokenServiceRequest::Core
// thread. // thread.
void Stop(); void Stop();
OAuth2TokenService::Request* request();
// OAuth2TokenService::Consumer. It should be called on the UI thread. // OAuth2TokenService::Consumer. It should be called on the UI thread.
virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
const std::string& access_token, const std::string& access_token,
...@@ -124,6 +126,10 @@ void ProfileOAuth2TokenServiceRequest::Core::Stop() { ...@@ -124,6 +126,10 @@ void ProfileOAuth2TokenServiceRequest::Core::Stop() {
} }
} }
OAuth2TokenService::Request* ProfileOAuth2TokenServiceRequest::Core::request() {
return request_.get();
}
void ProfileOAuth2TokenServiceRequest::Core::StopOnUIThread() { void ProfileOAuth2TokenServiceRequest::Core::StopOnUIThread() {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
request_.reset(); request_.reset();
...@@ -211,3 +217,8 @@ ProfileOAuth2TokenServiceRequest::~ProfileOAuth2TokenServiceRequest() { ...@@ -211,3 +217,8 @@ ProfileOAuth2TokenServiceRequest::~ProfileOAuth2TokenServiceRequest() {
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
core_->Stop(); core_->Stop();
} }
std::string ProfileOAuth2TokenServiceRequest::GetAccountId() const {
return core_->request()->GetAccountId();
}
...@@ -34,6 +34,9 @@ class ProfileOAuth2TokenServiceRequest : public OAuth2TokenService::Request, ...@@ -34,6 +34,9 @@ class ProfileOAuth2TokenServiceRequest : public OAuth2TokenService::Request,
virtual ~ProfileOAuth2TokenServiceRequest(); virtual ~ProfileOAuth2TokenServiceRequest();
// Overridden from Request:
virtual std::string GetAccountId() const OVERRIDE;
private: private:
class Core; class Core;
friend class Core; friend class Core;
...@@ -42,6 +45,7 @@ class ProfileOAuth2TokenServiceRequest : public OAuth2TokenService::Request, ...@@ -42,6 +45,7 @@ class ProfileOAuth2TokenServiceRequest : public OAuth2TokenService::Request,
const std::string& account_id, const std::string& account_id,
const OAuth2TokenService::ScopeSet& scopes, const OAuth2TokenService::ScopeSet& scopes,
OAuth2TokenService::Consumer* consumer); OAuth2TokenService::Consumer* consumer);
OAuth2TokenService::Consumer* const consumer_; OAuth2TokenService::Consumer* const consumer_;
scoped_refptr<Core> core_; scoped_refptr<Core> core_;
......
...@@ -47,14 +47,20 @@ bool OAuth2TokenService::RequestParameters::operator<( ...@@ -47,14 +47,20 @@ bool OAuth2TokenService::RequestParameters::operator<(
} }
OAuth2TokenService::RequestImpl::RequestImpl( OAuth2TokenService::RequestImpl::RequestImpl(
const std::string& account_id,
OAuth2TokenService::Consumer* consumer) OAuth2TokenService::Consumer* consumer)
: consumer_(consumer) { : account_id_(account_id),
consumer_(consumer) {
} }
OAuth2TokenService::RequestImpl::~RequestImpl() { OAuth2TokenService::RequestImpl::~RequestImpl() {
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
} }
std::string OAuth2TokenService::RequestImpl::GetAccountId() const {
return account_id_;
}
void OAuth2TokenService::RequestImpl::InformConsumer( void OAuth2TokenService::RequestImpl::InformConsumer(
const GoogleServiceAuthError& error, const GoogleServiceAuthError& error,
const std::string& access_token, const std::string& access_token,
...@@ -445,7 +451,7 @@ OAuth2TokenService::StartRequestForClientWithContext( ...@@ -445,7 +451,7 @@ OAuth2TokenService::StartRequestForClientWithContext(
Consumer* consumer) { Consumer* consumer) {
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
scoped_ptr<RequestImpl> request = CreateRequest(consumer); scoped_ptr<RequestImpl> request = CreateRequest(account_id, consumer);
if (!RefreshTokenIsAvailable(account_id)) { if (!RefreshTokenIsAvailable(account_id)) {
base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
...@@ -474,8 +480,9 @@ OAuth2TokenService::StartRequestForClientWithContext( ...@@ -474,8 +480,9 @@ OAuth2TokenService::StartRequestForClientWithContext(
} }
scoped_ptr<OAuth2TokenService::RequestImpl> OAuth2TokenService::CreateRequest( scoped_ptr<OAuth2TokenService::RequestImpl> OAuth2TokenService::CreateRequest(
const std::string& account_id,
Consumer* consumer) { Consumer* consumer) {
return scoped_ptr<RequestImpl>(new RequestImpl(consumer)); return scoped_ptr<RequestImpl>(new RequestImpl(account_id, consumer));
} }
void OAuth2TokenService::FetchOAuth2Token(RequestImpl* request, void OAuth2TokenService::FetchOAuth2Token(RequestImpl* request,
......
...@@ -56,6 +56,7 @@ class OAuth2TokenService : public base::NonThreadSafe { ...@@ -56,6 +56,7 @@ class OAuth2TokenService : public base::NonThreadSafe {
class Request { class Request {
public: public:
virtual ~Request(); virtual ~Request();
virtual std::string GetAccountId() const = 0;
protected: protected:
Request(); Request();
}; };
...@@ -177,9 +178,12 @@ class OAuth2TokenService : public base::NonThreadSafe { ...@@ -177,9 +178,12 @@ class OAuth2TokenService : public base::NonThreadSafe {
public Request { public Request {
public: public:
// |consumer| is required to outlive this. // |consumer| is required to outlive this.
explicit RequestImpl(Consumer* consumer); explicit RequestImpl(const std::string& account_id, Consumer* consumer);
virtual ~RequestImpl(); virtual ~RequestImpl();
// Overridden from Request:
virtual std::string GetAccountId() const OVERRIDE;
// Informs |consumer_| that this request is completed. // Informs |consumer_| that this request is completed.
void InformConsumer(const GoogleServiceAuthError& error, void InformConsumer(const GoogleServiceAuthError& error,
const std::string& access_token, const std::string& access_token,
...@@ -187,6 +191,7 @@ class OAuth2TokenService : public base::NonThreadSafe { ...@@ -187,6 +191,7 @@ class OAuth2TokenService : public base::NonThreadSafe {
private: private:
// |consumer_| to call back when this request completes. // |consumer_| to call back when this request completes.
const std::string account_id_;
Consumer* const consumer_; Consumer* const consumer_;
}; };
...@@ -230,7 +235,9 @@ class OAuth2TokenService : public base::NonThreadSafe { ...@@ -230,7 +235,9 @@ class OAuth2TokenService : public base::NonThreadSafe {
// Creates a request implementation. Can be overriden by derived classes to // Creates a request implementation. Can be overriden by derived classes to
// provide additional control of token consumption. |consumer| will outlive // provide additional control of token consumption. |consumer| will outlive
// the created request. // the created request.
virtual scoped_ptr<RequestImpl> CreateRequest(Consumer* consumer); virtual scoped_ptr<RequestImpl> CreateRequest(
const std::string& account_id,
Consumer* consumer);
// Fetches an OAuth token for the specified client/scopes. Virtual so it can // Fetches an OAuth token for the specified client/scopes. Virtual so it can
// be overridden for tests and for platform-specific behavior on Android. // be overridden for tests and for platform-specific behavior on Android.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment