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 "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include "chrome/browser/sync/glue/sync_backend_host.h" | 7 #include "chrome/browser/sync/glue/sync_backend_host.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/compiler_specific.h" | 14 #include "base/compiler_specific.h" |
15 #include "base/file_path.h" | 15 #include "base/file_path.h" |
16 #include "base/file_util.h" | 16 #include "base/file_util.h" |
17 #include "base/location.h" | 17 #include "base/location.h" |
18 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
19 #include "base/threading/sequenced_worker_pool.h" | 19 #include "base/threading/sequenced_worker_pool.h" |
20 #include "base/threading/thread_restrictions.h" | 20 #include "base/threading/thread_restrictions.h" |
21 #include "base/timer.h" | 21 #include "base/timer.h" |
22 #include "base/tracked_objects.h" | 22 #include "base/tracked_objects.h" |
23 #include "base/utf_string_conversions.h" | 23 #include "base/utf_string_conversions.h" |
| 24 #include "build/build_config.h" |
24 #include "chrome/browser/profiles/profile.h" | 25 #include "chrome/browser/profiles/profile.h" |
25 #include "chrome/browser/signin/token_service.h" | 26 #include "chrome/browser/signin/token_service.h" |
26 #include "chrome/browser/sync/glue/bridged_invalidator.h" | 27 #include "chrome/browser/sync/glue/bridged_invalidator.h" |
27 #include "chrome/browser/sync/glue/change_processor.h" | 28 #include "chrome/browser/sync/glue/change_processor.h" |
28 #include "chrome/browser/sync/glue/chrome_encryptor.h" | 29 #include "chrome/browser/sync/glue/chrome_encryptor.h" |
29 #include "chrome/browser/sync/glue/chrome_sync_notification_bridge.h" | 30 #include "chrome/browser/sync/glue/chrome_sync_notification_bridge.h" |
30 #include "chrome/browser/sync/glue/sync_backend_registrar.h" | 31 #include "chrome/browser/sync/glue/sync_backend_registrar.h" |
31 #include "chrome/browser/sync/invalidations/invalidator_storage.h" | 32 #include "chrome/browser/sync/invalidations/invalidator_storage.h" |
32 #include "chrome/browser/sync/sync_prefs.h" | 33 #include "chrome/browser/sync/sync_prefs.h" |
33 #include "chrome/common/chrome_notification_types.h" | 34 #include "chrome/common/chrome_notification_types.h" |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 syncer::BootstrapTokenType type) OVERRIDE; | 114 syncer::BootstrapTokenType type) OVERRIDE; |
114 virtual void OnEncryptedTypesChanged( | 115 virtual void OnEncryptedTypesChanged( |
115 syncer::ModelTypeSet encrypted_types, | 116 syncer::ModelTypeSet encrypted_types, |
116 bool encrypt_everything) OVERRIDE; | 117 bool encrypt_everything) OVERRIDE; |
117 virtual void OnEncryptionComplete() OVERRIDE; | 118 virtual void OnEncryptionComplete() OVERRIDE; |
118 virtual void OnCryptographerStateChanged( | 119 virtual void OnCryptographerStateChanged( |
119 syncer::Cryptographer* cryptographer) OVERRIDE; | 120 syncer::Cryptographer* cryptographer) OVERRIDE; |
120 virtual void OnPassphraseStateChanged(syncer::PassphraseState state) OVERRIDE; | 121 virtual void OnPassphraseStateChanged(syncer::PassphraseState state) OVERRIDE; |
121 | 122 |
122 // syncer::InvalidationHandler implementation. | 123 // syncer::InvalidationHandler implementation. |
123 virtual void OnNotificationsEnabled() OVERRIDE; | 124 virtual void OnInvalidatorStateChange( |
124 virtual void OnNotificationsDisabled( | 125 syncer::InvalidatorState state) OVERRIDE; |
125 syncer::NotificationsDisabledReason reason) OVERRIDE; | 126 virtual void OnIncomingInvalidation( |
126 virtual void OnIncomingNotification( | |
127 const syncer::ObjectIdStateMap& id_state_map, | 127 const syncer::ObjectIdStateMap& id_state_map, |
128 syncer::IncomingNotificationSource source) OVERRIDE; | 128 syncer::IncomingInvalidationSource source) OVERRIDE; |
129 | 129 |
130 // Note: | 130 // Note: |
131 // | 131 // |
132 // The Do* methods are the various entry points from our | 132 // The Do* methods are the various entry points from our |
133 // SyncBackendHost. They are all called on the sync thread to | 133 // SyncBackendHost. They are all called on the sync thread to |
134 // actually perform synchronous (and potentially blocking) syncapi | 134 // actually perform synchronous (and potentially blocking) syncapi |
135 // operations. | 135 // operations. |
136 // | 136 // |
137 // Called to perform initialization of the syncapi on behalf of | 137 // Called to perform initialization of the syncapi on behalf of |
138 // SyncBackendHost::Initialize. | 138 // SyncBackendHost::Initialize. |
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1031 const syncer::SyncProtocolError& sync_error) { | 1031 const syncer::SyncProtocolError& sync_error) { |
1032 if (!sync_loop_) | 1032 if (!sync_loop_) |
1033 return; | 1033 return; |
1034 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1034 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1035 host_.Call( | 1035 host_.Call( |
1036 FROM_HERE, | 1036 FROM_HERE, |
1037 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop, | 1037 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop, |
1038 sync_error); | 1038 sync_error); |
1039 } | 1039 } |
1040 | 1040 |
1041 void SyncBackendHost::Core::OnNotificationsEnabled() { | 1041 void SyncBackendHost::Core::OnInvalidatorStateChange( |
| 1042 syncer::InvalidatorState state) { |
1042 if (!sync_loop_) | 1043 if (!sync_loop_) |
1043 return; | 1044 return; |
1044 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1045 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1045 host_.Call(FROM_HERE, | 1046 host_.Call(FROM_HERE, |
1046 &SyncBackendHost::HandleNotificationsEnabledOnFrontendLoop); | 1047 &SyncBackendHost::HandleInvalidatorStateChangeOnFrontendLoop, |
| 1048 state); |
1047 } | 1049 } |
1048 | 1050 |
1049 void SyncBackendHost::Core::OnNotificationsDisabled( | 1051 void SyncBackendHost::Core::OnIncomingInvalidation( |
1050 syncer::NotificationsDisabledReason reason) { | 1052 const syncer::ObjectIdStateMap& id_state_map, |
| 1053 syncer::IncomingInvalidationSource source) { |
1051 if (!sync_loop_) | 1054 if (!sync_loop_) |
1052 return; | 1055 return; |
1053 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 1056 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
1054 host_.Call(FROM_HERE, | 1057 host_.Call(FROM_HERE, |
1055 &SyncBackendHost::HandleNotificationsDisabledOnFrontendLoop, | 1058 &SyncBackendHost::HandleIncomingInvalidationOnFrontendLoop, |
1056 reason); | |
1057 } | |
1058 | |
1059 void SyncBackendHost::Core::OnIncomingNotification( | |
1060 const syncer::ObjectIdStateMap& id_state_map, | |
1061 syncer::IncomingNotificationSource source) { | |
1062 if (!sync_loop_) | |
1063 return; | |
1064 DCHECK_EQ(MessageLoop::current(), sync_loop_); | |
1065 host_.Call(FROM_HERE, | |
1066 &SyncBackendHost::HandleIncomingNotificationOnFrontendLoop, | |
1067 id_state_map, source); | 1059 id_state_map, source); |
1068 } | 1060 } |
1069 | 1061 |
1070 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { | 1062 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { |
1071 DCHECK(!sync_loop_); | 1063 DCHECK(!sync_loop_); |
1072 sync_loop_ = options.sync_loop; | 1064 sync_loop_ = options.sync_loop; |
1073 DCHECK(sync_loop_); | 1065 DCHECK(sync_loop_); |
1074 | 1066 |
1075 // Blow away the partial or corrupt sync data folder before doing any more | 1067 // Blow away the partial or corrupt sync data folder before doing any more |
1076 // initialization, if necessary. | 1068 // initialization, if necessary. |
1077 if (options.delete_sync_data_folder) { | 1069 if (options.delete_sync_data_folder) { |
1078 DeleteSyncDataFolder(); | 1070 DeleteSyncDataFolder(); |
1079 } | 1071 } |
1080 | 1072 |
1081 // Make sure that the directory exists before initializing the backend. | 1073 // Make sure that the directory exists before initializing the backend. |
1082 // If it already exists, this will do no harm. | 1074 // If it already exists, this will do no harm. |
1083 if (!file_util::CreateDirectory(sync_data_folder_path_)) { | 1075 if (!file_util::CreateDirectory(sync_data_folder_path_)) { |
1084 DLOG(FATAL) << "Sync Data directory creation failed."; | 1076 DLOG(FATAL) << "Sync Data directory creation failed."; |
1085 } | 1077 } |
1086 | 1078 |
1087 DCHECK(!registrar_); | 1079 DCHECK(!registrar_); |
1088 registrar_ = options.registrar; | 1080 registrar_ = options.registrar; |
1089 DCHECK(registrar_); | 1081 DCHECK(registrar_); |
1090 | 1082 |
1091 DCHECK(!chrome_sync_notification_bridge_); | 1083 DCHECK(!chrome_sync_notification_bridge_); |
1092 chrome_sync_notification_bridge_ = options.chrome_sync_notification_bridge; | 1084 chrome_sync_notification_bridge_ = options.chrome_sync_notification_bridge; |
1093 DCHECK(chrome_sync_notification_bridge_); | 1085 DCHECK(chrome_sync_notification_bridge_); |
1094 | 1086 |
| 1087 #if defined(OS_ANDROID) |
| 1088 // Android uses ChromeSyncNotificationBridge exclusively. |
| 1089 const syncer::InvalidatorState kDefaultInvalidatorState = |
| 1090 syncer::INVALIDATIONS_ENABLED; |
| 1091 #else |
| 1092 const syncer::InvalidatorState kDefaultInvalidatorState = |
| 1093 syncer::DEFAULT_INVALIDATION_ERROR; |
| 1094 #endif |
| 1095 |
1095 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); | 1096 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); |
1096 sync_manager_->AddObserver(this); | 1097 sync_manager_->AddObserver(this); |
1097 sync_manager_->Init( | 1098 sync_manager_->Init( |
1098 sync_data_folder_path_, | 1099 sync_data_folder_path_, |
1099 options.event_handler, | 1100 options.event_handler, |
1100 options.service_url.host() + options.service_url.path(), | 1101 options.service_url.host() + options.service_url.path(), |
1101 options.service_url.EffectiveIntPort(), | 1102 options.service_url.EffectiveIntPort(), |
1102 options.service_url.SchemeIsSecure(), | 1103 options.service_url.SchemeIsSecure(), |
1103 BrowserThread::GetBlockingPool(), | 1104 BrowserThread::GetBlockingPool(), |
1104 options.make_http_bridge_factory_fn.Run().Pass(), | 1105 options.make_http_bridge_factory_fn.Run().Pass(), |
1105 options.workers, | 1106 options.workers, |
1106 options.extensions_activity_monitor, | 1107 options.extensions_activity_monitor, |
1107 options.registrar /* as SyncManager::ChangeDelegate */, | 1108 options.registrar /* as SyncManager::ChangeDelegate */, |
1108 options.credentials, | 1109 options.credentials, |
1109 scoped_ptr<syncer::Invalidator>(new BridgedInvalidator( | 1110 scoped_ptr<syncer::Invalidator>(new BridgedInvalidator( |
1110 options.chrome_sync_notification_bridge, | 1111 options.chrome_sync_notification_bridge, |
1111 options.invalidator_factory->CreateInvalidator())), | 1112 options.invalidator_factory->CreateInvalidator(), |
| 1113 kDefaultInvalidatorState)), |
1112 options.restored_key_for_bootstrapping, | 1114 options.restored_key_for_bootstrapping, |
1113 options.restored_keystore_key_for_bootstrapping, | 1115 options.restored_keystore_key_for_bootstrapping, |
1114 scoped_ptr<InternalComponentsFactory>( | 1116 scoped_ptr<InternalComponentsFactory>( |
1115 options.internal_components_factory), | 1117 options.internal_components_factory), |
1116 &encryptor_, | 1118 &encryptor_, |
1117 options.unrecoverable_error_handler, | 1119 options.unrecoverable_error_handler, |
1118 options.report_unrecoverable_error_function); | 1120 options.report_unrecoverable_error_function); |
1119 | 1121 |
1120 // |sync_manager_| may end up being NULL here in tests (in | 1122 // |sync_manager_| may end up being NULL here in tests (in |
1121 // synchronous initialization mode). | 1123 // synchronous initialization mode). |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1423 } | 1425 } |
1424 | 1426 |
1425 void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop( | 1427 void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop( |
1426 const syncer::SyncProtocolError& sync_error) { | 1428 const syncer::SyncProtocolError& sync_error) { |
1427 if (!frontend_) | 1429 if (!frontend_) |
1428 return; | 1430 return; |
1429 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | 1431 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
1430 frontend_->OnActionableError(sync_error); | 1432 frontend_->OnActionableError(sync_error); |
1431 } | 1433 } |
1432 | 1434 |
1433 void SyncBackendHost::HandleNotificationsEnabledOnFrontendLoop() { | 1435 void SyncBackendHost::HandleInvalidatorStateChangeOnFrontendLoop( |
| 1436 syncer::InvalidatorState state) { |
1434 if (!frontend_) | 1437 if (!frontend_) |
1435 return; | 1438 return; |
1436 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | 1439 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
1437 frontend_->OnNotificationsEnabled(); | 1440 frontend_->OnInvalidatorStateChange(state); |
1438 } | 1441 } |
1439 | 1442 |
1440 void SyncBackendHost::HandleNotificationsDisabledOnFrontendLoop( | 1443 void SyncBackendHost::HandleIncomingInvalidationOnFrontendLoop( |
1441 syncer::NotificationsDisabledReason reason) { | 1444 const syncer::ObjectIdStateMap& id_state_map, |
| 1445 syncer::IncomingInvalidationSource source) { |
1442 if (!frontend_) | 1446 if (!frontend_) |
1443 return; | 1447 return; |
1444 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | 1448 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
1445 frontend_->OnNotificationsDisabled(reason); | 1449 frontend_->OnIncomingInvalidation(id_state_map, source); |
1446 } | |
1447 | |
1448 void SyncBackendHost::HandleIncomingNotificationOnFrontendLoop( | |
1449 const syncer::ObjectIdStateMap& id_state_map, | |
1450 syncer::IncomingNotificationSource source) { | |
1451 if (!frontend_) | |
1452 return; | |
1453 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | |
1454 frontend_->OnIncomingNotification(id_state_map, source); | |
1455 } | 1450 } |
1456 | 1451 |
1457 bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys( | 1452 bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys( |
1458 const std::string& passphrase) const { | 1453 const std::string& passphrase) const { |
1459 DCHECK(cached_pending_keys_.has_blob()); | 1454 DCHECK(cached_pending_keys_.has_blob()); |
1460 DCHECK(!passphrase.empty()); | 1455 DCHECK(!passphrase.empty()); |
1461 syncer::Nigori nigori; | 1456 syncer::Nigori nigori; |
1462 nigori.InitByDerivation("localhost", "dummy", passphrase); | 1457 nigori.InitByDerivation("localhost", "dummy", passphrase); |
1463 std::string plaintext; | 1458 std::string plaintext; |
1464 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext); | 1459 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 const syncer::ModelTypeSet failed_configuration_types) { | 1542 const syncer::ModelTypeSet failed_configuration_types) { |
1548 HandleInitializationCompletedOnFrontendLoop( | 1543 HandleInitializationCompletedOnFrontendLoop( |
1549 failed_configuration_types.Empty()); | 1544 failed_configuration_types.Empty()); |
1550 } | 1545 } |
1551 | 1546 |
1552 #undef SDVLOG | 1547 #undef SDVLOG |
1553 | 1548 |
1554 #undef SLOG | 1549 #undef SLOG |
1555 | 1550 |
1556 } // namespace browser_sync | 1551 } // namespace browser_sync |
OLD | NEW |