Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(196)

Side by Side Diff: chrome/browser/signin/oauth2_token_service.cc

Issue 11817045: Move auth-error reporting code out of SyncGlobalError and into SigninGlobalError (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Disabled ExtensionActionContextMenuTest.BrowserAction Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 #include "chrome/browser/signin/oauth2_token_service.h" 5 #include "chrome/browser/signin/oauth2_token_service.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/weak_ptr.h" 10 #include "base/memory/weak_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/rand_util.h" 12 #include "base/rand_util.h"
13 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "base/timer.h" 15 #include "base/timer.h"
16 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/signin/oauth2_token_service_factory.h" 17 #include "chrome/browser/signin/oauth2_token_service_factory.h"
18 #include "chrome/browser/signin/signin_manager.h"
19 #include "chrome/browser/signin/signin_manager_factory.h"
18 #include "chrome/browser/signin/token_service.h" 20 #include "chrome/browser/signin/token_service.h"
19 #include "chrome/browser/signin/token_service_factory.h" 21 #include "chrome/browser/signin/token_service_factory.h"
20 #include "chrome/common/chrome_notification_types.h" 22 #include "chrome/common/chrome_notification_types.h"
21 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/browser_thread.h"
22 #include "content/public/browser/notification_details.h" 24 #include "content/public/browser/notification_details.h"
23 #include "content/public/browser/notification_source.h" 25 #include "content/public/browser/notification_source.h"
24 #include "google_apis/gaia/gaia_constants.h" 26 #include "google_apis/gaia/gaia_constants.h"
25 #include "google_apis/gaia/gaia_urls.h" 27 #include "google_apis/gaia/gaia_urls.h"
26 #include "google_apis/gaia/google_service_auth_error.h" 28 #include "google_apis/gaia/google_service_auth_error.h"
27 #include "google_apis/gaia/oauth2_access_token_consumer.h" 29 #include "google_apis/gaia/oauth2_access_token_consumer.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 const OAuth2TokenService::ScopeSet& scopes, 124 const OAuth2TokenService::ScopeSet& scopes,
123 base::WeakPtr<RequestImpl> waiting_request); 125 base::WeakPtr<RequestImpl> waiting_request);
124 virtual ~Fetcher(); 126 virtual ~Fetcher();
125 127
126 // Add a request that is waiting for the result of this Fetcher. 128 // Add a request that is waiting for the result of this Fetcher.
127 void AddWaitingRequest(base::WeakPtr<RequestImpl> waiting_request); 129 void AddWaitingRequest(base::WeakPtr<RequestImpl> waiting_request);
128 130
129 const OAuth2TokenService::ScopeSet& GetScopeSet() const; 131 const OAuth2TokenService::ScopeSet& GetScopeSet() const;
130 const std::string& GetRefreshToken() const; 132 const std::string& GetRefreshToken() const;
131 133
134 // The error result from this fetcher.
135 const GoogleServiceAuthError& error() const { return error_; }
136
132 protected: 137 protected:
133 // OAuth2AccessTokenConsumer 138 // OAuth2AccessTokenConsumer
134 virtual void OnGetTokenSuccess(const std::string& access_token, 139 virtual void OnGetTokenSuccess(const std::string& access_token,
135 const base::Time& expiration_date) OVERRIDE; 140 const base::Time& expiration_date) OVERRIDE;
136 virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE; 141 virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
137 142
138 private: 143 private:
139 Fetcher(Profile* profile, 144 Fetcher(Profile* profile,
140 net::URLRequestContextGetter* getter, 145 net::URLRequestContextGetter* getter,
141 const std::string& refresh_token, 146 const std::string& refresh_token,
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 314
310 OAuth2TokenService::Request::~Request() { 315 OAuth2TokenService::Request::~Request() {
311 } 316 }
312 317
313 OAuth2TokenService::Consumer::Consumer() { 318 OAuth2TokenService::Consumer::Consumer() {
314 } 319 }
315 320
316 OAuth2TokenService::Consumer::~Consumer() { 321 OAuth2TokenService::Consumer::~Consumer() {
317 } 322 }
318 323
319 OAuth2TokenService::OAuth2TokenService() : profile_(NULL) { 324 OAuth2TokenService::OAuth2TokenService()
325 : profile_(NULL),
326 last_auth_error_(GoogleServiceAuthError::NONE) {
320 } 327 }
321 328
322 OAuth2TokenService::~OAuth2TokenService() { 329 OAuth2TokenService::~OAuth2TokenService() {
323 // Release all the pending fetchers. 330 // Release all the pending fetchers.
324 STLDeleteContainerPairSecondPointers( 331 STLDeleteContainerPairSecondPointers(
325 pending_fetchers_.begin(), pending_fetchers_.end()); 332 pending_fetchers_.begin(), pending_fetchers_.end());
326 } 333 }
327 334
328 void OAuth2TokenService::Initialize(Profile* profile) { 335 void OAuth2TokenService::Initialize(Profile* profile) {
329 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 336 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
330 337
331 DCHECK(profile); 338 DCHECK(profile);
332 DCHECK(!profile_); 339 DCHECK(!profile_);
333 profile_ = profile; 340 profile_ = profile;
334 getter_ = profile->GetRequestContext(); 341 getter_ = profile->GetRequestContext();
335 content::Source<TokenService> token_service_source( 342 content::Source<TokenService> token_service_source(
336 TokenServiceFactory::GetForProfile(profile)); 343 TokenServiceFactory::GetForProfile(profile));
337 registrar_.Add(this, 344 registrar_.Add(this,
338 chrome::NOTIFICATION_TOKENS_CLEARED, 345 chrome::NOTIFICATION_TOKENS_CLEARED,
339 token_service_source); 346 token_service_source);
340 registrar_.Add(this, 347 registrar_.Add(this,
341 chrome::NOTIFICATION_TOKEN_AVAILABLE, 348 chrome::NOTIFICATION_TOKEN_AVAILABLE,
342 token_service_source); 349 token_service_source);
350 SigninManagerFactory::GetForProfile(profile_)->signin_global_error()->
351 AddProvider(this);
343 } 352 }
344 353
354 void OAuth2TokenService::Shutdown() {
355 if (profile_) {
356 SigninManagerFactory::GetForProfile(profile_)->signin_global_error()->
357 RemoveProvider(this);
358 }
359 }
360
361
345 // static 362 // static
346 void OAuth2TokenService::InformConsumer( 363 void OAuth2TokenService::InformConsumer(
347 base::WeakPtr<OAuth2TokenService::RequestImpl> request, 364 base::WeakPtr<OAuth2TokenService::RequestImpl> request,
348 GoogleServiceAuthError error, 365 GoogleServiceAuthError error,
349 std::string access_token, 366 std::string access_token,
350 base::Time expiration_date) { 367 base::Time expiration_date) {
351 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 368 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
352 369
353 if (request) 370 if (request)
354 request->InformConsumer(error, access_token, expiration_date); 371 request->InformConsumer(error, access_token, expiration_date);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 return request.PassAs<Request>(); 423 return request.PassAs<Request>();
407 } 424 }
408 pending_fetchers_[fetch_parameters] = Fetcher::CreateAndStart( 425 pending_fetchers_[fetch_parameters] = Fetcher::CreateAndStart(
409 profile_, getter_, refresh_token, scopes, request->AsWeakPtr()); 426 profile_, getter_, refresh_token, scopes, request->AsWeakPtr());
410 return request.PassAs<Request>(); 427 return request.PassAs<Request>();
411 } 428 }
412 429
413 void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) { 430 void OAuth2TokenService::OnFetchComplete(Fetcher* fetcher) {
414 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 431 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
415 432
433 // Update the auth error state so auth errors are appropriately communicated
434 // to the user.
435 UpdateAuthError(fetcher->error());
436
416 // Note |fetcher| is recorded in |pending_fetcher_| mapped to its refresh 437 // Note |fetcher| is recorded in |pending_fetcher_| mapped to its refresh
417 // token and scope set. This is guaranteed as follows; here a Fetcher is said 438 // token and scope set. This is guaranteed as follows; here a Fetcher is said
418 // to be uncompleted if it has not finished calling back 439 // to be uncompleted if it has not finished calling back
419 // OAuth2TokenService::OnFetchComplete(). 440 // OAuth2TokenService::OnFetchComplete().
420 // 441 //
421 // (1) All the live Fetchers are created by this service. 442 // (1) All the live Fetchers are created by this service.
422 // This is because (1) all the live Fetchers are created by a live 443 // This is because (1) all the live Fetchers are created by a live
423 // service, as all the fetchers created by a service are destructed in the 444 // service, as all the fetchers created by a service are destructed in the
424 // service's dtor, and (2) there is at most one live OAuth2TokenSevice for 445 // service's dtor, and (2) there is at most one live OAuth2TokenSevice for
425 // a given profile at a time. 446 // a given profile at a time.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 if (type == chrome::NOTIFICATION_TOKEN_AVAILABLE) { 513 if (type == chrome::NOTIFICATION_TOKEN_AVAILABLE) {
493 TokenService::TokenAvailableDetails* tok_details = 514 TokenService::TokenAvailableDetails* tok_details =
494 content::Details<TokenService::TokenAvailableDetails>(details).ptr(); 515 content::Details<TokenService::TokenAvailableDetails>(details).ptr();
495 if (tok_details->service() != GaiaConstants::kGaiaOAuth2LoginRefreshToken) 516 if (tok_details->service() != GaiaConstants::kGaiaOAuth2LoginRefreshToken)
496 return; 517 return;
497 } 518 }
498 // The GaiaConstants::kGaiaOAuth2LoginRefreshToken token is used to create 519 // The GaiaConstants::kGaiaOAuth2LoginRefreshToken token is used to create
499 // OAuth2 access tokens. If this token either changes or is cleared, any 520 // OAuth2 access tokens. If this token either changes or is cleared, any
500 // available tokens must be invalidated. 521 // available tokens must be invalidated.
501 token_cache_.clear(); 522 token_cache_.clear();
523 UpdateAuthError(GoogleServiceAuthError::None());
502 } 524 }
525
526 void OAuth2TokenService::UpdateAuthError(const GoogleServiceAuthError& error) {
527 // Do not report connection errors as these are not actually auth errors.
528 // We also want to avoid masking a "real" auth error just because we
529 // subsequently get a transient network error.
530 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED)
531 return;
532
533 if (error.state() != last_auth_error_.state()) {
534 last_auth_error_ = error;
535 SigninManagerFactory::GetForProfile(profile_)->signin_global_error()->
536 AuthStatusChanged();
537 }
538 }
539
540 GoogleServiceAuthError OAuth2TokenService::GetAuthStatus() const {
541 return last_auth_error_;
542 }
OLDNEW
« no previous file with comments | « chrome/browser/signin/oauth2_token_service.h ('k') | chrome/browser/signin/oauth2_token_service_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698