| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/invalidation/ticl_invalidation_service.h" | 5 #include "chrome/browser/invalidation/ticl_invalidation_service.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "chrome/browser/chrome_notification_types.h" | 9 #include "chrome/browser/chrome_notification_types.h" |
| 10 #include "chrome/browser/invalidation/invalidation_service_util.h" | 10 #include "chrome/browser/invalidation/invalidation_service_util.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 DCHECK(CalledOnValidThread()); | 74 DCHECK(CalledOnValidThread()); |
| 75 | 75 |
| 76 invalidator_storage_.reset(new InvalidatorStorage(profile_->GetPrefs())); | 76 invalidator_storage_.reset(new InvalidatorStorage(profile_->GetPrefs())); |
| 77 if (invalidator_storage_->GetInvalidatorClientId().empty()) { | 77 if (invalidator_storage_->GetInvalidatorClientId().empty()) { |
| 78 // This also clears any existing state. We can't reuse old invalidator | 78 // This also clears any existing state. We can't reuse old invalidator |
| 79 // state with the new ID anyway. | 79 // state with the new ID anyway. |
| 80 invalidator_storage_->SetInvalidatorClientId(GenerateInvalidatorClientId()); | 80 invalidator_storage_->SetInvalidatorClientId(GenerateInvalidatorClientId()); |
| 81 } | 81 } |
| 82 | 82 |
| 83 if (IsReadyToStart()) { | 83 if (IsReadyToStart()) { |
| 84 StartInvalidator(); | 84 StartInvalidator(PUSH_CLIENT_CHANNEL); |
| 85 } | 85 } |
| 86 | 86 |
| 87 notification_registrar_.Add(this, | 87 notification_registrar_.Add(this, |
| 88 chrome::NOTIFICATION_GOOGLE_SIGNED_OUT, | 88 chrome::NOTIFICATION_GOOGLE_SIGNED_OUT, |
| 89 content::Source<Profile>(profile_)); | 89 content::Source<Profile>(profile_)); |
| 90 oauth2_token_service_->AddObserver(this); | 90 oauth2_token_service_->AddObserver(this); |
| 91 } | 91 } |
| 92 | 92 |
| 93 void TiclInvalidationService::InitForTest(syncer::Invalidator* invalidator) { | 93 void TiclInvalidationService::InitForTest(syncer::Invalidator* invalidator) { |
| 94 // Here we perform the equivalent of Init() and StartInvalidator(), but with | 94 // Here we perform the equivalent of Init() and StartInvalidator(), but with |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 void TiclInvalidationService::OnGetTokenSuccess( | 183 void TiclInvalidationService::OnGetTokenSuccess( |
| 184 const OAuth2TokenService::Request* request, | 184 const OAuth2TokenService::Request* request, |
| 185 const std::string& access_token, | 185 const std::string& access_token, |
| 186 const base::Time& expiration_time) { | 186 const base::Time& expiration_time) { |
| 187 DCHECK_EQ(access_token_request_, request); | 187 DCHECK_EQ(access_token_request_, request); |
| 188 access_token_request_.reset(); | 188 access_token_request_.reset(); |
| 189 // Reset backoff time after successful response. | 189 // Reset backoff time after successful response. |
| 190 request_access_token_backoff_.Reset(); | 190 request_access_token_backoff_.Reset(); |
| 191 access_token_ = access_token; | 191 access_token_ = access_token; |
| 192 if (!IsStarted() && IsReadyToStart()) { | 192 if (!IsStarted() && IsReadyToStart()) { |
| 193 StartInvalidator(); | 193 StartInvalidator(PUSH_CLIENT_CHANNEL); |
| 194 } else { | 194 } else { |
| 195 UpdateInvalidatorCredentials(); | 195 UpdateInvalidatorCredentials(); |
| 196 } | 196 } |
| 197 } | 197 } |
| 198 | 198 |
| 199 void TiclInvalidationService::OnGetTokenFailure( | 199 void TiclInvalidationService::OnGetTokenFailure( |
| 200 const OAuth2TokenService::Request* request, | 200 const OAuth2TokenService::Request* request, |
| 201 const GoogleServiceAuthError& error) { | 201 const GoogleServiceAuthError& error) { |
| 202 DCHECK_EQ(access_token_request_, request); | 202 DCHECK_EQ(access_token_request_, request); |
| 203 DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); | 203 DCHECK_NE(error.state(), GoogleServiceAuthError::NONE); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 223 default: { | 223 default: { |
| 224 // We have no way to notify the user of this. Do nothing. | 224 // We have no way to notify the user of this. Do nothing. |
| 225 } | 225 } |
| 226 } | 226 } |
| 227 } | 227 } |
| 228 | 228 |
| 229 void TiclInvalidationService::OnRefreshTokenAvailable( | 229 void TiclInvalidationService::OnRefreshTokenAvailable( |
| 230 const std::string& account_id) { | 230 const std::string& account_id) { |
| 231 if (oauth2_token_service_->GetPrimaryAccountId() == account_id) { | 231 if (oauth2_token_service_->GetPrimaryAccountId() == account_id) { |
| 232 if (!IsStarted() && IsReadyToStart()) { | 232 if (!IsStarted() && IsReadyToStart()) { |
| 233 StartInvalidator(); | 233 StartInvalidator(PUSH_CLIENT_CHANNEL); |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 } | 236 } |
| 237 | 237 |
| 238 void TiclInvalidationService::OnRefreshTokenRevoked( | 238 void TiclInvalidationService::OnRefreshTokenRevoked( |
| 239 const std::string& account_id) { | 239 const std::string& account_id) { |
| 240 if (oauth2_token_service_->GetPrimaryAccountId() == account_id) { | 240 if (oauth2_token_service_->GetPrimaryAccountId() == account_id) { |
| 241 access_token_.clear(); | 241 access_token_.clear(); |
| 242 if (IsStarted()) { | 242 if (IsStarted()) { |
| 243 UpdateInvalidatorCredentials(); | 243 UpdateInvalidatorCredentials(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 return false; | 306 return false; |
| 307 } | 307 } |
| 308 | 308 |
| 309 return true; | 309 return true; |
| 310 } | 310 } |
| 311 | 311 |
| 312 bool TiclInvalidationService::IsStarted() { | 312 bool TiclInvalidationService::IsStarted() { |
| 313 return invalidator_.get() != NULL; | 313 return invalidator_.get() != NULL; |
| 314 } | 314 } |
| 315 | 315 |
| 316 void TiclInvalidationService::StartInvalidator() { | 316 void TiclInvalidationService::StartInvalidator( |
| 317 InvalidationNetworkChannel network_channel) { |
| 317 DCHECK(CalledOnValidThread()); | 318 DCHECK(CalledOnValidThread()); |
| 318 DCHECK(!invalidator_); | 319 DCHECK(!invalidator_); |
| 319 DCHECK(invalidator_storage_); | 320 DCHECK(invalidator_storage_); |
| 320 DCHECK(!invalidator_storage_->GetInvalidatorClientId().empty()); | 321 DCHECK(!invalidator_storage_->GetInvalidatorClientId().empty()); |
| 321 | 322 |
| 322 if (access_token_.empty()) { | 323 if (access_token_.empty()) { |
| 323 DVLOG(1) | 324 DVLOG(1) |
| 324 << "TiclInvalidationService: " | 325 << "TiclInvalidationService: " |
| 325 << "Deferring start until we have an access token."; | 326 << "Deferring start until we have an access token."; |
| 326 RequestAccessToken(); | 327 RequestAccessToken(); |
| 327 return; | 328 return; |
| 328 } | 329 } |
| 329 | 330 |
| 330 notifier::NotifierOptions options = | 331 syncer::NetworkChannelCreator network_channel_creator; |
| 331 ParseNotifierOptions(*CommandLine::ForCurrentProcess()); | 332 |
| 332 options.request_context_getter = profile_->GetRequestContext(); | 333 switch (network_channel) { |
| 333 options.auth_mechanism = "X-OAUTH2"; | 334 case PUSH_CLIENT_CHANNEL: { |
| 335 notifier::NotifierOptions options = |
| 336 ParseNotifierOptions(*CommandLine::ForCurrentProcess()); |
| 337 options.request_context_getter = profile_->GetRequestContext(); |
| 338 options.auth_mechanism = "X-OAUTH2"; |
| 339 DCHECK_EQ(notifier::NOTIFICATION_SERVER, options.notification_method); |
| 340 network_channel_creator = |
| 341 syncer::NonBlockingInvalidator::MakePushClientChannelCreator(options); |
| 342 break; |
| 343 } |
| 344 case GCM_NETWORK_CHANNEL: { |
| 345 network_channel_creator = |
| 346 syncer::NonBlockingInvalidator::MakeGCMNetworkChannelCreator(); |
| 347 break; |
| 348 } |
| 349 default: { |
| 350 NOTREACHED(); |
| 351 return; |
| 352 } |
| 353 } |
| 334 invalidator_.reset(new syncer::NonBlockingInvalidator( | 354 invalidator_.reset(new syncer::NonBlockingInvalidator( |
| 335 options, | 355 network_channel_creator, |
| 336 invalidator_storage_->GetInvalidatorClientId(), | 356 invalidator_storage_->GetInvalidatorClientId(), |
| 337 invalidator_storage_->GetSavedInvalidations(), | 357 invalidator_storage_->GetSavedInvalidations(), |
| 338 invalidator_storage_->GetBootstrapData(), | 358 invalidator_storage_->GetBootstrapData(), |
| 339 syncer::WeakHandle<syncer::InvalidationStateTracker>( | 359 syncer::WeakHandle<syncer::InvalidationStateTracker>( |
| 340 invalidator_storage_->AsWeakPtr()), | 360 invalidator_storage_->AsWeakPtr()), |
| 341 content::GetUserAgent(GURL()))); | 361 content::GetUserAgent(GURL()), |
| 362 profile_->GetRequestContext())); |
| 342 | 363 |
| 343 UpdateInvalidatorCredentials(); | 364 UpdateInvalidatorCredentials(); |
| 344 | 365 |
| 345 invalidator_->RegisterHandler(this); | 366 invalidator_->RegisterHandler(this); |
| 346 invalidator_->UpdateRegisteredIds( | 367 invalidator_->UpdateRegisteredIds( |
| 347 this, | 368 this, |
| 348 invalidator_registrar_->GetAllRegisteredIds()); | 369 invalidator_registrar_->GetAllRegisteredIds()); |
| 349 } | 370 } |
| 350 | 371 |
| 351 void TiclInvalidationService::UpdateInvalidatorCredentials() { | 372 void TiclInvalidationService::UpdateInvalidatorCredentials() { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 372 } | 393 } |
| 373 | 394 |
| 374 // This service always expects to have a valid invalidator storage. | 395 // This service always expects to have a valid invalidator storage. |
| 375 // So we must not only clear the old one, but also start a new one. | 396 // So we must not only clear the old one, but also start a new one. |
| 376 invalidator_storage_->Clear(); | 397 invalidator_storage_->Clear(); |
| 377 invalidator_storage_.reset(new InvalidatorStorage(profile_->GetPrefs())); | 398 invalidator_storage_.reset(new InvalidatorStorage(profile_->GetPrefs())); |
| 378 invalidator_storage_->SetInvalidatorClientId(GenerateInvalidatorClientId()); | 399 invalidator_storage_->SetInvalidatorClientId(GenerateInvalidatorClientId()); |
| 379 } | 400 } |
| 380 | 401 |
| 381 } // namespace invalidation | 402 } // namespace invalidation |
| OLD | NEW |