Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: chrome/browser/sync/glue/sync_backend_host.cc

Issue 10805002: [Sync] Enable adding notifier observers from ProfileSyncService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix typos Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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>
(...skipping 25 matching lines...) Expand all
36 #include "chrome/common/net/gaia/gaia_constants.h" 36 #include "chrome/common/net/gaia/gaia_constants.h"
37 #include "content/public/browser/browser_thread.h" 37 #include "content/public/browser/browser_thread.h"
38 #include "content/public/browser/notification_service.h" 38 #include "content/public/browser/notification_service.h"
39 #include "content/public/common/content_client.h" 39 #include "content/public/common/content_client.h"
40 #include "jingle/notifier/base/notification_method.h" 40 #include "jingle/notifier/base/notification_method.h"
41 #include "jingle/notifier/base/notifier_options.h" 41 #include "jingle/notifier/base/notifier_options.h"
42 #include "net/base/host_port_pair.h" 42 #include "net/base/host_port_pair.h"
43 #include "net/url_request/url_request_context_getter.h" 43 #include "net/url_request/url_request_context_getter.h"
44 #include "sync/internal_api/public/base_transaction.h" 44 #include "sync/internal_api/public/base_transaction.h"
45 #include "sync/internal_api/public/engine/model_safe_worker.h" 45 #include "sync/internal_api/public/engine/model_safe_worker.h"
46 #include "sync/internal_api/public/http_bridge.h"
46 #include "sync/internal_api/public/internal_components_factory_impl.h" 47 #include "sync/internal_api/public/internal_components_factory_impl.h"
47 #include "sync/internal_api/public/http_bridge.h"
48 #include "sync/internal_api/public/read_transaction.h" 48 #include "sync/internal_api/public/read_transaction.h"
49 #include "sync/internal_api/public/sync_manager_factory.h" 49 #include "sync/internal_api/public/sync_manager_factory.h"
50 #include "sync/internal_api/public/util/experiments.h" 50 #include "sync/internal_api/public/util/experiments.h"
51 #include "sync/notifier/sync_notifier.h" 51 #include "sync/notifier/sync_notifier.h"
52 #include "sync/protocol/encryption.pb.h" 52 #include "sync/protocol/encryption.pb.h"
53 #include "sync/protocol/sync.pb.h" 53 #include "sync/protocol/sync.pb.h"
54 #include "sync/util/nigori.h" 54 #include "sync/util/nigori.h"
55 55
56 static const int kSaveChangesIntervalSeconds = 10; 56 static const int kSaveChangesIntervalSeconds = 10;
57 static const FilePath::CharType kSyncDataFolderName[] = 57 static const FilePath::CharType kSyncDataFolderName[] =
(...skipping 13 matching lines...) Expand all
71 71
72 // Helper macros to log with the syncer thread name; useful when there 72 // Helper macros to log with the syncer thread name; useful when there
73 // are multiple syncers involved. 73 // are multiple syncers involved.
74 74
75 #define SLOG(severity) LOG(severity) << name_ << ": " 75 #define SLOG(severity) LOG(severity) << name_ << ": "
76 76
77 #define SDVLOG(verbose_level) DVLOG(verbose_level) << name_ << ": " 77 #define SDVLOG(verbose_level) DVLOG(verbose_level) << name_ << ": "
78 78
79 class SyncBackendHost::Core 79 class SyncBackendHost::Core
80 : public base::RefCountedThreadSafe<SyncBackendHost::Core>, 80 : public base::RefCountedThreadSafe<SyncBackendHost::Core>,
81 public syncer::SyncManager::Observer { 81 public syncer::SyncManager::Observer,
82 public syncer::SyncNotifierObserver {
82 public: 83 public:
83 Core(const std::string& name, 84 Core(const std::string& name,
84 const FilePath& sync_data_folder_path, 85 const FilePath& sync_data_folder_path,
85 const base::WeakPtr<SyncBackendHost>& backend); 86 const base::WeakPtr<SyncBackendHost>& backend);
86 87
87 // SyncManager::Observer implementation. The Core just acts like an air 88 // SyncManager::Observer implementation. The Core just acts like an air
88 // traffic controller here, forwarding incoming messages to appropriate 89 // traffic controller here, forwarding incoming messages to appropriate
89 // landing threads. 90 // landing threads.
90 virtual void OnSyncCycleCompleted( 91 virtual void OnSyncCycleCompleted(
91 const syncer::sessions::SyncSessionSnapshot& snapshot) OVERRIDE; 92 const syncer::sessions::SyncSessionSnapshot& snapshot) OVERRIDE;
(...skipping 11 matching lines...) Expand all
103 const std::string& bootstrap_token) OVERRIDE; 104 const std::string& bootstrap_token) OVERRIDE;
104 virtual void OnStopSyncingPermanently() OVERRIDE; 105 virtual void OnStopSyncingPermanently() OVERRIDE;
105 virtual void OnUpdatedToken(const std::string& token) OVERRIDE; 106 virtual void OnUpdatedToken(const std::string& token) OVERRIDE;
106 virtual void OnEncryptedTypesChanged( 107 virtual void OnEncryptedTypesChanged(
107 syncer::ModelTypeSet encrypted_types, 108 syncer::ModelTypeSet encrypted_types,
108 bool encrypt_everything) OVERRIDE; 109 bool encrypt_everything) OVERRIDE;
109 virtual void OnEncryptionComplete() OVERRIDE; 110 virtual void OnEncryptionComplete() OVERRIDE;
110 virtual void OnActionableError( 111 virtual void OnActionableError(
111 const syncer::SyncProtocolError& sync_error) OVERRIDE; 112 const syncer::SyncProtocolError& sync_error) OVERRIDE;
112 113
114 // syncer::SyncNotifierObserver implementation.
115 virtual void OnNotificationsEnabled() OVERRIDE;
116 virtual void OnNotificationsDisabled(
117 syncer::NotificationsDisabledReason reason) OVERRIDE;
118 virtual void OnIncomingNotification(
119 const syncer::ObjectIdPayloadMap& id_payloads,
120 syncer::IncomingNotificationSource source) OVERRIDE;
121
113 // Note: 122 // Note:
114 // 123 //
115 // The Do* methods are the various entry points from our 124 // The Do* methods are the various entry points from our
116 // SyncBackendHost. They are all called on the sync thread to 125 // SyncBackendHost. They are all called on the sync thread to
117 // actually perform synchronous (and potentially blocking) syncapi 126 // actually perform synchronous (and potentially blocking) syncapi
118 // operations. 127 // operations.
119 // 128 //
120 // Called to perform initialization of the syncapi on behalf of 129 // Called to perform initialization of the syncapi on behalf of
121 // SyncBackendHost::Initialize. 130 // SyncBackendHost::Initialize.
122 void DoInitialize(const DoInitializeOptions& options); 131 void DoInitialize(const DoInitializeOptions& options);
123 132
124 // Called to perform credential update on behalf of 133 // Called to perform credential update on behalf of
125 // SyncBackendHost::UpdateCredentials 134 // SyncBackendHost::UpdateCredentials
126 void DoUpdateCredentials(const syncer::SyncCredentials& credentials); 135 void DoUpdateCredentials(const syncer::SyncCredentials& credentials);
127 136
137 // Called to update the given registered ids on behalf of
138 // SyncBackendHost::UpdateRegisteredIds
139 void DoUpdateRegisteredIds(const syncer::ObjectIdSet& ids);
140
128 // Called to tell the syncapi to start syncing (generally after 141 // Called to tell the syncapi to start syncing (generally after
129 // initialization and authentication). 142 // initialization and authentication).
130 void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info); 143 void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info);
131 144
132 // Called to set the passphrase for encryption. 145 // Called to set the passphrase for encryption.
133 void DoSetEncryptionPassphrase(const std::string& passphrase, 146 void DoSetEncryptionPassphrase(const std::string& passphrase,
134 bool is_explicit); 147 bool is_explicit);
135 148
136 // Called to decrypt the pending keys. 149 // Called to decrypt the pending keys.
137 void DoSetDecryptionPassphrase(const std::string& passphrase); 150 void DoSetDecryptionPassphrase(const std::string& passphrase);
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 unrecoverable_error_handler, 428 unrecoverable_error_handler,
416 report_unrecoverable_error_function)); 429 report_unrecoverable_error_function));
417 } 430 }
418 431
419 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) { 432 void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) {
420 sync_thread_.message_loop()->PostTask(FROM_HERE, 433 sync_thread_.message_loop()->PostTask(FROM_HERE,
421 base::Bind(&SyncBackendHost::Core::DoUpdateCredentials, core_.get(), 434 base::Bind(&SyncBackendHost::Core::DoUpdateCredentials, core_.get(),
422 credentials)); 435 credentials));
423 } 436 }
424 437
438 void SyncBackendHost::UpdateRegisteredIds(const syncer::ObjectIdSet& ids) {
439 DCHECK_EQ(MessageLoop::current(), frontend_loop_);
440 DCHECK(sync_thread_.IsRunning());
441 sync_thread_.message_loop()->PostTask(FROM_HERE,
442 base::Bind(&SyncBackendHost::Core::DoUpdateRegisteredIds,
443 core_.get(), ids));
444 }
445
425 void SyncBackendHost::StartSyncingWithServer() { 446 void SyncBackendHost::StartSyncingWithServer() {
426 SDVLOG(1) << "SyncBackendHost::StartSyncingWithServer called."; 447 SDVLOG(1) << "SyncBackendHost::StartSyncingWithServer called.";
427 448
428 syncer::ModelSafeRoutingInfo routing_info; 449 syncer::ModelSafeRoutingInfo routing_info;
429 registrar_->GetModelSafeRoutingInfo(&routing_info); 450 registrar_->GetModelSafeRoutingInfo(&routing_info);
430 451
431 sync_thread_.message_loop()->PostTask(FROM_HERE, 452 sync_thread_.message_loop()->PostTask(FROM_HERE,
432 base::Bind(&SyncBackendHost::Core::DoStartSyncing, 453 base::Bind(&SyncBackendHost::Core::DoStartSyncing,
433 core_.get(), routing_info)); 454 core_.get(), routing_info));
434 } 455 }
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 const syncer::SyncProtocolError& sync_error) { 964 const syncer::SyncProtocolError& sync_error) {
944 if (!sync_loop_) 965 if (!sync_loop_)
945 return; 966 return;
946 DCHECK_EQ(MessageLoop::current(), sync_loop_); 967 DCHECK_EQ(MessageLoop::current(), sync_loop_);
947 host_.Call( 968 host_.Call(
948 FROM_HERE, 969 FROM_HERE,
949 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop, 970 &SyncBackendHost::HandleActionableErrorEventOnFrontendLoop,
950 sync_error); 971 sync_error);
951 } 972 }
952 973
974 void SyncBackendHost::Core::OnNotificationsEnabled() {
975 if (!sync_loop_)
976 return;
977 DCHECK_EQ(MessageLoop::current(), sync_loop_);
978 host_.Call(FROM_HERE,
979 &SyncBackendHost::HandleNotificationsEnabledOnFrontendLoop);
980 }
981
982 void SyncBackendHost::Core::OnNotificationsDisabled(
983 syncer::NotificationsDisabledReason reason) {
984 if (!sync_loop_)
985 return;
986 DCHECK_EQ(MessageLoop::current(), sync_loop_);
987 host_.Call(FROM_HERE,
988 &SyncBackendHost::HandleNotificationsDisabledOnFrontendLoop,
989 reason);
990 }
991
992 void SyncBackendHost::Core::OnIncomingNotification(
993 const syncer::ObjectIdPayloadMap& id_payloads,
994 syncer::IncomingNotificationSource source) {
995 if (!sync_loop_)
996 return;
997 DCHECK_EQ(MessageLoop::current(), sync_loop_);
998 host_.Call(FROM_HERE,
999 &SyncBackendHost::HandleIncomingNotificationOnFrontendLoop,
1000 id_payloads, source);
1001 }
1002
953 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { 1003 void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) {
954 DCHECK(!sync_loop_); 1004 DCHECK(!sync_loop_);
955 sync_loop_ = options.sync_loop; 1005 sync_loop_ = options.sync_loop;
956 DCHECK(sync_loop_); 1006 DCHECK(sync_loop_);
957 1007
958 // Blow away the partial or corrupt sync data folder before doing any more 1008 // Blow away the partial or corrupt sync data folder before doing any more
959 // initialization, if necessary. 1009 // initialization, if necessary.
960 if (options.delete_sync_data_folder) { 1010 if (options.delete_sync_data_folder) {
961 DeleteSyncDataFolder(); 1011 DeleteSyncDataFolder();
962 } 1012 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 sync_manager_->ThrowUnrecoverableError(); 1060 sync_manager_->ThrowUnrecoverableError();
1011 } 1061 }
1012 } 1062 }
1013 1063
1014 void SyncBackendHost::Core::DoUpdateCredentials( 1064 void SyncBackendHost::Core::DoUpdateCredentials(
1015 const SyncCredentials& credentials) { 1065 const SyncCredentials& credentials) {
1016 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1066 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1017 sync_manager_->UpdateCredentials(credentials); 1067 sync_manager_->UpdateCredentials(credentials);
1018 } 1068 }
1019 1069
1070 void SyncBackendHost::Core::DoUpdateRegisteredIds(
1071 const syncer::ObjectIdSet& ids) {
1072 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1073 sync_manager_->UpdateRegisteredIds(this, ids);
1074 }
1075
1020 void SyncBackendHost::Core::DoStartSyncing( 1076 void SyncBackendHost::Core::DoStartSyncing(
1021 const syncer::ModelSafeRoutingInfo& routing_info) { 1077 const syncer::ModelSafeRoutingInfo& routing_info) {
1022 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1078 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1023 sync_manager_->StartSyncingNormally(routing_info); 1079 sync_manager_->StartSyncingNormally(routing_info);
1024 } 1080 }
1025 1081
1026 void SyncBackendHost::Core::DoSetEncryptionPassphrase( 1082 void SyncBackendHost::Core::DoSetEncryptionPassphrase(
1027 const std::string& passphrase, 1083 const std::string& passphrase,
1028 bool is_explicit) { 1084 bool is_explicit) {
1029 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1085 DCHECK_EQ(MessageLoop::current(), sync_loop_);
(...skipping 24 matching lines...) Expand all
1054 DCHECK(sync_manager_.get()); 1110 DCHECK(sync_manager_.get());
1055 sync_manager_->StopSyncingForShutdown(closure); 1111 sync_manager_->StopSyncingForShutdown(closure);
1056 } 1112 }
1057 1113
1058 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { 1114 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) {
1059 DCHECK_EQ(MessageLoop::current(), sync_loop_); 1115 DCHECK_EQ(MessageLoop::current(), sync_loop_);
1060 if (!sync_manager_.get()) 1116 if (!sync_manager_.get())
1061 return; 1117 return;
1062 1118
1063 save_changes_timer_.reset(); 1119 save_changes_timer_.reset();
1120 sync_manager_->UpdateRegisteredIds(this, syncer::ObjectIdSet());
1064 sync_manager_->ShutdownOnSyncThread(); 1121 sync_manager_->ShutdownOnSyncThread();
1065 sync_manager_->RemoveObserver(this); 1122 sync_manager_->RemoveObserver(this);
1066 sync_manager_.reset(); 1123 sync_manager_.reset();
1067 chrome_sync_notification_bridge_ = NULL; 1124 chrome_sync_notification_bridge_ = NULL;
1068 registrar_ = NULL; 1125 registrar_ = NULL;
1069 1126
1070 if (sync_disabled) 1127 if (sync_disabled)
1071 DeleteSyncDataFolder(); 1128 DeleteSyncDataFolder();
1072 1129
1073 sync_loop_ = NULL; 1130 sync_loop_ = NULL;
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 } 1322 }
1266 1323
1267 void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop( 1324 void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop(
1268 const syncer::SyncProtocolError& sync_error) { 1325 const syncer::SyncProtocolError& sync_error) {
1269 if (!frontend_) 1326 if (!frontend_)
1270 return; 1327 return;
1271 DCHECK_EQ(MessageLoop::current(), frontend_loop_); 1328 DCHECK_EQ(MessageLoop::current(), frontend_loop_);
1272 frontend_->OnActionableError(sync_error); 1329 frontend_->OnActionableError(sync_error);
1273 } 1330 }
1274 1331
1332 void SyncBackendHost::HandleNotificationsEnabledOnFrontendLoop() {
1333 if (!frontend_)
1334 return;
1335 DCHECK_EQ(MessageLoop::current(), frontend_loop_);
1336 frontend_->OnNotificationsEnabled();
1337 }
1338
1339 void SyncBackendHost::HandleNotificationsDisabledOnFrontendLoop(
1340 syncer::NotificationsDisabledReason reason) {
1341 if (!frontend_)
1342 return;
1343 DCHECK_EQ(MessageLoop::current(), frontend_loop_);
1344 frontend_->OnNotificationsDisabled(reason);
1345 }
1346
1347 void SyncBackendHost::HandleIncomingNotificationOnFrontendLoop(
1348 const syncer::ObjectIdPayloadMap& id_payloads,
1349 syncer::IncomingNotificationSource source) {
1350 if (!frontend_)
1351 return;
1352 DCHECK_EQ(MessageLoop::current(), frontend_loop_);
1353 frontend_->OnIncomingNotification(id_payloads, source);
1354 }
1355
1275 bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys( 1356 bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys(
1276 const std::string& passphrase) const { 1357 const std::string& passphrase) const {
1277 DCHECK(cached_pending_keys_.has_blob()); 1358 DCHECK(cached_pending_keys_.has_blob());
1278 DCHECK(!passphrase.empty()); 1359 DCHECK(!passphrase.empty());
1279 syncer::Nigori nigori; 1360 syncer::Nigori nigori;
1280 nigori.InitByDerivation("localhost", "dummy", passphrase); 1361 nigori.InitByDerivation("localhost", "dummy", passphrase);
1281 std::string plaintext; 1362 std::string plaintext;
1282 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext); 1363 bool result = nigori.Decrypt(cached_pending_keys_.blob(), &plaintext);
1283 return result; 1364 return result;
1284 } 1365 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 FROM_HERE, 1460 FROM_HERE,
1380 base::Bind(&SyncBackendHost::Core::DoRefreshNigori, 1461 base::Bind(&SyncBackendHost::Core::DoRefreshNigori,
1381 core_.get(), sync_thread_done_callback)); 1462 core_.get(), sync_thread_done_callback));
1382 } 1463 }
1383 1464
1384 #undef SDVLOG 1465 #undef SDVLOG
1385 1466
1386 #undef SLOG 1467 #undef SLOG
1387 1468
1388 } // namespace browser_sync 1469 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698