summaryrefslogtreecommitdiffstats
path: root/chrome/browser/invalidation
diff options
context:
space:
mode:
authorrlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-20 19:27:59 +0000
committerrlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-20 19:27:59 +0000
commitec0f5cd9f5fff2c9fc6b32299b97cfc93260b6fa (patch)
tree952782645e5180a80686b1dfa75b178f129ca810 /chrome/browser/invalidation
parentb03477f172bb933acc6ab05af452e2999431d817 (diff)
downloadchromium_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.cc40
-rw-r--r--chrome/browser/invalidation/ticl_invalidation_service.h5
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_;