Index: chrome/browser/sync/glue/sync_backend_host.cc |
diff --git a/chrome/browser/sync/glue/sync_backend_host.cc b/chrome/browser/sync/glue/sync_backend_host.cc |
index 54f0cd1cb48b5b47d3d1526718c32d560246c31b..9b7d19d2c7a57677bb69b5fbf07f0e43af463a78 100644 |
--- a/chrome/browser/sync/glue/sync_backend_host.cc |
+++ b/chrome/browser/sync/glue/sync_backend_host.cc |
@@ -43,8 +43,8 @@ |
#include "net/url_request/url_request_context_getter.h" |
#include "sync/internal_api/public/base_transaction.h" |
#include "sync/internal_api/public/engine/model_safe_worker.h" |
-#include "sync/internal_api/public/internal_components_factory_impl.h" |
#include "sync/internal_api/public/http_bridge.h" |
+#include "sync/internal_api/public/internal_components_factory_impl.h" |
#include "sync/internal_api/public/read_transaction.h" |
#include "sync/internal_api/public/sync_manager_factory.h" |
#include "sync/internal_api/public/util/experiments.h" |
@@ -78,7 +78,8 @@ using syncer::SyncCredentials; |
class SyncBackendHost::Core |
: public base::RefCountedThreadSafe<SyncBackendHost::Core>, |
- public syncer::SyncManager::Observer { |
+ public syncer::SyncManager::Observer, |
+ public syncer::SyncNotifierObserver { |
public: |
Core(const std::string& name, |
const FilePath& sync_data_folder_path, |
@@ -110,6 +111,14 @@ class SyncBackendHost::Core |
virtual void OnActionableError( |
const syncer::SyncProtocolError& sync_error) OVERRIDE; |
+ // syncer::SyncNotifierObserver implementation. |
+ virtual void OnNotificationsEnabled() OVERRIDE; |
+ virtual void OnNotificationsDisabled( |
+ syncer::NotificationsDisabledReason reason) OVERRIDE; |
+ virtual void OnIncomingNotification( |
+ const syncer::ObjectIdPayloadMap& id_payloads, |
+ syncer::IncomingNotificationSource source) OVERRIDE; |
+ |
// Note: |
// |
// The Do* methods are the various entry points from our |
@@ -122,9 +131,13 @@ class SyncBackendHost::Core |
void DoInitialize(const DoInitializeOptions& options); |
// Called to perform credential update on behalf of |
- // SyncBackendHost::UpdateCredentials |
+ // SyncBackendHost::UpdateCredentials. |
void DoUpdateCredentials(const syncer::SyncCredentials& credentials); |
+ // Called to update the given registered ids on behalf of |
+ // SyncBackendHost::UpdateRegisteredInvalidationIds. |
+ void DoUpdateRegisteredInvalidationIds(const syncer::ObjectIdSet& ids); |
+ |
// Called to tell the syncapi to start syncing (generally after |
// initialization and authentication). |
void DoStartSyncing(const syncer::ModelSafeRoutingInfo& routing_info); |
@@ -423,6 +436,15 @@ void SyncBackendHost::UpdateCredentials(const SyncCredentials& credentials) { |
credentials)); |
} |
+void SyncBackendHost::UpdateRegisteredInvalidationIds( |
+ const syncer::ObjectIdSet& ids) { |
+ DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
+ DCHECK(sync_thread_.IsRunning()); |
+ sync_thread_.message_loop()->PostTask(FROM_HERE, |
+ base::Bind(&SyncBackendHost::Core::DoUpdateRegisteredInvalidationIds, |
+ core_.get(), ids)); |
+} |
+ |
void SyncBackendHost::StartSyncingWithServer() { |
SDVLOG(1) << "SyncBackendHost::StartSyncingWithServer called."; |
@@ -871,6 +893,8 @@ void SyncBackendHost::Core::OnInitializationComplete( |
if (!success) { |
sync_manager_->RemoveObserver(this); |
+ sync_manager_->UpdateRegisteredInvalidationIds( |
+ this, syncer::ObjectIdSet()); |
sync_manager_->ShutdownOnSyncThread(); |
sync_manager_.reset(); |
} |
@@ -980,6 +1004,35 @@ void SyncBackendHost::Core::OnActionableError( |
sync_error); |
} |
+void SyncBackendHost::Core::OnNotificationsEnabled() { |
+ if (!sync_loop_) |
+ return; |
+ DCHECK_EQ(MessageLoop::current(), sync_loop_); |
+ host_.Call(FROM_HERE, |
+ &SyncBackendHost::HandleNotificationsEnabledOnFrontendLoop); |
+} |
+ |
+void SyncBackendHost::Core::OnNotificationsDisabled( |
+ syncer::NotificationsDisabledReason reason) { |
+ if (!sync_loop_) |
+ return; |
+ DCHECK_EQ(MessageLoop::current(), sync_loop_); |
+ host_.Call(FROM_HERE, |
+ &SyncBackendHost::HandleNotificationsDisabledOnFrontendLoop, |
+ reason); |
+} |
+ |
+void SyncBackendHost::Core::OnIncomingNotification( |
+ const syncer::ObjectIdPayloadMap& id_payloads, |
+ syncer::IncomingNotificationSource source) { |
+ if (!sync_loop_) |
+ return; |
+ DCHECK_EQ(MessageLoop::current(), sync_loop_); |
+ host_.Call(FROM_HERE, |
+ &SyncBackendHost::HandleIncomingNotificationOnFrontendLoop, |
+ id_payloads, source); |
+} |
+ |
void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { |
DCHECK(!sync_loop_); |
sync_loop_ = options.sync_loop; |
@@ -1030,7 +1083,7 @@ void SyncBackendHost::Core::DoInitialize(const DoInitializeOptions& options) { |
&encryptor_, |
options.unrecoverable_error_handler, |
options.report_unrecoverable_error_function); |
- LOG_IF(ERROR, !success) << "Syncapi initialization failed!"; |
+ LOG_IF(ERROR, !success) << "Sync manager initialization failed!"; |
// Now check the command line to see if we need to simulate an |
// unrecoverable error for testing purpose. Note the error is thrown |
@@ -1050,6 +1103,19 @@ void SyncBackendHost::Core::DoUpdateCredentials( |
sync_manager_->UpdateCredentials(credentials); |
} |
+void SyncBackendHost::Core::DoUpdateRegisteredInvalidationIds( |
+ const syncer::ObjectIdSet& ids) { |
+ DCHECK_EQ(MessageLoop::current(), sync_loop_); |
+ // |sync_manager_| may end up being NULL here in tests (in |
+ // synchronous initialization mode) since this is called during |
+ // shutdown. |
+ // |
+ // TODO(akalin): Fix this behavior. |
+ if (sync_manager_.get()) { |
+ sync_manager_->UpdateRegisteredInvalidationIds(this, ids); |
+ } |
+} |
+ |
void SyncBackendHost::Core::DoStartSyncing( |
const syncer::ModelSafeRoutingInfo& routing_info) { |
DCHECK_EQ(MessageLoop::current(), sync_loop_); |
@@ -1095,6 +1161,8 @@ void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { |
DCHECK_EQ(MessageLoop::current(), sync_loop_); |
if (sync_manager_.get()) { |
save_changes_timer_.reset(); |
+ sync_manager_->UpdateRegisteredInvalidationIds( |
+ this, syncer::ObjectIdSet()); |
sync_manager_->ShutdownOnSyncThread(); |
sync_manager_->RemoveObserver(this); |
sync_manager_.reset(); |
@@ -1313,6 +1381,30 @@ void SyncBackendHost::HandleActionableErrorEventOnFrontendLoop( |
frontend_->OnActionableError(sync_error); |
} |
+void SyncBackendHost::HandleNotificationsEnabledOnFrontendLoop() { |
+ if (!frontend_) |
+ return; |
+ DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
+ frontend_->OnNotificationsEnabled(); |
+} |
+ |
+void SyncBackendHost::HandleNotificationsDisabledOnFrontendLoop( |
+ syncer::NotificationsDisabledReason reason) { |
+ if (!frontend_) |
+ return; |
+ DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
+ frontend_->OnNotificationsDisabled(reason); |
+} |
+ |
+void SyncBackendHost::HandleIncomingNotificationOnFrontendLoop( |
+ const syncer::ObjectIdPayloadMap& id_payloads, |
+ syncer::IncomingNotificationSource source) { |
+ if (!frontend_) |
+ return; |
+ DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
+ frontend_->OnIncomingNotification(id_payloads, source); |
+} |
+ |
bool SyncBackendHost::CheckPassphraseAgainstCachedPendingKeys( |
const std::string& passphrase) const { |
DCHECK(cached_pending_keys_.has_blob()); |