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

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

Issue 7511004: [Sync] Refactor data type configuration/activation/deactivation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix tests, address comments Created 9 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "chrome/common/pref_names.h" 42 #include "chrome/common/pref_names.h"
43 #include "content/browser/browser_thread.h" 43 #include "content/browser/browser_thread.h"
44 #include "content/common/notification_service.h" 44 #include "content/common/notification_service.h"
45 #include "googleurl/src/gurl.h" 45 #include "googleurl/src/gurl.h"
46 #include "webkit/glue/webkit_glue.h" 46 #include "webkit/glue/webkit_glue.h"
47 47
48 static const int kSaveChangesIntervalSeconds = 10; 48 static const int kSaveChangesIntervalSeconds = 10;
49 static const FilePath::CharType kSyncDataFolderName[] = 49 static const FilePath::CharType kSyncDataFolderName[] =
50 FILE_PATH_LITERAL("Sync Data"); 50 FILE_PATH_LITERAL("Sync Data");
51 51
52 using browser_sync::DataTypeController;
53 typedef TokenService::TokenAvailableDetails TokenAvailableDetails; 52 typedef TokenService::TokenAvailableDetails TokenAvailableDetails;
54 53
55 typedef GoogleServiceAuthError AuthError; 54 typedef GoogleServiceAuthError AuthError;
56 55
57 namespace browser_sync { 56 namespace browser_sync {
58 57
59 using sessions::SyncSessionSnapshot; 58 using sessions::SyncSessionSnapshot;
60 using sync_api::SyncCredentials; 59 using sync_api::SyncCredentials;
61 60
62 SyncBackendHost::SyncBackendHost(Profile* profile) 61 SyncBackendHost::SyncBackendHost(Profile* profile)
(...skipping 26 matching lines...) Expand all
89 88
90 SyncBackendHost::~SyncBackendHost() { 89 SyncBackendHost::~SyncBackendHost() {
91 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor."; 90 DCHECK(!core_ && !frontend_) << "Must call Shutdown before destructor.";
92 DCHECK(registrar_.workers.empty()); 91 DCHECK(registrar_.workers.empty());
93 } 92 }
94 93
95 void SyncBackendHost::Initialize( 94 void SyncBackendHost::Initialize(
96 SyncFrontend* frontend, 95 SyncFrontend* frontend,
97 const WeakHandle<JsEventHandler>& event_handler, 96 const WeakHandle<JsEventHandler>& event_handler,
98 const GURL& sync_service_url, 97 const GURL& sync_service_url,
99 const syncable::ModelTypeSet& types, 98 const syncable::ModelTypeSet& initial_types,
100 const SyncCredentials& credentials, 99 const SyncCredentials& credentials,
101 bool delete_sync_data_folder) { 100 bool delete_sync_data_folder) {
102 if (!sync_thread_.Start()) 101 if (!sync_thread_.Start())
103 return; 102 return;
104 103
105 frontend_ = frontend; 104 frontend_ = frontend;
106 DCHECK(frontend); 105 DCHECK(frontend);
107 106
108 registrar_.workers[GROUP_DB] = new DatabaseModelWorker(); 107 registrar_.workers[GROUP_DB] = new DatabaseModelWorker();
109 registrar_.workers[GROUP_UI] = new UIModelWorker(); 108 registrar_.workers[GROUP_UI] = new UIModelWorker();
110 registrar_.workers[GROUP_PASSIVE] = new ModelSafeWorker(); 109 registrar_.workers[GROUP_PASSIVE] = new ModelSafeWorker();
111 registrar_.workers[GROUP_HISTORY] = new HistoryModelWorker( 110 registrar_.workers[GROUP_HISTORY] = new HistoryModelWorker(
112 profile_->GetHistoryService(Profile::IMPLICIT_ACCESS)); 111 profile_->GetHistoryService(Profile::IMPLICIT_ACCESS));
113 112
114 // Any datatypes that we want the syncer to pull down must 113 // Any datatypes that we want the syncer to pull down must
115 // be in the routing_info map. We set them to group passive, meaning that 114 // be in the routing_info map. We set them to group passive, meaning that
116 // updates will be applied to sync, but not dispatched to the native models. 115 // updates will be applied to sync, but not dispatched to the native models.
117 for (syncable::ModelTypeSet::const_iterator it = types.begin(); 116 for (syncable::ModelTypeSet::const_iterator it = initial_types.begin();
118 it != types.end(); ++it) { 117 it != initial_types.end(); ++it) {
119 registrar_.routing_info[(*it)] = GROUP_PASSIVE; 118 registrar_.routing_info[(*it)] = GROUP_PASSIVE;
120 } 119 }
121 120
122 if (profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted)) 121 if (profile_->GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted))
123 registrar_.routing_info[syncable::NIGORI] = GROUP_PASSIVE; 122 registrar_.routing_info[syncable::NIGORI] = GROUP_PASSIVE;
124 123
125 PasswordStore* password_store = 124 PasswordStore* password_store =
126 profile_->GetPasswordStore(Profile::IMPLICIT_ACCESS); 125 profile_->GetPasswordStore(Profile::IMPLICIT_ACCESS);
127 if (password_store) { 126 if (password_store) {
128 registrar_.workers[GROUP_PASSWORD] = 127 registrar_.workers[GROUP_PASSWORD] =
129 new PasswordModelWorker(password_store); 128 new PasswordModelWorker(password_store);
130 } else { 129 } else {
131 LOG_IF(WARNING, types.count(syncable::PASSWORDS) > 0) << "Password store " 130 LOG_IF(WARNING, initial_types.count(syncable::PASSWORDS) > 0)
132 << "not initialized, cannot sync passwords"; 131 << "Password store not initialized, cannot sync passwords";
133 registrar_.routing_info.erase(syncable::PASSWORDS); 132 registrar_.routing_info.erase(syncable::PASSWORDS);
134 } 133 }
135 134
136 InitCore(Core::DoInitializeOptions( 135 InitCore(Core::DoInitializeOptions(
137 event_handler, 136 event_handler,
138 sync_service_url, 137 sync_service_url,
139 profile_->GetRequestContext(), 138 profile_->GetRequestContext(),
140 credentials, 139 credentials,
141 delete_sync_data_folder, 140 delete_sync_data_folder,
142 RestoreEncryptionBootstrapToken(), 141 RestoreEncryptionBootstrapToken(),
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 } 273 }
275 274
276 SyncBackendHost::PendingConfigureDataTypesState:: 275 SyncBackendHost::PendingConfigureDataTypesState::
277 PendingConfigureDataTypesState() 276 PendingConfigureDataTypesState()
278 : reason(sync_api::CONFIGURE_REASON_UNKNOWN) {} 277 : reason(sync_api::CONFIGURE_REASON_UNKNOWN) {}
279 278
280 SyncBackendHost::PendingConfigureDataTypesState:: 279 SyncBackendHost::PendingConfigureDataTypesState::
281 ~PendingConfigureDataTypesState() {} 280 ~PendingConfigureDataTypesState() {}
282 281
283 void SyncBackendHost::GetPendingConfigModeState( 282 void SyncBackendHost::GetPendingConfigModeState(
284 const DataTypeController::TypeMap& data_type_controllers, 283 const syncable::ModelTypeSet& types_to_add,
285 const syncable::ModelTypeSet& types, 284 const syncable::ModelTypeSet& types_to_remove,
286 base::Callback<void(bool)> ready_task, 285 base::Callback<void(bool)> ready_task,
287 ModelSafeRoutingInfo* routing_info, 286 ModelSafeRoutingInfo* routing_info,
288 sync_api::ConfigureReason reason, 287 sync_api::ConfigureReason reason,
289 bool nigori_enabled, 288 SyncBackendHost::PendingConfigureDataTypesState* state) {
290 SyncBackendHost::PendingConfigureDataTypesState* state, 289 if (DCHECK_IS_ON()) {
291 bool* deleted_type) { 290 syncable::ModelTypeSet intersection;
291 std::set_intersection(
292 types_to_add.begin(), types_to_add.end(),
293 types_to_remove.begin(), types_to_remove.end(),
294 std::inserter(intersection, intersection.end()));
295 DCHECK(intersection.empty());
296 }
292 *state = SyncBackendHost::PendingConfigureDataTypesState(); 297 *state = SyncBackendHost::PendingConfigureDataTypesState();
293 *deleted_type = false; 298
294 for (DataTypeController::TypeMap::const_iterator it = 299 for (syncable::ModelTypeSet::const_iterator it = types_to_add.begin();
295 data_type_controllers.begin(); 300 it != types_to_add.end(); ++it) {
296 it != data_type_controllers.end(); ++it) { 301 syncable::ModelType type = *it;
297 syncable::ModelType type = it->first; 302 // Add a newly specified data type as GROUP_PASSIVE into the
298 // If a type is not specified, remove it from the routing_info. 303 // routing_info, if it does not already exist.
299 if (types.count(type) == 0) { 304 if (routing_info->count(type) == 0) {
300 *deleted_type = true; 305 (*routing_info)[type] = GROUP_PASSIVE;
301 routing_info->erase(type); 306 state->added_types.insert(type);
302 } else {
303 // Add a newly specified data type as GROUP_PASSIVE into the
304 // routing_info, if it does not already exist.
305 if (routing_info->count(type) == 0) {
306 (*routing_info)[type] = GROUP_PASSIVE;
307 state->added_types.set(type);
308 }
309 } 307 }
310 } 308 }
311 309
312 // We must handle NIGORI separately as it has no DataTypeController. 310 for (syncable::ModelTypeSet::const_iterator it = types_to_remove.begin();
313 if (types.count(syncable::NIGORI) == 0) { 311 it != types_to_remove.end(); ++it) {
314 if (nigori_enabled) { // Nigori is currently enabled. 312 routing_info->erase(*it);
315 *deleted_type = true;
316 routing_info->erase(syncable::NIGORI);
317 // IsNigoriEnabled is now false.
318 }
319 } else { // Nigori needs to be enabled.
320 if (!nigori_enabled) {
321 // Currently it is disabled. So enable it.
322 (*routing_info)[syncable::NIGORI] = GROUP_PASSIVE;
323 state->added_types.set(syncable::NIGORI);
324 }
325 } 313 }
326 314
327 state->ready_task = ready_task; 315 state->ready_task = ready_task;
328 state->initial_types = types; 316 state->types_to_add = types_to_add;
329 state->reason = reason; 317 state->reason = reason;
330 } 318 }
331 319
332 void SyncBackendHost::ConfigureDataTypes( 320 void SyncBackendHost::ConfigureDataTypes(
333 const DataTypeController::TypeMap& data_type_controllers, 321 const syncable::ModelTypeSet& types_to_add,
334 const syncable::ModelTypeSet& types, 322 const syncable::ModelTypeSet& types_to_remove,
335 sync_api::ConfigureReason reason, 323 sync_api::ConfigureReason reason,
336 base::Callback<void(bool)> ready_task, 324 base::Callback<void(bool)> ready_task,
337 bool enable_nigori) { 325 bool enable_nigori) {
326 syncable::ModelTypeSet types_to_add_with_nigori = types_to_add;
327 syncable::ModelTypeSet types_to_remove_with_nigori = types_to_remove;
328 if (enable_nigori) {
329 types_to_add_with_nigori.insert(syncable::NIGORI);
330 types_to_remove_with_nigori.erase(syncable::NIGORI);
331 } else {
332 types_to_add_with_nigori.erase(syncable::NIGORI);
333 types_to_remove_with_nigori.insert(syncable::NIGORI);
334 }
tim (not reviewing) 2011/08/10 23:39:08 ^^ Wow, what a mindffffffffffffffff
akalin 2011/08/10 23:41:49 What do you suggest? It's better than the special
338 // Only one configure is allowed at a time. 335 // Only one configure is allowed at a time.
339 DCHECK(!pending_config_mode_state_.get()); 336 DCHECK(!pending_config_mode_state_.get());
340 DCHECK(!pending_download_state_.get()); 337 DCHECK(!pending_download_state_.get());
341 DCHECK_GT(initialization_state_, NOT_INITIALIZED); 338 DCHECK_GT(initialization_state_, NOT_INITIALIZED);
342 339
343 syncable::ModelTypeSet types_copy = types;
344 if (enable_nigori) {
345 types_copy.insert(syncable::NIGORI);
346 }
347 bool nigori_currently_enabled = IsNigoriEnabled();
348 pending_config_mode_state_.reset(new PendingConfigureDataTypesState()); 340 pending_config_mode_state_.reset(new PendingConfigureDataTypesState());
349 bool deleted_type = false;
350 { 341 {
351 base::AutoLock lock(registrar_lock_); 342 base::AutoLock lock(registrar_lock_);
352 GetPendingConfigModeState(data_type_controllers, types_copy, 343 GetPendingConfigModeState(types_to_add_with_nigori,
353 ready_task, &registrar_.routing_info, reason, 344 types_to_remove_with_nigori,
354 nigori_currently_enabled, 345 ready_task,
355 pending_config_mode_state_.get(), 346 &registrar_.routing_info, reason,
356 &deleted_type); 347 pending_config_mode_state_.get());
357 } 348 }
358 349
359 if (deleted_type) { 350 if (!types_to_remove.empty()) {
360 sync_thread_.message_loop()->PostTask( 351 sync_thread_.message_loop()->PostTask(
361 FROM_HERE, 352 FROM_HERE,
362 NewRunnableMethod( 353 NewRunnableMethod(
363 core_.get(), 354 core_.get(),
364 &SyncBackendHost::Core::DoRequestCleanupDisabledTypes)); 355 &SyncBackendHost::Core::DoRequestCleanupDisabledTypes));
365 } 356 }
366 357
367 StartConfiguration(NewCallback(core_.get(), 358 StartConfiguration(NewCallback(core_.get(),
368 &SyncBackendHost::Core::FinishConfigureDataTypes)); 359 &SyncBackendHost::Core::FinishConfigureDataTypes));
369 } 360 }
(...skipping 15 matching lines...) Expand all
385 // 376 //
386 // In the case of additions, on the next sync cycle, the syncer should 377 // In the case of additions, on the next sync cycle, the syncer should
387 // notice that the routing info has changed and start the process of 378 // notice that the routing info has changed and start the process of
388 // downloading updates for newly added data types. Once this is 379 // downloading updates for newly added data types. Once this is
389 // complete, the configure_state_.ready_task_ is run via an 380 // complete, the configure_state_.ready_task_ is run via an
390 // OnInitializationComplete notification. 381 // OnInitializationComplete notification.
391 382
392 VLOG(1) << "Syncer in config mode. SBH executing" 383 VLOG(1) << "Syncer in config mode. SBH executing"
393 << "FinishConfigureDataTypesOnFrontendLoop"; 384 << "FinishConfigureDataTypesOnFrontendLoop";
394 385
395 if (pending_config_mode_state_->added_types.none() && 386 if (pending_config_mode_state_->added_types.empty() &&
396 !core_->sync_manager()->InitialSyncEndedForAllEnabledTypes()) { 387 !core_->sync_manager()->InitialSyncEndedForAllEnabledTypes()) {
397 LOG(WARNING) << "No new types, but initial sync not finished." 388 LOG(WARNING) << "No new types, but initial sync not finished."
398 << "Possible sync db corruption / removal."; 389 << "Possible sync db corruption / removal.";
399 // TODO(tim): Log / UMA / count this somehow? 390 // TODO(tim): Log / UMA / count this somehow?
400 // TODO(tim): If no added types, we could (should?) config only for 391 // TODO(tim): If no added types, we could (should?) config only for
401 // types that are needed... but this is a rare corruption edge case or 392 // types that are needed... but this is a rare corruption edge case or
402 // implies the user mucked around with their syncdb, so for now do all. 393 // implies the user mucked around with their syncdb, so for now do all.
403 pending_config_mode_state_->added_types = 394 pending_config_mode_state_->added_types =
404 syncable::ModelTypeBitSetFromSet( 395 pending_config_mode_state_->types_to_add;
405 pending_config_mode_state_->initial_types);
406 } 396 }
407 397
408 // If we've added types, we always want to request a nudge/config (even if 398 // If we've added types, we always want to request a nudge/config (even if
409 // the initial sync is ended), in case we could not decrypt the data. 399 // the initial sync is ended), in case we could not decrypt the data.
410 if (pending_config_mode_state_->added_types.none()) { 400 if (pending_config_mode_state_->added_types.empty()) {
411 VLOG(1) << "SyncBackendHost(" << this << "): No new types added. " 401 VLOG(1) << "SyncBackendHost(" << this << "): No new types added. "
412 << "Calling ready_task directly"; 402 << "Calling ready_task directly";
413 // No new types - just notify the caller that the types are available. 403 // No new types - just notify the caller that the types are available.
414 pending_config_mode_state_->ready_task.Run(true); 404 pending_config_mode_state_->ready_task.Run(true);
415 } else { 405 } else {
416 pending_download_state_.reset(pending_config_mode_state_.release()); 406 pending_download_state_.reset(pending_config_mode_state_.release());
417 407
418 syncable::ModelTypeBitSet types_copy(pending_download_state_->added_types); 408 // Always configure nigori if it's enabled.
419 if (IsNigoriEnabled()) 409 syncable::ModelTypeSet types_to_config =
420 types_copy.set(syncable::NIGORI); 410 pending_download_state_->added_types;
411 if (IsNigoriEnabled()) {
412 types_to_config.insert(syncable::NIGORI);
413 }
421 VLOG(1) << "SyncBackendHost(" << this << "):New Types added. " 414 VLOG(1) << "SyncBackendHost(" << this << "):New Types added. "
422 << "Calling DoRequestConfig"; 415 << "Calling DoRequestConfig";
423 sync_thread_.message_loop()->PostTask(FROM_HERE, 416 sync_thread_.message_loop()->PostTask(FROM_HERE,
424 NewRunnableMethod(core_.get(), 417 NewRunnableMethod(core_.get(),
425 &SyncBackendHost::Core::DoRequestConfig, 418 &SyncBackendHost::Core::DoRequestConfig,
426 types_copy, 419 syncable::ModelTypeBitSetFromSet(types_to_config),
427 pending_download_state_->reason)); 420 pending_download_state_->reason));
428 } 421 }
429 422
430 pending_config_mode_state_.reset(); 423 pending_config_mode_state_.reset();
431 424
432 // Notify the SyncManager about the new types. 425 // Notify the SyncManager about the new types.
433 sync_thread_.message_loop()->PostTask(FROM_HERE, 426 sync_thread_.message_loop()->PostTask(FROM_HERE,
434 NewRunnableMethod(core_.get(), 427 NewRunnableMethod(core_.get(),
435 &SyncBackendHost::Core::DoUpdateEnabledTypes)); 428 &SyncBackendHost::Core::DoUpdateEnabledTypes));
436 } 429 }
437 430
438 void SyncBackendHost::EncryptDataTypes( 431 void SyncBackendHost::EncryptDataTypes(
439 const syncable::ModelTypeSet& encrypted_types) { 432 const syncable::ModelTypeSet& encrypted_types) {
440 sync_thread_.message_loop()->PostTask(FROM_HERE, 433 sync_thread_.message_loop()->PostTask(FROM_HERE,
441 NewRunnableMethod(core_.get(), 434 NewRunnableMethod(core_.get(),
442 &SyncBackendHost::Core::DoEncryptDataTypes, 435 &SyncBackendHost::Core::DoEncryptDataTypes,
443 encrypted_types)); 436 encrypted_types));
444 } 437 }
445 438
446 syncable::ModelTypeSet SyncBackendHost::GetEncryptedDataTypes() const { 439 syncable::ModelTypeSet SyncBackendHost::GetEncryptedDataTypes() const {
447 DCHECK_GT(initialization_state_, NOT_INITIALIZED); 440 DCHECK_GT(initialization_state_, NOT_INITIALIZED);
448 return core_->sync_manager()->GetEncryptedDataTypes(); 441 return core_->sync_manager()->GetEncryptedDataTypes();
449 } 442 }
450 443
451 void SyncBackendHost::ActivateDataType( 444 void SyncBackendHost::ActivateDataType(
452 DataTypeController* data_type_controller, 445 syncable::ModelType type, ModelSafeGroup group,
453 ChangeProcessor* change_processor) { 446 ChangeProcessor* change_processor) {
454 base::AutoLock lock(registrar_lock_); 447 base::AutoLock lock(registrar_lock_);
455 448
456 // Ensure that the given data type is in the PASSIVE group. 449 // Ensure that the given data type is in the PASSIVE group.
457 browser_sync::ModelSafeRoutingInfo::iterator i = 450 browser_sync::ModelSafeRoutingInfo::iterator i =
458 registrar_.routing_info.find(data_type_controller->type()); 451 registrar_.routing_info.find(type);
459 DCHECK(i != registrar_.routing_info.end()); 452 DCHECK(i != registrar_.routing_info.end());
460 DCHECK((*i).second == GROUP_PASSIVE); 453 DCHECK((*i).second == GROUP_PASSIVE);
461 syncable::ModelType type = data_type_controller->type();
462 // Change the data type's routing info to its group. 454 // Change the data type's routing info to its group.
463 registrar_.routing_info[type] = data_type_controller->model_safe_group(); 455 registrar_.routing_info[type] = group;
464 456
465 // Add the data type's change processor to the list of change 457 // Add the data type's change processor to the list of change
466 // processors so it can receive updates. 458 // processors so it can receive updates.
467 DCHECK_EQ(processors_.count(type), 0U); 459 DCHECK_EQ(processors_.count(type), 0U);
468 processors_[type] = change_processor; 460 processors_[type] = change_processor;
469 461
470 // Start the change processor. 462 // Start the change processor.
471 change_processor->Start(profile_, GetUserShare()); 463 change_processor->Start(profile_, GetUserShare());
464 DCHECK(GetProcessorUnsafe(type));
472 } 465 }
473 466
474 void SyncBackendHost::DeactivateDataType( 467 void SyncBackendHost::DeactivateDataType(syncable::ModelType type) {
475 DataTypeController* data_type_controller,
476 ChangeProcessor* change_processor) {
477 base::AutoLock lock(registrar_lock_); 468 base::AutoLock lock(registrar_lock_);
478 registrar_.routing_info.erase(data_type_controller->type()); 469 registrar_.routing_info.erase(type);
479 470
471 std::map<syncable::ModelType, ChangeProcessor*>::iterator it =
472 processors_.find(type);
480 // Stop the change processor and remove it from the list of processors. 473 // Stop the change processor and remove it from the list of processors.
481 change_processor->Stop(); 474 if (it != processors_.end()) {
482 std::map<syncable::ModelType, ChangeProcessor*>::size_type erased = 475 it->second->Stop();
483 processors_.erase(data_type_controller->type()); 476 processors_.erase(it);
484 DCHECK_EQ(erased, 1U); 477 }
478 DCHECK(!GetProcessorUnsafe(type));
485 } 479 }
486 480
487 bool SyncBackendHost::RequestClearServerData() { 481 bool SyncBackendHost::RequestClearServerData() {
488 sync_thread_.message_loop()->PostTask(FROM_HERE, 482 sync_thread_.message_loop()->PostTask(FROM_HERE,
489 NewRunnableMethod(core_.get(), 483 NewRunnableMethod(core_.get(),
490 &SyncBackendHost::Core::DoRequestClearServerData)); 484 &SyncBackendHost::Core::DoRequestClearServerData));
491 return true; 485 return true;
492 } 486 }
493 487
494 SyncBackendHost::Core::~Core() { 488 SyncBackendHost::Core::~Core() {
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 processing_passphrase_ = true; 725 processing_passphrase_ = true;
732 } 726 }
733 727
734 void SyncBackendHost::Core::DoEncryptDataTypes( 728 void SyncBackendHost::Core::DoEncryptDataTypes(
735 const syncable::ModelTypeSet& encrypted_types) { 729 const syncable::ModelTypeSet& encrypted_types) {
736 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop()); 730 DCHECK(MessageLoop::current() == host_->sync_thread_.message_loop());
737 sync_manager_->EncryptDataTypes(encrypted_types); 731 sync_manager_->EncryptDataTypes(encrypted_types);
738 } 732 }
739 733
740 void SyncBackendHost::Core::DoRequestConfig( 734 void SyncBackendHost::Core::DoRequestConfig(
741 const syncable::ModelTypeBitSet& added_types, 735 const syncable::ModelTypeBitSet& types_to_config,
742 sync_api::ConfigureReason reason) { 736 sync_api::ConfigureReason reason) {
743 sync_manager_->RequestConfig(added_types, reason); 737 sync_manager_->RequestConfig(types_to_config, reason);
744 } 738 }
745 739
746 void SyncBackendHost::Core::DoStartConfiguration(Callback0::Type* callback) { 740 void SyncBackendHost::Core::DoStartConfiguration(Callback0::Type* callback) {
747 sync_manager_->StartConfigurationMode(callback); 741 sync_manager_->StartConfigurationMode(callback);
748 } 742 }
749 743
750 UIModelWorker* SyncBackendHost::ui_worker() { 744 UIModelWorker* SyncBackendHost::ui_worker() {
751 ModelSafeWorker* w = registrar_.workers[GROUP_UI]; 745 ModelSafeWorker* w = registrar_.workers[GROUP_UI];
752 if (w == NULL) 746 if (w == NULL)
753 return NULL; 747 return NULL;
(...skipping 10 matching lines...) Expand all
764 sync_manager_->RemoveObserver(this); 758 sync_manager_->RemoveObserver(this);
765 sync_manager_.reset(); 759 sync_manager_.reset();
766 host_->ui_worker()->OnSyncerShutdownComplete(); 760 host_->ui_worker()->OnSyncerShutdownComplete();
767 761
768 if (sync_disabled) 762 if (sync_disabled)
769 DeleteSyncDataFolder(); 763 DeleteSyncDataFolder();
770 764
771 host_ = NULL; 765 host_ = NULL;
772 } 766 }
773 767
774 ChangeProcessor* SyncBackendHost::Core::GetProcessor( 768 ChangeProcessor* SyncBackendHost::GetProcessor(
775 syncable::ModelType model_type) { 769 syncable::ModelType model_type) {
770 base::AutoLock lock(registrar_lock_);
771 return GetProcessorUnsafe(model_type);
772 }
773
774 ChangeProcessor* SyncBackendHost::GetProcessorUnsafe(
775 syncable::ModelType model_type) {
776 registrar_lock_.AssertAcquired();
776 std::map<syncable::ModelType, ChangeProcessor*>::const_iterator it = 777 std::map<syncable::ModelType, ChangeProcessor*>::const_iterator it =
777 host_->processors_.find(model_type); 778 processors_.find(model_type);
778 779
779 // Until model association happens for a datatype, it will not appear in 780 // Until model association happens for a datatype, it will not appear in
780 // the processors list. During this time, it is OK to drop changes on 781 // the processors list. During this time, it is OK to drop changes on
781 // the floor (since model association has not happened yet). When the 782 // the floor (since model association has not happened yet). When the
782 // data type is activated, model association takes place then the change 783 // data type is activated, model association takes place then the change
783 // processor is added to the processors_ list. This all happens on 784 // processor is added to the processors_ list. This all happens on
784 // the UI thread so we will never drop any changes after model 785 // the UI thread so we will never drop any changes after model
785 // association. 786 // association.
786 if (it == host_->processors_.end()) 787 if (it == processors_.end())
787 return NULL; 788 return NULL;
788 789
789 if (!IsCurrentThreadSafeForModel(model_type)) { 790 if (!IsCurrentThreadSafeForModel(model_type)) {
790 NOTREACHED() << "Changes applied on wrong thread. Model: " 791 NOTREACHED() << "Changes applied on wrong thread. Model: "
791 << syncable::ModelTypeToString(model_type); 792 << syncable::ModelTypeToString(model_type);
792 return NULL; 793 return NULL;
793 } 794 }
794 795
795 // Now that we're sure we're on the correct thread, we can access the 796 // Now that we're sure we're on the correct thread, we can access the
796 // ChangeProcessor. 797 // ChangeProcessor.
797 ChangeProcessor* processor = it->second; 798 ChangeProcessor* processor = it->second;
798 799
799 // Ensure the change processor is willing to accept changes. 800 // Ensure the change processor is willing to accept changes.
800 if (!processor->IsRunning()) 801 if (!processor->IsRunning())
801 return NULL; 802 return NULL;
802 803
803 return processor; 804 return processor;
804 } 805 }
805 806
806 void SyncBackendHost::Core::OnChangesApplied( 807 void SyncBackendHost::Core::OnChangesApplied(
807 syncable::ModelType model_type, 808 syncable::ModelType model_type,
808 const sync_api::BaseTransaction* trans, 809 const sync_api::BaseTransaction* trans,
809 const sync_api::SyncManager::ChangeRecord* changes, 810 const sync_api::SyncManager::ChangeRecord* changes,
810 int change_count) { 811 int change_count) {
811 if (!host_ || !host_->frontend_) { 812 if (!host_ || !host_->frontend_) {
812 DCHECK(false) << "OnChangesApplied called after Shutdown?"; 813 DCHECK(false) << "OnChangesApplied called after Shutdown?";
813 return; 814 return;
814 } 815 }
815 ChangeProcessor* processor = GetProcessor(model_type); 816 ChangeProcessor* processor = host_->GetProcessor(model_type);
816 if (!processor) 817 if (!processor)
817 return; 818 return;
818 819
819 processor->ApplyChangesFromSyncModel(trans, changes, change_count); 820 processor->ApplyChangesFromSyncModel(trans, changes, change_count);
820 } 821 }
821 822
822 void SyncBackendHost::Core::OnChangesComplete( 823 void SyncBackendHost::Core::OnChangesComplete(
823 syncable::ModelType model_type) { 824 syncable::ModelType model_type) {
824 if (!host_ || !host_->frontend_) { 825 if (!host_ || !host_->frontend_) {
825 DCHECK(false) << "OnChangesComplete called after Shutdown?"; 826 DCHECK(false) << "OnChangesComplete called after Shutdown?";
826 return; 827 return;
827 } 828 }
828 829
829 ChangeProcessor* processor = GetProcessor(model_type); 830 ChangeProcessor* processor = host_->GetProcessor(model_type);
830 if (!processor) 831 if (!processor)
831 return; 832 return;
832 833
833 // This call just notifies the processor that it can commit, it already 834 // This call just notifies the processor that it can commit, it already
834 // buffered any changes it plans to makes so needs no further information. 835 // buffered any changes it plans to makes so needs no further information.
835 processor->CommitChangesFromSyncModel(); 836 processor->CommitChangesFromSyncModel();
836 } 837 }
837 838
838 void SyncBackendHost::Core::OnSyncCycleCompleted( 839 void SyncBackendHost::Core::OnSyncCycleCompleted(
839 const SyncSessionSnapshot* snapshot) { 840 const SyncSessionSnapshot* snapshot) {
(...skipping 14 matching lines...) Expand all
854 snapshot->syncer_status.types_needing_local_migration; 855 snapshot->syncer_status.types_needing_local_migration;
855 if (!to_migrate.empty()) 856 if (!to_migrate.empty())
856 host_->frontend_->OnMigrationNeededForTypes(to_migrate); 857 host_->frontend_->OnMigrationNeededForTypes(to_migrate);
857 858
858 // If we are waiting for a configuration change, check here to see 859 // If we are waiting for a configuration change, check here to see
859 // if this sync cycle has initialized all of the types we've been 860 // if this sync cycle has initialized all of the types we've been
860 // waiting for. 861 // waiting for.
861 if (host_->pending_download_state_.get()) { 862 if (host_->pending_download_state_.get()) {
862 scoped_ptr<PendingConfigureDataTypesState> state( 863 scoped_ptr<PendingConfigureDataTypesState> state(
863 host_->pending_download_state_.release()); 864 host_->pending_download_state_.release());
864 bool found_all_added = true; 865 DCHECK(
865 syncable::ModelTypeSet::const_iterator it; 866 std::includes(state->types_to_add.begin(), state->types_to_add.end(),
866 for (it = state->initial_types.begin(); it != state->initial_types.end(); 867 state->added_types.begin(), state->added_types.end()));
867 ++it) { 868 syncable::ModelTypeBitSet added_types =
868 if (state->added_types.test(*it)) 869 syncable::ModelTypeBitSetFromSet(state->added_types);
869 found_all_added &= snapshot->initial_sync_ended.test(*it); 870 bool found_all_added =
870 } 871 (added_types & snapshot->initial_sync_ended) == added_types;
871 state->ready_task.Run(found_all_added); 872 state->ready_task.Run(found_all_added);
872 if (!found_all_added) 873 if (!found_all_added)
873 return; 874 return;
874 } 875 }
875 876
876 if (host_->initialized()) 877 if (host_->initialized())
877 host_->frontend_->OnSyncCycleCompleted(); 878 host_->frontend_->OnSyncCycleCompleted();
878 } 879 }
879 880
880 void SyncBackendHost::Core::OnInitializationComplete( 881 void SyncBackendHost::Core::OnInitializationComplete(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 // unconditionally as soon as the UI supports having this info early on. 922 // unconditionally as soon as the UI supports having this info early on.
922 if (setup_completed) 923 if (setup_completed)
923 core_->sync_manager()->RefreshEncryption(); 924 core_->sync_manager()->RefreshEncryption();
924 initialization_state_ = INITIALIZED; 925 initialization_state_ = INITIALIZED;
925 frontend_->OnBackendInitialized(js_backend, true); 926 frontend_->OnBackendInitialized(js_backend, true);
926 return; 927 return;
927 } 928 }
928 929
929 initialization_state_ = DOWNLOADING_NIGORI; 930 initialization_state_ = DOWNLOADING_NIGORI;
930 ConfigureDataTypes( 931 ConfigureDataTypes(
931 DataTypeController::TypeMap(), 932 syncable::ModelTypeSet(),
932 syncable::ModelTypeSet(), 933 syncable::ModelTypeSet(),
933 sync_api::CONFIGURE_REASON_NEW_CLIENT, 934 sync_api::CONFIGURE_REASON_NEW_CLIENT,
934 base::Bind( 935 base::Bind(
935 &SyncBackendHost::Core::HandleInitializationCompletedOnFrontendLoop, 936 &SyncBackendHost::Core::HandleInitializationCompletedOnFrontendLoop,
936 core_.get(), js_backend), 937 core_.get(), js_backend),
937 true); 938 true);
938 } 939 }
939 940
940 bool SyncBackendHost::Core::IsCurrentThreadSafeForModel( 941 bool SyncBackendHost::IsCurrentThreadSafeForModel(
941 syncable::ModelType model_type) { 942 syncable::ModelType model_type) const {
942 base::AutoLock lock(host_->registrar_lock_); 943 registrar_lock_.AssertAcquired();
943 944
944 browser_sync::ModelSafeRoutingInfo::const_iterator routing_it = 945 browser_sync::ModelSafeRoutingInfo::const_iterator routing_it =
945 host_->registrar_.routing_info.find(model_type); 946 registrar_.routing_info.find(model_type);
946 if (routing_it == host_->registrar_.routing_info.end()) 947 if (routing_it == registrar_.routing_info.end())
947 return false; 948 return false;
948 browser_sync::ModelSafeGroup group = routing_it->second; 949 browser_sync::ModelSafeGroup group = routing_it->second;
949 WorkerMap::const_iterator worker_it = host_->registrar_.workers.find(group); 950 WorkerMap::const_iterator worker_it = registrar_.workers.find(group);
950 if (worker_it == host_->registrar_.workers.end()) 951 if (worker_it == registrar_.workers.end())
951 return false; 952 return false;
952 ModelSafeWorker* worker = worker_it->second; 953 ModelSafeWorker* worker = worker_it->second;
953 return worker->CurrentThreadIsWorkThread(); 954 return worker->CurrentThreadIsWorkThread();
954 } 955 }
955 956
956 void SyncBackendHost::Core::OnAuthError(const AuthError& auth_error) { 957 void SyncBackendHost::Core::OnAuthError(const AuthError& auth_error) {
957 // Post to our core loop so we can modify state. Could be on another thread. 958 // Post to our core loop so we can modify state. Could be on another thread.
958 host_->frontend_loop_->PostTask(FROM_HERE, 959 host_->frontend_loop_->PostTask(FROM_HERE,
959 NewRunnableMethod(this, &Core::HandleAuthErrorEventOnFrontendLoop, 960 NewRunnableMethod(this, &Core::HandleAuthErrorEventOnFrontendLoop,
960 auth_error)); 961 auth_error));
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 } 1050 }
1050 1051
1051 void SyncBackendHost::Core::DeleteSyncDataFolder() { 1052 void SyncBackendHost::Core::DeleteSyncDataFolder() {
1052 if (file_util::DirectoryExists(host_->sync_data_folder_path())) { 1053 if (file_util::DirectoryExists(host_->sync_data_folder_path())) {
1053 if (!file_util::Delete(host_->sync_data_folder_path(), true)) 1054 if (!file_util::Delete(host_->sync_data_folder_path(), true))
1054 LOG(DFATAL) << "Could not delete the Sync Data folder."; 1055 LOG(DFATAL) << "Could not delete the Sync Data folder.";
1055 } 1056 }
1056 } 1057 }
1057 1058
1058 } // namespace browser_sync 1059 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698