diff options
author | rlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-20 19:27:59 +0000 |
---|---|---|
committer | rlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-20 19:27:59 +0000 |
commit | ec0f5cd9f5fff2c9fc6b32299b97cfc93260b6fa (patch) | |
tree | 952782645e5180a80686b1dfa75b178f129ca810 /chrome/browser/invalidation | |
parent | b03477f172bb933acc6ab05af452e2999431d817 (diff) | |
download | chromium_src-ec0f5cd9f5fff2c9fc6b32299b97cfc93260b6fa.zip chromium_src-ec0f5cd9f5fff2c9fc6b32299b97cfc93260b6fa.tar.gz chromium_src-ec0f5cd9f5fff2c9fc6b32299b97cfc93260b6fa.tar.bz2 |
Fix some sign out bugs in TiclInvalidationService
The first issue is that TiclInvalidationService should only respond to
invalidations related to its own profile. That's been fixed by passing
the appropriate parameters when registering with the notification
service.
Second, the management of the invalidator storage within the
TiclInvalidationService has been modified. Clients of this service
could ask for the invalidation client ID at any time, and we must be
prepared to send them a valid response. Therefore, it is not possible
to allow the TiclInvalidationService to exist without a valid
InvalidatorStorage member.
Fortunately, the InvalidationService code is not currently in use, so
these bugs were harmless.
BUG=124137
Review URL: https://chromiumcodereview.appspot.com/15176003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@201120 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/invalidation')
-rw-r--r-- | chrome/browser/invalidation/ticl_invalidation_service.cc | 40 | ||||
-rw-r--r-- | chrome/browser/invalidation/ticl_invalidation_service.h | 5 |
2 files changed, 27 insertions, 18 deletions
diff --git a/chrome/browser/invalidation/ticl_invalidation_service.cc b/chrome/browser/invalidation/ticl_invalidation_service.cc index 49e81f7..bfee8f0 100644 --- a/chrome/browser/invalidation/ticl_invalidation_service.cc +++ b/chrome/browser/invalidation/ticl_invalidation_service.cc @@ -49,7 +49,7 @@ void TiclInvalidationService::Init() { content::Source<TokenService>(token_service_)); notification_registrar_.Add(this, chrome::NOTIFICATION_GOOGLE_SIGNED_OUT, - content::NotificationService::AllSources()); + content::Source<Profile>(profile_)); } void TiclInvalidationService::InitForTest(syncer::Invalidator* invalidator) { @@ -107,7 +107,8 @@ void TiclInvalidationService::AcknowledgeInvalidation( syncer::InvalidatorState TiclInvalidationService::GetInvalidatorState() const { DCHECK(CalledOnValidThread()); if (invalidator_) { - DVLOG(2) << "GetInvalidatorState returning " << GetInvalidatorState(); + DVLOG(2) << "GetInvalidatorState returning " + << invalidator_->GetInvalidatorState(); return invalidator_->GetInvalidatorState(); } else { DVLOG(2) << "Invalidator currently stopped"; @@ -117,9 +118,6 @@ syncer::InvalidatorState TiclInvalidationService::GetInvalidatorState() const { std::string TiclInvalidationService::GetInvalidatorClientId() const { DCHECK(CalledOnValidThread()); - // invalidator_storage_ will be initialized between calls to Init() and - // Stop(). No one should attempt to get the ID of an uninitialized or stopped - // service. return invalidator_storage_->GetInvalidatorClientId(); } @@ -145,7 +143,7 @@ void TiclInvalidationService::Observe( break; } case chrome::NOTIFICATION_GOOGLE_SIGNED_OUT: { - Stop(); + Logout(); break; } default: { @@ -166,7 +164,10 @@ void TiclInvalidationService::OnIncomingInvalidation( void TiclInvalidationService::Shutdown() { DCHECK(CalledOnValidThread()); - Stop(); + if (IsStarted()) { + StopInvalidator(); + } + invalidator_storage_.reset(); invalidator_registrar_.reset(); } @@ -197,6 +198,8 @@ bool TiclInvalidationService::IsStarted() { void TiclInvalidationService::Start() { DCHECK(CalledOnValidThread()); DCHECK(!invalidator_); + DCHECK(invalidator_storage_); + DCHECK(!invalidator_storage_->GetInvalidatorClientId().empty()); notifier::NotifierOptions options = ParseNotifierOptions(*CommandLine::ForCurrentProcess()); @@ -230,15 +233,20 @@ void TiclInvalidationService::UpdateToken() { invalidator_->UpdateCredentials(email, sync_token); } -void TiclInvalidationService::Stop() { - if (invalidator_) { - invalidator_->UnregisterHandler(this); - invalidator_.reset(); - } - if (invalidator_storage_) { - invalidator_storage_->Clear(); - invalidator_storage_.reset(); - } +void TiclInvalidationService::StopInvalidator() { + DCHECK(invalidator_); + invalidator_->UnregisterHandler(this); + invalidator_.reset(); +} + +void TiclInvalidationService::Logout() { + StopInvalidator(); + + // This service always expects to have a valid invalidator storage. + // So we must not only clear the old one, but also start a new one. + invalidator_storage_->Clear(); + invalidator_storage_.reset(new InvalidatorStorage(profile_->GetPrefs())); + invalidator_storage_->SetInvalidatorClientId(GenerateInvalidatorClientId()); } } // namespace invalidation diff --git a/chrome/browser/invalidation/ticl_invalidation_service.h b/chrome/browser/invalidation/ticl_invalidation_service.h index ec6a14c..673634a 100644 --- a/chrome/browser/invalidation/ticl_invalidation_service.h +++ b/chrome/browser/invalidation/ticl_invalidation_service.h @@ -68,7 +68,7 @@ class TiclInvalidationService virtual void OnIncomingInvalidation( const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; - // Override of ProfileKeyedService methods. + // Overrides ProfileKeyedService method. virtual void Shutdown() OVERRIDE; protected: @@ -83,7 +83,8 @@ class TiclInvalidationService void Start(); void UpdateToken(); - void Stop(); + void StopInvalidator(); + void Logout(); Profile *const profile_; SigninManagerBase *const signin_manager_; |