Index: trunk/src/sync/internal_api/sync_manager_impl.cc |
=================================================================== |
--- trunk/src/sync/internal_api/sync_manager_impl.cc (revision 208346) |
+++ trunk/src/sync/internal_api/sync_manager_impl.cc (working copy) |
@@ -349,6 +349,7 @@ |
ExtensionsActivityMonitor* extensions_activity_monitor, |
SyncManager::ChangeDelegate* change_delegate, |
const SyncCredentials& credentials, |
+ scoped_ptr<Invalidator> invalidator, |
const std::string& invalidator_client_id, |
const std::string& restored_key_for_bootstrapping, |
const std::string& restored_keystore_key_for_bootstrapping, |
@@ -368,6 +369,9 @@ |
change_delegate_ = change_delegate; |
+ invalidator_ = invalidator.Pass(); |
+ invalidator_->RegisterHandler(this); |
+ |
AddObserver(&js_sync_manager_observer_); |
SetJsEventHandler(event_handler); |
@@ -605,11 +609,49 @@ |
if (!connection_manager_->SetAuthToken(credentials.sync_token)) |
return; // Auth token is known to be invalid, so exit early. |
+ invalidator_->UpdateCredentials(credentials.email, credentials.sync_token); |
scheduler_->OnCredentialsUpdated(); |
// TODO(zea): pass the credential age to the debug info event listener. |
} |
+void SyncManagerImpl::UpdateEnabledTypes(ModelTypeSet enabled_types) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(initialized_); |
+ invalidator_->UpdateRegisteredIds( |
+ this, |
+ ModelTypeSetToObjectIdSet(enabled_types)); |
+} |
+ |
+void SyncManagerImpl::RegisterInvalidationHandler( |
+ InvalidationHandler* handler) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(initialized_); |
+ invalidator_->RegisterHandler(handler); |
+} |
+ |
+void SyncManagerImpl::UpdateRegisteredInvalidationIds( |
+ InvalidationHandler* handler, |
+ const ObjectIdSet& ids) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(initialized_); |
+ invalidator_->UpdateRegisteredIds(handler, ids); |
+} |
+ |
+void SyncManagerImpl::UnregisterInvalidationHandler( |
+ InvalidationHandler* handler) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(initialized_); |
+ invalidator_->UnregisterHandler(handler); |
+} |
+ |
+void SyncManagerImpl::AcknowledgeInvalidation( |
+ const invalidation::ObjectId& id, const syncer::AckHandle& ack_handle) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(initialized_); |
+ invalidator_->Acknowledge(id, ack_handle); |
+} |
+ |
void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
observers_.AddObserver(observer); |
@@ -648,10 +690,15 @@ |
RemoveObserver(&debug_info_event_listener_); |
- // |connection_manager_| may end up being NULL here in tests (in synchronous |
- // initialization mode). |
+ // |invalidator_| and |connection_manager_| may end up being NULL here in |
+ // tests (in synchronous initialization mode). |
// |
// TODO(akalin): Fix this behavior. |
+ |
+ if (invalidator_) |
+ invalidator_->UnregisterHandler(this); |
+ invalidator_.reset(); |
+ |
if (connection_manager_) |
connection_manager_->RemoveListener(this); |
connection_manager_.reset(); |
@@ -941,6 +988,20 @@ |
DVLOG(1) << "Sending OnSyncCycleCompleted"; |
FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
OnSyncCycleCompleted(event.snapshot)); |
+ |
+ // This is here for tests, which are still using p2p notifications. |
+ bool is_notifiable_commit = |
+ (event.snapshot.model_neutral_state().num_successful_commits > 0); |
+ if (is_notifiable_commit) { |
+ if (invalidator_) { |
+ const ObjectIdInvalidationMap& invalidation_map = |
+ ModelTypeInvalidationMapToObjectIdInvalidationMap( |
+ event.snapshot.source().types); |
+ invalidator_->SendInvalidation(invalidation_map); |
+ } else { |
+ DVLOG(1) << "Not sending invalidation: invalidator_ is NULL"; |
+ } |
+ } |
} |
if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { |
@@ -1163,8 +1224,6 @@ |
} |
void SyncManagerImpl::OnInvalidatorStateChange(InvalidatorState state) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- |
const std::string& state_str = InvalidatorStateToString(state); |
invalidator_state_ = state; |
DVLOG(1) << "Invalidator state changed to: " << state_str; |
@@ -1173,6 +1232,12 @@ |
allstatus_.SetNotificationsEnabled(notifications_enabled); |
scheduler_->SetNotificationsEnabled(notifications_enabled); |
+ if (invalidator_state_ == syncer::INVALIDATION_CREDENTIALS_REJECTED) { |
+ // If the invalidator's credentials were rejected, that means that |
+ // our sync credentials are also bad, so invalidate those. |
+ connection_manager_->OnInvalidationCredentialsRejected(); |
+ } |
+ |
if (js_event_handler_.IsInitialized()) { |
base::DictionaryValue details; |
details.SetString("state", state_str); |
@@ -1187,6 +1252,15 @@ |
const ObjectIdInvalidationMap& invalidation_map) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ // TODO(dcheng): Acknowledge immediately for now. Fix this once the |
+ // invalidator doesn't repeatedly ping for unacknowledged invaliations, since |
+ // it conflicts with the sync scheduler's internal backoff algorithm. |
+ // See http://crbug.com/124149 for more information. |
+ for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); |
+ it != invalidation_map.end(); ++it) { |
+ invalidator_->Acknowledge(it->first, it->second.ack_handle); |
+ } |
+ |
const ModelTypeInvalidationMap& type_invalidation_map = |
ObjectIdInvalidationMapToModelTypeInvalidationMap(invalidation_map); |
if (type_invalidation_map.empty()) { |