OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "sync/internal_api/sync_manager_impl.h" | 5 #include "sync/internal_api/sync_manager_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 const base::FilePath& database_location, | 342 const base::FilePath& database_location, |
343 const WeakHandle<JsEventHandler>& event_handler, | 343 const WeakHandle<JsEventHandler>& event_handler, |
344 const std::string& sync_server_and_path, | 344 const std::string& sync_server_and_path, |
345 int port, | 345 int port, |
346 bool use_ssl, | 346 bool use_ssl, |
347 scoped_ptr<HttpPostProviderFactory> post_factory, | 347 scoped_ptr<HttpPostProviderFactory> post_factory, |
348 const std::vector<ModelSafeWorker*>& workers, | 348 const std::vector<ModelSafeWorker*>& workers, |
349 ExtensionsActivityMonitor* extensions_activity_monitor, | 349 ExtensionsActivityMonitor* extensions_activity_monitor, |
350 SyncManager::ChangeDelegate* change_delegate, | 350 SyncManager::ChangeDelegate* change_delegate, |
351 const SyncCredentials& credentials, | 351 const SyncCredentials& credentials, |
| 352 scoped_ptr<Invalidator> invalidator, |
352 const std::string& invalidator_client_id, | 353 const std::string& invalidator_client_id, |
353 const std::string& restored_key_for_bootstrapping, | 354 const std::string& restored_key_for_bootstrapping, |
354 const std::string& restored_keystore_key_for_bootstrapping, | 355 const std::string& restored_keystore_key_for_bootstrapping, |
355 scoped_ptr<InternalComponentsFactory> internal_components_factory, | 356 scoped_ptr<InternalComponentsFactory> internal_components_factory, |
356 Encryptor* encryptor, | 357 Encryptor* encryptor, |
357 UnrecoverableErrorHandler* unrecoverable_error_handler, | 358 UnrecoverableErrorHandler* unrecoverable_error_handler, |
358 ReportUnrecoverableErrorFunction report_unrecoverable_error_function, | 359 ReportUnrecoverableErrorFunction report_unrecoverable_error_function, |
359 bool use_oauth2_token) { | 360 bool use_oauth2_token) { |
360 CHECK(!initialized_); | 361 CHECK(!initialized_); |
361 DCHECK(thread_checker_.CalledOnValidThread()); | 362 DCHECK(thread_checker_.CalledOnValidThread()); |
362 DCHECK(post_factory.get()); | 363 DCHECK(post_factory.get()); |
363 DCHECK(!credentials.email.empty()); | 364 DCHECK(!credentials.email.empty()); |
364 DCHECK(!credentials.sync_token.empty()); | 365 DCHECK(!credentials.sync_token.empty()); |
365 DVLOG(1) << "SyncManager starting Init..."; | 366 DVLOG(1) << "SyncManager starting Init..."; |
366 | 367 |
367 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); | 368 weak_handle_this_ = MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()); |
368 | 369 |
369 change_delegate_ = change_delegate; | 370 change_delegate_ = change_delegate; |
370 | 371 |
| 372 invalidator_ = invalidator.Pass(); |
| 373 invalidator_->RegisterHandler(this); |
| 374 |
371 AddObserver(&js_sync_manager_observer_); | 375 AddObserver(&js_sync_manager_observer_); |
372 SetJsEventHandler(event_handler); | 376 SetJsEventHandler(event_handler); |
373 | 377 |
374 AddObserver(&debug_info_event_listener_); | 378 AddObserver(&debug_info_event_listener_); |
375 | 379 |
376 database_path_ = database_location.Append( | 380 database_path_ = database_location.Append( |
377 syncable::Directory::kSyncDatabaseFilename); | 381 syncable::Directory::kSyncDatabaseFilename); |
378 encryptor_ = encryptor; | 382 encryptor_ = encryptor; |
379 unrecoverable_error_handler_ = unrecoverable_error_handler; | 383 unrecoverable_error_handler_ = unrecoverable_error_handler; |
380 report_unrecoverable_error_function_ = report_unrecoverable_error_function; | 384 report_unrecoverable_error_function_ = report_unrecoverable_error_function; |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) { | 602 void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) { |
599 DCHECK(thread_checker_.CalledOnValidThread()); | 603 DCHECK(thread_checker_.CalledOnValidThread()); |
600 DCHECK(initialized_); | 604 DCHECK(initialized_); |
601 DCHECK(!credentials.email.empty()); | 605 DCHECK(!credentials.email.empty()); |
602 DCHECK(!credentials.sync_token.empty()); | 606 DCHECK(!credentials.sync_token.empty()); |
603 | 607 |
604 observing_network_connectivity_changes_ = true; | 608 observing_network_connectivity_changes_ = true; |
605 if (!connection_manager_->SetAuthToken(credentials.sync_token)) | 609 if (!connection_manager_->SetAuthToken(credentials.sync_token)) |
606 return; // Auth token is known to be invalid, so exit early. | 610 return; // Auth token is known to be invalid, so exit early. |
607 | 611 |
| 612 invalidator_->UpdateCredentials(credentials.email, credentials.sync_token); |
608 scheduler_->OnCredentialsUpdated(); | 613 scheduler_->OnCredentialsUpdated(); |
609 | 614 |
610 // TODO(zea): pass the credential age to the debug info event listener. | 615 // TODO(zea): pass the credential age to the debug info event listener. |
611 } | 616 } |
612 | 617 |
| 618 void SyncManagerImpl::UpdateEnabledTypes(ModelTypeSet enabled_types) { |
| 619 DCHECK(thread_checker_.CalledOnValidThread()); |
| 620 DCHECK(initialized_); |
| 621 invalidator_->UpdateRegisteredIds( |
| 622 this, |
| 623 ModelTypeSetToObjectIdSet(enabled_types)); |
| 624 } |
| 625 |
| 626 void SyncManagerImpl::RegisterInvalidationHandler( |
| 627 InvalidationHandler* handler) { |
| 628 DCHECK(thread_checker_.CalledOnValidThread()); |
| 629 DCHECK(initialized_); |
| 630 invalidator_->RegisterHandler(handler); |
| 631 } |
| 632 |
| 633 void SyncManagerImpl::UpdateRegisteredInvalidationIds( |
| 634 InvalidationHandler* handler, |
| 635 const ObjectIdSet& ids) { |
| 636 DCHECK(thread_checker_.CalledOnValidThread()); |
| 637 DCHECK(initialized_); |
| 638 invalidator_->UpdateRegisteredIds(handler, ids); |
| 639 } |
| 640 |
| 641 void SyncManagerImpl::UnregisterInvalidationHandler( |
| 642 InvalidationHandler* handler) { |
| 643 DCHECK(thread_checker_.CalledOnValidThread()); |
| 644 DCHECK(initialized_); |
| 645 invalidator_->UnregisterHandler(handler); |
| 646 } |
| 647 |
| 648 void SyncManagerImpl::AcknowledgeInvalidation( |
| 649 const invalidation::ObjectId& id, const syncer::AckHandle& ack_handle) { |
| 650 DCHECK(thread_checker_.CalledOnValidThread()); |
| 651 DCHECK(initialized_); |
| 652 invalidator_->Acknowledge(id, ack_handle); |
| 653 } |
| 654 |
613 void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) { | 655 void SyncManagerImpl::AddObserver(SyncManager::Observer* observer) { |
614 DCHECK(thread_checker_.CalledOnValidThread()); | 656 DCHECK(thread_checker_.CalledOnValidThread()); |
615 observers_.AddObserver(observer); | 657 observers_.AddObserver(observer); |
616 } | 658 } |
617 | 659 |
618 void SyncManagerImpl::RemoveObserver(SyncManager::Observer* observer) { | 660 void SyncManagerImpl::RemoveObserver(SyncManager::Observer* observer) { |
619 DCHECK(thread_checker_.CalledOnValidThread()); | 661 DCHECK(thread_checker_.CalledOnValidThread()); |
620 observers_.RemoveObserver(observer); | 662 observers_.RemoveObserver(observer); |
621 } | 663 } |
622 | 664 |
(...skipping 18 matching lines...) Expand all Loading... |
641 if (sync_encryption_handler_) { | 683 if (sync_encryption_handler_) { |
642 sync_encryption_handler_->RemoveObserver(&debug_info_event_listener_); | 684 sync_encryption_handler_->RemoveObserver(&debug_info_event_listener_); |
643 sync_encryption_handler_->RemoveObserver(this); | 685 sync_encryption_handler_->RemoveObserver(this); |
644 } | 686 } |
645 | 687 |
646 SetJsEventHandler(WeakHandle<JsEventHandler>()); | 688 SetJsEventHandler(WeakHandle<JsEventHandler>()); |
647 RemoveObserver(&js_sync_manager_observer_); | 689 RemoveObserver(&js_sync_manager_observer_); |
648 | 690 |
649 RemoveObserver(&debug_info_event_listener_); | 691 RemoveObserver(&debug_info_event_listener_); |
650 | 692 |
651 // |connection_manager_| may end up being NULL here in tests (in synchronous | 693 // |invalidator_| and |connection_manager_| may end up being NULL here in |
652 // initialization mode). | 694 // tests (in synchronous initialization mode). |
653 // | 695 // |
654 // TODO(akalin): Fix this behavior. | 696 // TODO(akalin): Fix this behavior. |
| 697 |
| 698 if (invalidator_) |
| 699 invalidator_->UnregisterHandler(this); |
| 700 invalidator_.reset(); |
| 701 |
655 if (connection_manager_) | 702 if (connection_manager_) |
656 connection_manager_->RemoveListener(this); | 703 connection_manager_->RemoveListener(this); |
657 connection_manager_.reset(); | 704 connection_manager_.reset(); |
658 | 705 |
659 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); | 706 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); |
660 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); | 707 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
661 observing_network_connectivity_changes_ = false; | 708 observing_network_connectivity_changes_ = false; |
662 | 709 |
663 if (initialized_ && directory()) { | 710 if (initialized_ && directory()) { |
664 directory()->SaveChanges(); | 711 directory()->SaveChanges(); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { | 981 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { |
935 if (!initialized_) { | 982 if (!initialized_) { |
936 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " | 983 LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " |
937 << "initialized"; | 984 << "initialized"; |
938 return; | 985 return; |
939 } | 986 } |
940 | 987 |
941 DVLOG(1) << "Sending OnSyncCycleCompleted"; | 988 DVLOG(1) << "Sending OnSyncCycleCompleted"; |
942 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 989 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
943 OnSyncCycleCompleted(event.snapshot)); | 990 OnSyncCycleCompleted(event.snapshot)); |
| 991 |
| 992 // This is here for tests, which are still using p2p notifications. |
| 993 bool is_notifiable_commit = |
| 994 (event.snapshot.model_neutral_state().num_successful_commits > 0); |
| 995 if (is_notifiable_commit) { |
| 996 if (invalidator_) { |
| 997 const ObjectIdInvalidationMap& invalidation_map = |
| 998 ModelTypeInvalidationMapToObjectIdInvalidationMap( |
| 999 event.snapshot.source().types); |
| 1000 invalidator_->SendInvalidation(invalidation_map); |
| 1001 } else { |
| 1002 DVLOG(1) << "Not sending invalidation: invalidator_ is NULL"; |
| 1003 } |
| 1004 } |
944 } | 1005 } |
945 | 1006 |
946 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { | 1007 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { |
947 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1008 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
948 OnStopSyncingPermanently()); | 1009 OnStopSyncingPermanently()); |
949 return; | 1010 return; |
950 } | 1011 } |
951 | 1012 |
952 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { | 1013 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { |
953 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1014 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 const ModelTypeInvalidationMap& invalidation_map) { | 1217 const ModelTypeInvalidationMap& invalidation_map) { |
1157 for (ModelTypeInvalidationMap::const_iterator it = invalidation_map.begin(); | 1218 for (ModelTypeInvalidationMap::const_iterator it = invalidation_map.begin(); |
1158 it != invalidation_map.end(); ++it) { | 1219 it != invalidation_map.end(); ++it) { |
1159 NotificationInfo* info = ¬ification_info_map_[it->first]; | 1220 NotificationInfo* info = ¬ification_info_map_[it->first]; |
1160 info->total_count++; | 1221 info->total_count++; |
1161 info->payload = it->second.payload; | 1222 info->payload = it->second.payload; |
1162 } | 1223 } |
1163 } | 1224 } |
1164 | 1225 |
1165 void SyncManagerImpl::OnInvalidatorStateChange(InvalidatorState state) { | 1226 void SyncManagerImpl::OnInvalidatorStateChange(InvalidatorState state) { |
1166 DCHECK(thread_checker_.CalledOnValidThread()); | |
1167 | |
1168 const std::string& state_str = InvalidatorStateToString(state); | 1227 const std::string& state_str = InvalidatorStateToString(state); |
1169 invalidator_state_ = state; | 1228 invalidator_state_ = state; |
1170 DVLOG(1) << "Invalidator state changed to: " << state_str; | 1229 DVLOG(1) << "Invalidator state changed to: " << state_str; |
1171 const bool notifications_enabled = | 1230 const bool notifications_enabled = |
1172 (invalidator_state_ == INVALIDATIONS_ENABLED); | 1231 (invalidator_state_ == INVALIDATIONS_ENABLED); |
1173 allstatus_.SetNotificationsEnabled(notifications_enabled); | 1232 allstatus_.SetNotificationsEnabled(notifications_enabled); |
1174 scheduler_->SetNotificationsEnabled(notifications_enabled); | 1233 scheduler_->SetNotificationsEnabled(notifications_enabled); |
1175 | 1234 |
| 1235 if (invalidator_state_ == syncer::INVALIDATION_CREDENTIALS_REJECTED) { |
| 1236 // If the invalidator's credentials were rejected, that means that |
| 1237 // our sync credentials are also bad, so invalidate those. |
| 1238 connection_manager_->OnInvalidationCredentialsRejected(); |
| 1239 } |
| 1240 |
1176 if (js_event_handler_.IsInitialized()) { | 1241 if (js_event_handler_.IsInitialized()) { |
1177 base::DictionaryValue details; | 1242 base::DictionaryValue details; |
1178 details.SetString("state", state_str); | 1243 details.SetString("state", state_str); |
1179 js_event_handler_.Call(FROM_HERE, | 1244 js_event_handler_.Call(FROM_HERE, |
1180 &JsEventHandler::HandleJsEvent, | 1245 &JsEventHandler::HandleJsEvent, |
1181 "onNotificationStateChange", | 1246 "onNotificationStateChange", |
1182 JsEventDetails(&details)); | 1247 JsEventDetails(&details)); |
1183 } | 1248 } |
1184 } | 1249 } |
1185 | 1250 |
1186 void SyncManagerImpl::OnIncomingInvalidation( | 1251 void SyncManagerImpl::OnIncomingInvalidation( |
1187 const ObjectIdInvalidationMap& invalidation_map) { | 1252 const ObjectIdInvalidationMap& invalidation_map) { |
1188 DCHECK(thread_checker_.CalledOnValidThread()); | 1253 DCHECK(thread_checker_.CalledOnValidThread()); |
1189 | 1254 |
| 1255 // TODO(dcheng): Acknowledge immediately for now. Fix this once the |
| 1256 // invalidator doesn't repeatedly ping for unacknowledged invaliations, since |
| 1257 // it conflicts with the sync scheduler's internal backoff algorithm. |
| 1258 // See http://crbug.com/124149 for more information. |
| 1259 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); |
| 1260 it != invalidation_map.end(); ++it) { |
| 1261 invalidator_->Acknowledge(it->first, it->second.ack_handle); |
| 1262 } |
| 1263 |
1190 const ModelTypeInvalidationMap& type_invalidation_map = | 1264 const ModelTypeInvalidationMap& type_invalidation_map = |
1191 ObjectIdInvalidationMapToModelTypeInvalidationMap(invalidation_map); | 1265 ObjectIdInvalidationMapToModelTypeInvalidationMap(invalidation_map); |
1192 if (type_invalidation_map.empty()) { | 1266 if (type_invalidation_map.empty()) { |
1193 LOG(WARNING) << "Sync received invalidation without any type information."; | 1267 LOG(WARNING) << "Sync received invalidation without any type information."; |
1194 } else { | 1268 } else { |
1195 allstatus_.IncrementNudgeCounter(NUDGE_SOURCE_NOTIFICATION); | 1269 allstatus_.IncrementNudgeCounter(NUDGE_SOURCE_NOTIFICATION); |
1196 scheduler_->ScheduleInvalidationNudge( | 1270 scheduler_->ScheduleInvalidationNudge( |
1197 TimeDelta::FromMilliseconds(kSyncSchedulerDelayMsec), | 1271 TimeDelta::FromMilliseconds(kSyncSchedulerDelayMsec), |
1198 type_invalidation_map, FROM_HERE); | 1272 type_invalidation_map, FROM_HERE); |
1199 allstatus_.IncrementNotificationsReceived(); | 1273 allstatus_.IncrementNotificationsReceived(); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1322 int SyncManagerImpl::GetDefaultNudgeDelay() { | 1396 int SyncManagerImpl::GetDefaultNudgeDelay() { |
1323 return kDefaultNudgeDelayMilliseconds; | 1397 return kDefaultNudgeDelayMilliseconds; |
1324 } | 1398 } |
1325 | 1399 |
1326 // static. | 1400 // static. |
1327 int SyncManagerImpl::GetPreferencesNudgeDelay() { | 1401 int SyncManagerImpl::GetPreferencesNudgeDelay() { |
1328 return kPreferencesNudgeDelayMilliseconds; | 1402 return kPreferencesNudgeDelayMilliseconds; |
1329 } | 1403 } |
1330 | 1404 |
1331 } // namespace syncer | 1405 } // namespace syncer |
OLD | NEW |