OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/sync/driver/glue/sync_backend_host_impl.h" | 5 #include "components/sync/driver/glue/sync_backend_host_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 new syncer::InternalComponentsFactoryImpl(factory_switches)), | 131 new syncer::InternalComponentsFactoryImpl(factory_switches)), |
132 unrecoverable_error_handler, report_unrecoverable_error_function, | 132 unrecoverable_error_handler, report_unrecoverable_error_function, |
133 std::move(saved_nigori_state), invalidation_versions)); | 133 std::move(saved_nigori_state), invalidation_versions)); |
134 InitCore(std::move(init_opts)); | 134 InitCore(std::move(init_opts)); |
135 } | 135 } |
136 | 136 |
137 void SyncBackendHostImpl::TriggerRefresh(const syncer::ModelTypeSet& types) { | 137 void SyncBackendHostImpl::TriggerRefresh(const syncer::ModelTypeSet& types) { |
138 DCHECK(ui_thread_->BelongsToCurrentThread()); | 138 DCHECK(ui_thread_->BelongsToCurrentThread()); |
139 registrar_->sync_thread()->task_runner()->PostTask( | 139 registrar_->sync_thread()->task_runner()->PostTask( |
140 FROM_HERE, | 140 FROM_HERE, |
141 base::Bind(&SyncBackendHostCore::DoRefreshTypes, core_.get(), types)); | 141 base::Bind(&SyncBackendHostCore::DoRefreshTypes, core_, types)); |
142 } | 142 } |
143 | 143 |
144 void SyncBackendHostImpl::UpdateCredentials( | 144 void SyncBackendHostImpl::UpdateCredentials( |
145 const syncer::SyncCredentials& credentials) { | 145 const syncer::SyncCredentials& credentials) { |
146 DCHECK(registrar_->sync_thread()->IsRunning()); | 146 DCHECK(registrar_->sync_thread()->IsRunning()); |
147 registrar_->sync_thread()->task_runner()->PostTask( | 147 registrar_->sync_thread()->task_runner()->PostTask( |
148 FROM_HERE, base::Bind(&SyncBackendHostCore::DoUpdateCredentials, | 148 FROM_HERE, base::Bind(&SyncBackendHostCore::DoUpdateCredentials, |
149 core_.get(), credentials)); | 149 core_, credentials)); |
150 } | 150 } |
151 | 151 |
152 void SyncBackendHostImpl::StartSyncingWithServer() { | 152 void SyncBackendHostImpl::StartSyncingWithServer() { |
153 SDVLOG(1) << "SyncBackendHostImpl::StartSyncingWithServer called."; | 153 SDVLOG(1) << "SyncBackendHostImpl::StartSyncingWithServer called."; |
154 | 154 |
155 syncer::ModelSafeRoutingInfo routing_info; | 155 syncer::ModelSafeRoutingInfo routing_info; |
156 registrar_->GetModelSafeRoutingInfo(&routing_info); | 156 registrar_->GetModelSafeRoutingInfo(&routing_info); |
157 | 157 |
158 registrar_->sync_thread()->task_runner()->PostTask( | 158 registrar_->sync_thread()->task_runner()->PostTask( |
159 FROM_HERE, base::Bind(&SyncBackendHostCore::DoStartSyncing, core_.get(), | 159 FROM_HERE, base::Bind(&SyncBackendHostCore::DoStartSyncing, core_, |
160 routing_info, sync_prefs_->GetLastPollTime())); | 160 routing_info, sync_prefs_->GetLastPollTime())); |
161 } | 161 } |
162 | 162 |
163 void SyncBackendHostImpl::SetEncryptionPassphrase(const std::string& passphrase, | 163 void SyncBackendHostImpl::SetEncryptionPassphrase(const std::string& passphrase, |
164 bool is_explicit) { | 164 bool is_explicit) { |
165 DCHECK(registrar_->sync_thread()->IsRunning()); | 165 DCHECK(registrar_->sync_thread()->IsRunning()); |
166 if (!IsNigoriEnabled()) { | 166 if (!IsNigoriEnabled()) { |
167 NOTREACHED() << "SetEncryptionPassphrase must never be called when nigori" | 167 NOTREACHED() << "SetEncryptionPassphrase must never be called when nigori" |
168 " is disabled."; | 168 " is disabled."; |
169 return; | 169 return; |
170 } | 170 } |
171 | 171 |
172 // We should never be called with an empty passphrase. | 172 // We should never be called with an empty passphrase. |
173 DCHECK(!passphrase.empty()); | 173 DCHECK(!passphrase.empty()); |
174 | 174 |
175 // This should only be called by the frontend. | 175 // This should only be called by the frontend. |
176 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); | 176 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); |
177 | 177 |
178 // SetEncryptionPassphrase should never be called if we are currently | 178 // SetEncryptionPassphrase should never be called if we are currently |
179 // encrypted with an explicit passphrase. | 179 // encrypted with an explicit passphrase. |
180 DCHECK(cached_passphrase_type_ == syncer::KEYSTORE_PASSPHRASE || | 180 DCHECK(cached_passphrase_type_ == syncer::KEYSTORE_PASSPHRASE || |
181 cached_passphrase_type_ == syncer::IMPLICIT_PASSPHRASE); | 181 cached_passphrase_type_ == syncer::IMPLICIT_PASSPHRASE); |
182 | 182 |
183 // Post an encryption task on the syncer thread. | 183 // Post an encryption task on the syncer thread. |
184 registrar_->sync_thread()->task_runner()->PostTask( | 184 registrar_->sync_thread()->task_runner()->PostTask( |
185 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetEncryptionPassphrase, | 185 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetEncryptionPassphrase, |
186 core_.get(), passphrase, is_explicit)); | 186 core_, passphrase, is_explicit)); |
187 } | 187 } |
188 | 188 |
189 bool SyncBackendHostImpl::SetDecryptionPassphrase( | 189 bool SyncBackendHostImpl::SetDecryptionPassphrase( |
190 const std::string& passphrase) { | 190 const std::string& passphrase) { |
191 if (!IsNigoriEnabled()) { | 191 if (!IsNigoriEnabled()) { |
192 NOTREACHED() << "SetDecryptionPassphrase must never be called when nigori" | 192 NOTREACHED() << "SetDecryptionPassphrase must never be called when nigori" |
193 " is disabled."; | 193 " is disabled."; |
194 return false; | 194 return false; |
195 } | 195 } |
196 | 196 |
197 // We should never be called with an empty passphrase. | 197 // We should never be called with an empty passphrase. |
198 DCHECK(!passphrase.empty()); | 198 DCHECK(!passphrase.empty()); |
199 | 199 |
200 // This should only be called by the frontend. | 200 // This should only be called by the frontend. |
201 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); | 201 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); |
202 | 202 |
203 // This should only be called when we have cached pending keys. | 203 // This should only be called when we have cached pending keys. |
204 DCHECK(cached_pending_keys_.has_blob()); | 204 DCHECK(cached_pending_keys_.has_blob()); |
205 | 205 |
206 // Check the passphrase that was provided against our local cache of the | 206 // Check the passphrase that was provided against our local cache of the |
207 // cryptographer's pending keys. If this was unsuccessful, the UI layer can | 207 // cryptographer's pending keys. If this was unsuccessful, the UI layer can |
208 // immediately call OnPassphraseRequired without showing the user a spinner. | 208 // immediately call OnPassphraseRequired without showing the user a spinner. |
209 if (!CheckPassphraseAgainstCachedPendingKeys(passphrase)) | 209 if (!CheckPassphraseAgainstCachedPendingKeys(passphrase)) |
210 return false; | 210 return false; |
211 | 211 |
212 // Post a decryption task on the syncer thread. | 212 // Post a decryption task on the syncer thread. |
213 registrar_->sync_thread()->task_runner()->PostTask( | 213 registrar_->sync_thread()->task_runner()->PostTask( |
214 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetDecryptionPassphrase, | 214 FROM_HERE, base::Bind(&SyncBackendHostCore::DoSetDecryptionPassphrase, |
215 core_.get(), passphrase)); | 215 core_, passphrase)); |
216 | 216 |
217 // Since we were able to decrypt the cached pending keys with the passphrase | 217 // Since we were able to decrypt the cached pending keys with the passphrase |
218 // provided, we immediately alert the UI layer that the passphrase was | 218 // provided, we immediately alert the UI layer that the passphrase was |
219 // accepted. This will avoid the situation where a user enters a passphrase, | 219 // accepted. This will avoid the situation where a user enters a passphrase, |
220 // clicks OK, immediately reopens the advanced settings dialog, and gets an | 220 // clicks OK, immediately reopens the advanced settings dialog, and gets an |
221 // unnecessary prompt for a passphrase. | 221 // unnecessary prompt for a passphrase. |
222 // Note: It is not guaranteed that the passphrase will be accepted by the | 222 // Note: It is not guaranteed that the passphrase will be accepted by the |
223 // syncer thread, since we could receive a new nigori node while the task is | 223 // syncer thread, since we could receive a new nigori node while the task is |
224 // pending. This scenario is a valid race, and SetDecryptionPassphrase can | 224 // pending. This scenario is a valid race, and SetDecryptionPassphrase can |
225 // trigger a new OnPassphraseRequired if it needs to. | 225 // trigger a new OnPassphraseRequired if it needs to. |
(...skipping 30 matching lines...) Expand all Loading... |
256 invalidator_->UnregisterInvalidationHandler(this); | 256 invalidator_->UnregisterInvalidationHandler(this); |
257 invalidator_ = NULL; | 257 invalidator_ = NULL; |
258 } | 258 } |
259 invalidation_handler_registered_ = false; | 259 invalidation_handler_registered_ = false; |
260 | 260 |
261 model_type_connector_.reset(); | 261 model_type_connector_.reset(); |
262 | 262 |
263 // Shut down and destroy sync manager. | 263 // Shut down and destroy sync manager. |
264 registrar_->sync_thread()->task_runner()->PostTask( | 264 registrar_->sync_thread()->task_runner()->PostTask( |
265 FROM_HERE, | 265 FROM_HERE, |
266 base::Bind(&SyncBackendHostCore::DoShutdown, core_.get(), reason)); | 266 base::Bind(&SyncBackendHostCore::DoShutdown, core_, reason)); |
267 core_ = NULL; | 267 core_ = NULL; |
268 | 268 |
269 // Worker cleanup. | 269 // Worker cleanup. |
270 SyncBackendRegistrar* detached_registrar = registrar_.release(); | 270 SyncBackendRegistrar* detached_registrar = registrar_.release(); |
271 detached_registrar->sync_thread()->task_runner()->PostTask( | 271 detached_registrar->sync_thread()->task_runner()->PostTask( |
272 FROM_HERE, base::Bind(&SyncBackendRegistrar::Shutdown, | 272 FROM_HERE, base::Bind(&SyncBackendRegistrar::Shutdown, |
273 base::Unretained(detached_registrar))); | 273 base::Unretained(detached_registrar))); |
274 | 274 |
275 if (sync_thread_claimed) | 275 if (sync_thread_claimed) |
276 return detached_registrar->ReleaseSyncThread(); | 276 return detached_registrar->ReleaseSyncThread(); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 DCHECK(syncer::Intersection(active_types, types_to_purge).Empty()); | 402 DCHECK(syncer::Intersection(active_types, types_to_purge).Empty()); |
403 DCHECK(syncer::Intersection(active_types, fatal_types).Empty()); | 403 DCHECK(syncer::Intersection(active_types, fatal_types).Empty()); |
404 DCHECK(syncer::Intersection(active_types, unapply_types).Empty()); | 404 DCHECK(syncer::Intersection(active_types, unapply_types).Empty()); |
405 DCHECK(syncer::Intersection(active_types, inactive_types).Empty()); | 405 DCHECK(syncer::Intersection(active_types, inactive_types).Empty()); |
406 return syncer::Difference(active_types, types_to_download); | 406 return syncer::Difference(active_types, types_to_download); |
407 } | 407 } |
408 | 408 |
409 void SyncBackendHostImpl::EnableEncryptEverything() { | 409 void SyncBackendHostImpl::EnableEncryptEverything() { |
410 registrar_->sync_thread()->task_runner()->PostTask( | 410 registrar_->sync_thread()->task_runner()->PostTask( |
411 FROM_HERE, | 411 FROM_HERE, |
412 base::Bind(&SyncBackendHostCore::DoEnableEncryptEverything, core_.get())); | 412 base::Bind(&SyncBackendHostCore::DoEnableEncryptEverything, core_)); |
413 } | 413 } |
414 | 414 |
415 void SyncBackendHostImpl::ActivateDirectoryDataType( | 415 void SyncBackendHostImpl::ActivateDirectoryDataType( |
416 syncer::ModelType type, | 416 syncer::ModelType type, |
417 syncer::ModelSafeGroup group, | 417 syncer::ModelSafeGroup group, |
418 sync_driver::ChangeProcessor* change_processor) { | 418 sync_driver::ChangeProcessor* change_processor) { |
419 registrar_->ActivateDataType(type, group, change_processor, GetUserShare()); | 419 registrar_->ActivateDataType(type, group, change_processor, GetUserShare()); |
420 } | 420 } |
421 | 421 |
422 void SyncBackendHostImpl::DeactivateDirectoryDataType(syncer::ModelType type) { | 422 void SyncBackendHostImpl::DeactivateDirectoryDataType(syncer::ModelType type) { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 ScopedVector<base::ListValue>)> callback) { | 525 ScopedVector<base::ListValue>)> callback) { |
526 DCHECK(initialized()); | 526 DCHECK(initialized()); |
527 registrar_->sync_thread()->task_runner()->PostTask( | 527 registrar_->sync_thread()->task_runner()->PostTask( |
528 FROM_HERE, base::Bind(&SyncBackendHostCore::GetAllNodesForTypes, core_, | 528 FROM_HERE, base::Bind(&SyncBackendHostCore::GetAllNodesForTypes, core_, |
529 types, frontend_task_runner_, callback)); | 529 types, frontend_task_runner_, callback)); |
530 } | 530 } |
531 | 531 |
532 void SyncBackendHostImpl::InitCore( | 532 void SyncBackendHostImpl::InitCore( |
533 std::unique_ptr<DoInitializeOptions> options) { | 533 std::unique_ptr<DoInitializeOptions> options) { |
534 registrar_->sync_thread()->task_runner()->PostTask( | 534 registrar_->sync_thread()->task_runner()->PostTask( |
535 FROM_HERE, base::Bind(&SyncBackendHostCore::DoInitialize, core_.get(), | 535 FROM_HERE, base::Bind(&SyncBackendHostCore::DoInitialize, core_, |
536 base::Passed(&options))); | 536 base::Passed(&options))); |
537 } | 537 } |
538 | 538 |
539 void SyncBackendHostImpl::RequestConfigureSyncer( | 539 void SyncBackendHostImpl::RequestConfigureSyncer( |
540 syncer::ConfigureReason reason, | 540 syncer::ConfigureReason reason, |
541 syncer::ModelTypeSet to_download, | 541 syncer::ModelTypeSet to_download, |
542 syncer::ModelTypeSet to_purge, | 542 syncer::ModelTypeSet to_purge, |
543 syncer::ModelTypeSet to_journal, | 543 syncer::ModelTypeSet to_journal, |
544 syncer::ModelTypeSet to_unapply, | 544 syncer::ModelTypeSet to_unapply, |
545 syncer::ModelTypeSet to_ignore, | 545 syncer::ModelTypeSet to_ignore, |
546 const syncer::ModelSafeRoutingInfo& routing_info, | 546 const syncer::ModelSafeRoutingInfo& routing_info, |
547 const base::Callback<void(syncer::ModelTypeSet, syncer::ModelTypeSet)>& | 547 const base::Callback<void(syncer::ModelTypeSet, syncer::ModelTypeSet)>& |
548 ready_task, | 548 ready_task, |
549 const base::Closure& retry_callback) { | 549 const base::Closure& retry_callback) { |
550 DoConfigureSyncerTypes config_types; | 550 DoConfigureSyncerTypes config_types; |
551 config_types.to_download = to_download; | 551 config_types.to_download = to_download; |
552 config_types.to_purge = to_purge; | 552 config_types.to_purge = to_purge; |
553 config_types.to_journal = to_journal; | 553 config_types.to_journal = to_journal; |
554 config_types.to_unapply = to_unapply; | 554 config_types.to_unapply = to_unapply; |
555 registrar_->sync_thread()->task_runner()->PostTask( | 555 registrar_->sync_thread()->task_runner()->PostTask( |
556 FROM_HERE, | 556 FROM_HERE, |
557 base::Bind(&SyncBackendHostCore::DoConfigureSyncer, core_.get(), reason, | 557 base::Bind(&SyncBackendHostCore::DoConfigureSyncer, core_, reason, |
558 config_types, routing_info, ready_task, retry_callback)); | 558 config_types, routing_info, ready_task, retry_callback)); |
559 } | 559 } |
560 | 560 |
561 void SyncBackendHostImpl::FinishConfigureDataTypesOnFrontendLoop( | 561 void SyncBackendHostImpl::FinishConfigureDataTypesOnFrontendLoop( |
562 const syncer::ModelTypeSet enabled_types, | 562 const syncer::ModelTypeSet enabled_types, |
563 const syncer::ModelTypeSet succeeded_configuration_types, | 563 const syncer::ModelTypeSet succeeded_configuration_types, |
564 const syncer::ModelTypeSet failed_configuration_types, | 564 const syncer::ModelTypeSet failed_configuration_types, |
565 const base::Callback<void(syncer::ModelTypeSet, syncer::ModelTypeSet)>& | 565 const base::Callback<void(syncer::ModelTypeSet, syncer::ModelTypeSet)>& |
566 ready_task) { | 566 ready_task) { |
567 if (!frontend_) | 567 if (!frontend_) |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 if (!frontend_) | 676 if (!frontend_) |
677 return; | 677 return; |
678 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); | 678 DCHECK(frontend_task_runner_->BelongsToCurrentThread()); |
679 frontend_->OnMigrationNeededForTypes(types); | 679 frontend_->OnMigrationNeededForTypes(types); |
680 } | 680 } |
681 | 681 |
682 void SyncBackendHostImpl::OnInvalidatorStateChange( | 682 void SyncBackendHostImpl::OnInvalidatorStateChange( |
683 syncer::InvalidatorState state) { | 683 syncer::InvalidatorState state) { |
684 registrar_->sync_thread()->task_runner()->PostTask( | 684 registrar_->sync_thread()->task_runner()->PostTask( |
685 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnInvalidatorStateChange, | 685 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnInvalidatorStateChange, |
686 core_.get(), state)); | 686 core_, state)); |
687 } | 687 } |
688 | 688 |
689 void SyncBackendHostImpl::OnIncomingInvalidation( | 689 void SyncBackendHostImpl::OnIncomingInvalidation( |
690 const syncer::ObjectIdInvalidationMap& invalidation_map) { | 690 const syncer::ObjectIdInvalidationMap& invalidation_map) { |
691 registrar_->sync_thread()->task_runner()->PostTask( | 691 registrar_->sync_thread()->task_runner()->PostTask( |
692 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnIncomingInvalidation, | 692 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnIncomingInvalidation, |
693 core_.get(), invalidation_map)); | 693 core_, invalidation_map)); |
694 } | 694 } |
695 | 695 |
696 std::string SyncBackendHostImpl::GetOwnerName() const { | 696 std::string SyncBackendHostImpl::GetOwnerName() const { |
697 return "SyncBackendHostImpl"; | 697 return "SyncBackendHostImpl"; |
698 } | 698 } |
699 | 699 |
700 bool SyncBackendHostImpl::CheckPassphraseAgainstCachedPendingKeys( | 700 bool SyncBackendHostImpl::CheckPassphraseAgainstCachedPendingKeys( |
701 const std::string& passphrase) const { | 701 const std::string& passphrase) const { |
702 DCHECK(cached_pending_keys_.has_blob()); | 702 DCHECK(cached_pending_keys_.has_blob()); |
703 DCHECK(!passphrase.empty()); | 703 DCHECK(!passphrase.empty()); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 | 819 |
820 base::MessageLoop* SyncBackendHostImpl::GetSyncLoopForTesting() { | 820 base::MessageLoop* SyncBackendHostImpl::GetSyncLoopForTesting() { |
821 return registrar_->sync_thread()->message_loop(); | 821 return registrar_->sync_thread()->message_loop(); |
822 } | 822 } |
823 | 823 |
824 void SyncBackendHostImpl::RefreshTypesForTest(syncer::ModelTypeSet types) { | 824 void SyncBackendHostImpl::RefreshTypesForTest(syncer::ModelTypeSet types) { |
825 DCHECK(ui_thread_->BelongsToCurrentThread()); | 825 DCHECK(ui_thread_->BelongsToCurrentThread()); |
826 | 826 |
827 registrar_->sync_thread()->task_runner()->PostTask( | 827 registrar_->sync_thread()->task_runner()->PostTask( |
828 FROM_HERE, | 828 FROM_HERE, |
829 base::Bind(&SyncBackendHostCore::DoRefreshTypes, core_.get(), types)); | 829 base::Bind(&SyncBackendHostCore::DoRefreshTypes, core_, types)); |
830 } | 830 } |
831 | 831 |
832 void SyncBackendHostImpl::ClearServerData( | 832 void SyncBackendHostImpl::ClearServerData( |
833 const syncer::SyncManager::ClearServerDataCallback& callback) { | 833 const syncer::SyncManager::ClearServerDataCallback& callback) { |
834 DCHECK(ui_thread_->BelongsToCurrentThread()); | 834 DCHECK(ui_thread_->BelongsToCurrentThread()); |
835 registrar_->sync_thread()->task_runner()->PostTask( | 835 registrar_->sync_thread()->task_runner()->PostTask( |
836 FROM_HERE, base::Bind(&SyncBackendHostCore::DoClearServerData, | 836 FROM_HERE, base::Bind(&SyncBackendHostCore::DoClearServerData, |
837 core_.get(), callback)); | 837 core_, callback)); |
838 } | 838 } |
839 | 839 |
840 void SyncBackendHostImpl::OnCookieJarChanged(bool account_mismatch, | 840 void SyncBackendHostImpl::OnCookieJarChanged(bool account_mismatch, |
841 bool empty_jar) { | 841 bool empty_jar) { |
842 DCHECK(ui_thread_->BelongsToCurrentThread()); | 842 DCHECK(ui_thread_->BelongsToCurrentThread()); |
843 registrar_->sync_thread()->task_runner()->PostTask( | 843 registrar_->sync_thread()->task_runner()->PostTask( |
844 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnCookieJarChanged, | 844 FROM_HERE, base::Bind(&SyncBackendHostCore::DoOnCookieJarChanged, |
845 core_.get(), account_mismatch, empty_jar)); | 845 core_, account_mismatch, empty_jar)); |
846 } | 846 } |
847 | 847 |
848 void SyncBackendHostImpl::ClearServerDataDoneOnFrontendLoop( | 848 void SyncBackendHostImpl::ClearServerDataDoneOnFrontendLoop( |
849 const syncer::SyncManager::ClearServerDataCallback& frontend_callback) { | 849 const syncer::SyncManager::ClearServerDataCallback& frontend_callback) { |
850 DCHECK(ui_thread_->BelongsToCurrentThread()); | 850 DCHECK(ui_thread_->BelongsToCurrentThread()); |
851 frontend_callback.Run(); | 851 frontend_callback.Run(); |
852 } | 852 } |
853 | 853 |
854 } // namespace browser_sync | 854 } // namespace browser_sync |
855 | 855 |
856 #undef SDVLOG | 856 #undef SDVLOG |
857 | 857 |
858 #undef SLOG | 858 #undef SLOG |
OLD | NEW |