Chromium Code Reviews| 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> |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 84 const FilePath& sync_data_folder_path, | 84 const FilePath& sync_data_folder_path, |
| 85 const base::WeakPtr<SyncBackendHost>& backend); | 85 const base::WeakPtr<SyncBackendHost>& backend); |
| 86 | 86 |
| 87 // SyncManager::Observer implementation. The Core just acts like an air | 87 // SyncManager::Observer implementation. The Core just acts like an air |
| 88 // traffic controller here, forwarding incoming messages to appropriate | 88 // traffic controller here, forwarding incoming messages to appropriate |
| 89 // landing threads. | 89 // landing threads. |
| 90 virtual void OnSyncCycleCompleted( | 90 virtual void OnSyncCycleCompleted( |
| 91 const syncer::sessions::SyncSessionSnapshot& snapshot) OVERRIDE; | 91 const syncer::sessions::SyncSessionSnapshot& snapshot) OVERRIDE; |
| 92 virtual void OnInitializationComplete( | 92 virtual void OnInitializationComplete( |
| 93 const syncer::WeakHandle<syncer::JsBackend>& js_backend, | 93 const syncer::WeakHandle<syncer::JsBackend>& js_backend, |
| 94 bool success) OVERRIDE; | 94 bool success, |
| 95 syncer::ModelTypeSet restored_types) OVERRIDE; | |
| 95 virtual void OnConnectionStatusChange( | 96 virtual void OnConnectionStatusChange( |
| 96 syncer::ConnectionStatus status) OVERRIDE; | 97 syncer::ConnectionStatus status) OVERRIDE; |
| 97 virtual void OnPassphraseRequired( | 98 virtual void OnPassphraseRequired( |
| 98 syncer::PassphraseRequiredReason reason, | 99 syncer::PassphraseRequiredReason reason, |
| 99 const sync_pb::EncryptedData& pending_keys) OVERRIDE; | 100 const sync_pb::EncryptedData& pending_keys) OVERRIDE; |
| 100 virtual void OnPassphraseAccepted() OVERRIDE; | 101 virtual void OnPassphraseAccepted() OVERRIDE; |
| 101 virtual void OnBootstrapTokenUpdated( | 102 virtual void OnBootstrapTokenUpdated( |
| 102 const std::string& bootstrap_token) OVERRIDE; | 103 const std::string& bootstrap_token) OVERRIDE; |
| 103 virtual void OnStopSyncingPermanently() OVERRIDE; | 104 virtual void OnStopSyncingPermanently() OVERRIDE; |
| 104 virtual void OnUpdatedToken(const std::string& token) OVERRIDE; | 105 virtual void OnUpdatedToken(const std::string& token) OVERRIDE; |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 360 return scoped_ptr<syncer::HttpPostProviderFactory>( | 361 return scoped_ptr<syncer::HttpPostProviderFactory>( |
| 361 new syncer::HttpBridgeFactory(getter, MakeUserAgentForSyncApi())); | 362 new syncer::HttpBridgeFactory(getter, MakeUserAgentForSyncApi())); |
| 362 } | 363 } |
| 363 | 364 |
| 364 } // namespace | 365 } // namespace |
| 365 | 366 |
| 366 void SyncBackendHost::Initialize( | 367 void SyncBackendHost::Initialize( |
| 367 SyncFrontend* frontend, | 368 SyncFrontend* frontend, |
| 368 const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, | 369 const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, |
| 369 const GURL& sync_service_url, | 370 const GURL& sync_service_url, |
| 370 syncer::ModelTypeSet initial_types, | |
| 371 const SyncCredentials& credentials, | 371 const SyncCredentials& credentials, |
| 372 bool delete_sync_data_folder, | 372 bool delete_sync_data_folder, |
| 373 syncer::SyncManagerFactory* sync_manager_factory, | 373 syncer::SyncManagerFactory* sync_manager_factory, |
| 374 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler, | 374 syncer::UnrecoverableErrorHandler* unrecoverable_error_handler, |
| 375 syncer::ReportUnrecoverableErrorFunction | 375 syncer::ReportUnrecoverableErrorFunction |
| 376 report_unrecoverable_error_function) { | 376 report_unrecoverable_error_function) { |
| 377 if (!sync_thread_.Start()) | 377 if (!sync_thread_.Start()) |
| 378 return; | 378 return; |
| 379 | 379 |
| 380 chrome_sync_notification_bridge_.reset( | 380 chrome_sync_notification_bridge_.reset( |
| 381 new ChromeSyncNotificationBridge( | 381 new ChromeSyncNotificationBridge( |
| 382 profile_, sync_thread_.message_loop_proxy())); | 382 profile_, sync_thread_.message_loop_proxy())); |
| 383 | 383 |
| 384 frontend_ = frontend; | 384 frontend_ = frontend; |
| 385 DCHECK(frontend); | 385 DCHECK(frontend); |
| 386 | 386 |
| 387 syncer::ModelTypeSet initial_types_with_nigori(initial_types); | 387 registrar_.reset(new SyncBackendRegistrar(name_, |
| 388 CHECK(sync_prefs_.get()); | |
| 389 if (sync_prefs_->HasSyncSetupCompleted()) { | |
| 390 initial_types_with_nigori.Put(syncer::NIGORI); | |
| 391 } | |
| 392 | |
| 393 registrar_.reset(new SyncBackendRegistrar(initial_types_with_nigori, | |
| 394 name_, | |
| 395 profile_, | 388 profile_, |
| 396 sync_thread_.message_loop())); | 389 sync_thread_.message_loop())); |
| 397 syncer::ModelSafeRoutingInfo routing_info; | 390 syncer::ModelSafeRoutingInfo routing_info; |
| 398 std::vector<syncer::ModelSafeWorker*> workers; | 391 std::vector<syncer::ModelSafeWorker*> workers; |
| 399 registrar_->GetModelSafeRoutingInfo(&routing_info); | 392 registrar_->GetModelSafeRoutingInfo(&routing_info); |
| 400 registrar_->GetWorkers(&workers); | 393 registrar_->GetWorkers(&workers); |
| 401 | 394 |
| 402 initialization_state_ = CREATING_SYNC_MANAGER; | 395 initialization_state_ = CREATING_SYNC_MANAGER; |
| 403 InitCore(DoInitializeOptions( | 396 InitCore(DoInitializeOptions( |
| 404 sync_thread_.message_loop(), | 397 sync_thread_.message_loop(), |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 592 core_ = NULL; // Releases reference to core_. | 585 core_ = NULL; // Releases reference to core_. |
| 593 } | 586 } |
| 594 | 587 |
| 595 void SyncBackendHost::ConfigureDataTypes( | 588 void SyncBackendHost::ConfigureDataTypes( |
| 596 syncer::ConfigureReason reason, | 589 syncer::ConfigureReason reason, |
| 597 syncer::ModelTypeSet types_to_add, | 590 syncer::ModelTypeSet types_to_add, |
| 598 syncer::ModelTypeSet types_to_remove, | 591 syncer::ModelTypeSet types_to_remove, |
| 599 NigoriState nigori_state, | 592 NigoriState nigori_state, |
| 600 const base::Callback<void(syncer::ModelTypeSet)>& ready_task, | 593 const base::Callback<void(syncer::ModelTypeSet)>& ready_task, |
| 601 const base::Callback<void()>& retry_callback) { | 594 const base::Callback<void()>& retry_callback) { |
| 595 // Only one configure is allowed at a time. This is guaranteed by our | |
| 596 // callers. The SyncBackendHost requests one configure as the backend is | |
| 597 // initializing and waits for it to complete. After initialization, all | |
| 598 // configurations will pass through the DataTypeManager, which is careful to | |
| 599 // never send a new configure request until the current request succeeds. | |
| 600 | |
| 601 DCHECK_GT(initialization_state_, NOT_INITIALIZED); | |
| 602 | |
| 602 syncer::ModelTypeSet types_to_add_with_nigori = types_to_add; | 603 syncer::ModelTypeSet types_to_add_with_nigori = types_to_add; |
| 603 syncer::ModelTypeSet types_to_remove_with_nigori = types_to_remove; | 604 syncer::ModelTypeSet types_to_remove_with_nigori = types_to_remove; |
| 604 if (nigori_state == WITH_NIGORI) { | 605 if (nigori_state == WITH_NIGORI) { |
| 605 types_to_add_with_nigori.Put(syncer::NIGORI); | 606 types_to_add_with_nigori.Put(syncer::NIGORI); |
| 606 types_to_remove_with_nigori.Remove(syncer::NIGORI); | 607 types_to_remove_with_nigori.Remove(syncer::NIGORI); |
| 607 } else { | 608 } else { |
| 608 types_to_add_with_nigori.Remove(syncer::NIGORI); | 609 types_to_add_with_nigori.Remove(syncer::NIGORI); |
| 609 types_to_remove_with_nigori.Put(syncer::NIGORI); | 610 types_to_remove_with_nigori.Put(syncer::NIGORI); |
| 610 } | 611 } |
| 611 // Only one configure is allowed at a time (DataTypeManager handles user | |
| 612 // changes that happen while the syncer is reconfiguring, and will only | |
| 613 // trigger another call to ConfigureDataTypes once the current reconfiguration | |
| 614 // completes). | |
| 615 DCHECK_GT(initialization_state_, NOT_INITIALIZED); | |
| 616 | 612 |
| 617 // The new set of enabled types is types_to_add_with_nigori + the | 613 // The SyncBackendRegistrar's routing info will be updated by removing the |
| 618 // previously enabled types (on restart, the preferred types are already | 614 // types_to_remove_with_nigori from the list then adding |
|
Nicolas Zea
2012/07/23 20:47:15
add then remove.
rlarocque
2012/07/23 23:16:10
You mentioned this in your first set of comments,
| |
| 619 // enabled) - types_to_remove_with_nigori. After reconfiguring the registrar, | 615 // types_to_add_with_nigori. Any types which are not in either of those sets |
| 620 // the new routing info will reflect the set of enabled types. | 616 // will remain untouched. |
| 617 // | |
| 618 // Types which were not in the list previously are not cached locally, so we | |
|
Nicolas Zea
2012/07/23 20:47:15
Cached seems kind of ambiguous. Perhaps just say a
rlarocque
2012/07/23 23:16:10
Done.
| |
| 619 // must ask the syncer to download them. Any newly supported datatypes will | |
| 620 // not have been in that routing info list, so they will be among the types | |
| 621 // downloaded if they are enabled. | |
| 622 // | |
| 623 // The SyncBackendRegistrar's state was initially derrived from the types | |
|
Nicolas Zea
2012/07/23 20:47:15
derrived ->derived
rlarocque
2012/07/23 23:16:10
Done.
| |
| 624 // marked initial_sync_ended when the sync database was loaded. Afterwards it | |
| 625 // is modified only by this function. We expect it to remain in sync with the | |
| 626 // backend because configuration requests are never aborted; they are retried | |
| 627 // until they succeed or the browser is closed. | |
| 628 | |
| 629 syncer::ModelTypeSet types_to_download = registrar_->ConfigureDataTypes( | |
| 630 types_to_add_with_nigori, types_to_remove_with_nigori); | |
| 631 if (!types_to_download.Empty()) | |
| 632 types_to_download.Put(syncer::NIGORI); | |
| 633 | |
| 634 // TODO(sync): crbug.com/137550. | |
| 635 // It's dangerous to configure types that have progress markers. Types with | |
| 636 // progress markers can trigger a MIGRATION_DONE response. We are not | |
| 637 // prepared to handle a migration during a configure, so we must ensure that | |
| 638 // all our types_to_download actually contain no data before we sync them. | |
| 639 // | |
| 640 // The most common way to end up in this situation used to be types which had | |
| 641 // !initial_sync_ended, but did have some progress markers. We avoid problems | |
| 642 // with those types by purging the data of any such partially synced types | |
| 643 // soon after we load the directory. | |
| 644 // | |
| 645 // Another possible scenario is that we have newly supported or newly enabled | |
| 646 // data types being downloaded here but the nigori type, which is always | |
| 647 // included in any GetUpdates request, requires migration. The server has | |
| 648 // code to detect this scenario based on the configure reason, the fact that | |
| 649 // the nigori type is the only requested type which requires migration, and | |
| 650 // that the requested types list includes at least one non-nigori type. It | |
| 651 // will not send a MIGRATION_DONE response in that case. We still need to be | |
| 652 // careful to not send progress markers for non-nigori types, though. If a | |
| 653 // non-nigori type in the request requires migration, a MIGRATION_DONE | |
| 654 // response will be sent. | |
| 655 | |
| 621 syncer::ModelSafeRoutingInfo routing_info; | 656 syncer::ModelSafeRoutingInfo routing_info; |
| 622 registrar_->ConfigureDataTypes(types_to_add_with_nigori, | |
| 623 types_to_remove_with_nigori); | |
| 624 registrar_->GetModelSafeRoutingInfo(&routing_info); | 657 registrar_->GetModelSafeRoutingInfo(&routing_info); |
| 625 const syncer::ModelTypeSet enabled_types = | |
| 626 GetRoutingInfoTypes(routing_info); | |
| 627 | |
| 628 // Figure out which types need to actually be downloaded. We pass those on | |
| 629 // to the syncer while it's in configuration mode so that they can be | |
| 630 // downloaded before we perform association. Once we switch to normal mode | |
| 631 // downloads will get applied normally and hit the datatype's change | |
| 632 // processor. | |
| 633 // A datatype is in need of downloading if any of the following are true: | |
| 634 // 1. it's enabled and initial_sync_ended is false (initial_sync_ended is | |
| 635 // set after applying updates, and hence is a more conservative measure | |
| 636 // than having a non-empty progress marker, which is set during | |
| 637 // StoreTimestamps). | |
| 638 // 2. the type is NIGORI, and any other datatype is being downloaded (nigori | |
| 639 // is always included if we download a datatype). | |
| 640 // TODO(sync): consider moving this logic onto the sync thread (perhaps | |
| 641 // as part of SyncManager::ConfigureSyncer). | |
| 642 syncer::ModelTypeSet initial_sync_ended_types = | |
| 643 core_->sync_manager()->InitialSyncEndedTypes(); | |
| 644 initial_sync_ended_types.RetainAll(enabled_types); | |
| 645 syncer::ModelTypeSet types_to_config = | |
| 646 Difference(enabled_types, initial_sync_ended_types); | |
| 647 if (!types_to_config.Empty() && enabled_types.Has(syncer::NIGORI)) | |
| 648 types_to_config.Put(syncer::NIGORI); | |
| 649 | 658 |
| 650 SDVLOG(1) << "Types " | 659 SDVLOG(1) << "Types " |
| 651 << syncer::ModelTypeSetToString(types_to_config) | 660 << syncer::ModelTypeSetToString(types_to_download) |
| 652 << " added; calling DoConfigureSyncer"; | 661 << " added; calling DoConfigureSyncer"; |
| 653 // TODO(zea): figure out how to bypass this call if no types are being | 662 // TODO(zea): figure out how to bypass this call if no types are being |
| 654 // configured and GetKey is not needed. For now we rely on determining the | 663 // configured and GetKey is not needed. For now we rely on determining the |
| 655 // need for GetKey as part of the SyncManager::ConfigureSyncer logic. | 664 // need for GetKey as part of the SyncManager::ConfigureSyncer logic. |
| 656 RequestConfigureSyncer(reason, | 665 RequestConfigureSyncer(reason, |
| 657 types_to_config, | 666 types_to_download, |
| 658 routing_info, | 667 routing_info, |
| 659 ready_task, | 668 ready_task, |
| 660 retry_callback); | 669 retry_callback); |
| 661 } | 670 } |
| 662 | 671 |
| 663 void SyncBackendHost::EnableEncryptEverything() { | 672 void SyncBackendHost::EnableEncryptEverything() { |
| 664 sync_thread_.message_loop()->PostTask(FROM_HERE, | 673 sync_thread_.message_loop()->PostTask(FROM_HERE, |
| 665 base::Bind(&SyncBackendHost::Core::DoEnableEncryptEverything, | 674 base::Bind(&SyncBackendHost::Core::DoEnableEncryptEverything, |
| 666 core_.get())); | 675 core_.get())); |
| 667 } | 676 } |
| 668 | 677 |
| 669 void SyncBackendHost::ActivateDataType( | 678 void SyncBackendHost::ActivateDataType( |
| 670 syncer::ModelType type, syncer::ModelSafeGroup group, | 679 syncer::ModelType type, syncer::ModelSafeGroup group, |
| 671 ChangeProcessor* change_processor) { | 680 ChangeProcessor* change_processor) { |
| 672 registrar_->ActivateDataType(type, group, change_processor, GetUserShare()); | 681 registrar_->ActivateDataType(type, group, change_processor, GetUserShare()); |
| 673 } | 682 } |
| 674 | 683 |
| 675 void SyncBackendHost::DeactivateDataType(syncer::ModelType type) { | 684 void SyncBackendHost::DeactivateDataType(syncer::ModelType type) { |
| 676 registrar_->DeactivateDataType(type); | 685 registrar_->DeactivateDataType(type); |
| 677 } | 686 } |
| 678 | 687 |
| 679 syncer::UserShare* SyncBackendHost::GetUserShare() const { | 688 syncer::UserShare* SyncBackendHost::GetUserShare() const { |
| 680 DCHECK(initialized()); | 689 DCHECK(initialized()); |
| 681 return core_->sync_manager()->GetUserShare(); | 690 return core_->sync_manager()->GetUserShare(); |
| 682 } | 691 } |
| 683 | 692 |
| 693 // Bypasses the initialized() check. | |
| 694 syncer::UserShare* SyncBackendHost::GetUserShareForTest() const { | |
| 695 return core_->sync_manager()->GetUserShare(); | |
| 696 } | |
| 697 | |
| 684 SyncBackendHost::Status SyncBackendHost::GetDetailedStatus() { | 698 SyncBackendHost::Status SyncBackendHost::GetDetailedStatus() { |
| 685 DCHECK(initialized()); | 699 DCHECK(initialized()); |
| 686 return core_->sync_manager()->GetDetailedStatus(); | 700 return core_->sync_manager()->GetDetailedStatus(); |
| 687 } | 701 } |
| 688 | 702 |
| 689 SyncSessionSnapshot SyncBackendHost::GetLastSessionSnapshot() const { | 703 SyncSessionSnapshot SyncBackendHost::GetLastSessionSnapshot() const { |
| 690 return last_snapshot_; | 704 return last_snapshot_; |
| 691 } | 705 } |
| 692 | 706 |
| 693 bool SyncBackendHost::HasUnsyncedItems() const { | 707 bool SyncBackendHost::HasUnsyncedItems() const { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 764 | 778 |
| 765 // Notify SyncManager (especially the notification listener) about new types. | 779 // Notify SyncManager (especially the notification listener) about new types. |
| 766 sync_thread_.message_loop()->PostTask(FROM_HERE, | 780 sync_thread_.message_loop()->PostTask(FROM_HERE, |
| 767 base::Bind(&SyncBackendHost::Core::DoUpdateEnabledTypes, core_.get(), | 781 base::Bind(&SyncBackendHost::Core::DoUpdateEnabledTypes, core_.get(), |
| 768 configured_types)); | 782 configured_types)); |
| 769 | 783 |
| 770 if (!ready_task.is_null()) | 784 if (!ready_task.is_null()) |
| 771 ready_task.Run(failed_configuration_types); | 785 ready_task.Run(failed_configuration_types); |
| 772 } | 786 } |
| 773 | 787 |
| 788 void SyncBackendHost::HandleSyncManagerInitializationOnFrontendLoop( | |
| 789 const syncer::WeakHandle<syncer::JsBackend>& js_backend, bool success, | |
| 790 syncer::ModelTypeSet restored_types) { | |
| 791 registrar_->SetInitialTypes(restored_types); | |
| 792 HandleInitializationCompletedOnFrontendLoop(js_backend, success); | |
| 793 } | |
| 794 | |
| 774 SyncBackendHost::DoInitializeOptions::DoInitializeOptions( | 795 SyncBackendHost::DoInitializeOptions::DoInitializeOptions( |
| 775 MessageLoop* sync_loop, | 796 MessageLoop* sync_loop, |
| 776 SyncBackendRegistrar* registrar, | 797 SyncBackendRegistrar* registrar, |
| 777 const syncer::ModelSafeRoutingInfo& routing_info, | 798 const syncer::ModelSafeRoutingInfo& routing_info, |
| 778 const std::vector<syncer::ModelSafeWorker*>& workers, | 799 const std::vector<syncer::ModelSafeWorker*>& workers, |
| 779 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, | 800 syncer::ExtensionsActivityMonitor* extensions_activity_monitor, |
| 780 const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, | 801 const syncer::WeakHandle<syncer::JsEventHandler>& event_handler, |
| 781 const GURL& service_url, | 802 const GURL& service_url, |
| 782 MakeHttpBridgeFactoryFn make_http_bridge_factory_fn, | 803 MakeHttpBridgeFactoryFn make_http_bridge_factory_fn, |
| 783 const syncer::SyncCredentials& credentials, | 804 const syncer::SyncCredentials& credentials, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 835 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 856 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| 836 host_.Call( | 857 host_.Call( |
| 837 FROM_HERE, | 858 FROM_HERE, |
| 838 &SyncBackendHost::HandleSyncCycleCompletedOnFrontendLoop, | 859 &SyncBackendHost::HandleSyncCycleCompletedOnFrontendLoop, |
| 839 snapshot); | 860 snapshot); |
| 840 } | 861 } |
| 841 | 862 |
| 842 | 863 |
| 843 void SyncBackendHost::Core::OnInitializationComplete( | 864 void SyncBackendHost::Core::OnInitializationComplete( |
| 844 const syncer::WeakHandle<syncer::JsBackend>& js_backend, | 865 const syncer::WeakHandle<syncer::JsBackend>& js_backend, |
| 845 bool success) { | 866 bool success, |
| 867 const syncer::ModelTypeSet restored_types) { | |
| 846 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 868 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| 847 host_.Call( | 869 host_.Call( |
| 848 FROM_HERE, | 870 FROM_HERE, |
| 849 &SyncBackendHost::HandleInitializationCompletedOnFrontendLoop, | 871 &SyncBackendHost::HandleSyncManagerInitializationOnFrontendLoop, |
| 850 js_backend, success); | 872 js_backend, success, restored_types); |
| 851 | 873 |
| 852 if (success) { | 874 if (success) { |
| 853 // Initialization is complete, so we can schedule recurring SaveChanges. | 875 // Initialization is complete, so we can schedule recurring SaveChanges. |
| 854 sync_loop_->PostTask(FROM_HERE, | 876 sync_loop_->PostTask(FROM_HERE, |
| 855 base::Bind(&Core::StartSavingChanges, this)); | 877 base::Bind(&Core::StartSavingChanges, this)); |
| 856 } | 878 } |
| 857 } | 879 } |
| 858 | 880 |
| 859 void SyncBackendHost::Core::OnConnectionStatusChange( | 881 void SyncBackendHost::Core::OnConnectionStatusChange( |
| 860 syncer::ConnectionStatus status) { | 882 syncer::ConnectionStatus status) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 971 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); | 993 sync_manager_ = options.sync_manager_factory->CreateSyncManager(name_); |
| 972 sync_manager_->AddObserver(this); | 994 sync_manager_->AddObserver(this); |
| 973 success = sync_manager_->Init( | 995 success = sync_manager_->Init( |
| 974 sync_data_folder_path_, | 996 sync_data_folder_path_, |
| 975 options.event_handler, | 997 options.event_handler, |
| 976 options.service_url.host() + options.service_url.path(), | 998 options.service_url.host() + options.service_url.path(), |
| 977 options.service_url.EffectiveIntPort(), | 999 options.service_url.EffectiveIntPort(), |
| 978 options.service_url.SchemeIsSecure(), | 1000 options.service_url.SchemeIsSecure(), |
| 979 BrowserThread::GetBlockingPool(), | 1001 BrowserThread::GetBlockingPool(), |
| 980 options.make_http_bridge_factory_fn.Run().Pass(), | 1002 options.make_http_bridge_factory_fn.Run().Pass(), |
| 981 options.routing_info, | |
| 982 options.workers, | 1003 options.workers, |
| 983 options.extensions_activity_monitor, | 1004 options.extensions_activity_monitor, |
| 984 options.registrar /* as SyncManager::ChangeDelegate */, | 1005 options.registrar /* as SyncManager::ChangeDelegate */, |
| 985 options.credentials, | 1006 options.credentials, |
| 986 scoped_ptr<syncer::SyncNotifier>(new BridgedSyncNotifier( | 1007 scoped_ptr<syncer::SyncNotifier>(new BridgedSyncNotifier( |
| 987 options.chrome_sync_notification_bridge, | 1008 options.chrome_sync_notification_bridge, |
| 988 options.sync_notifier_factory->CreateSyncNotifier())), | 1009 options.sync_notifier_factory->CreateSyncNotifier())), |
| 989 options.restored_key_for_bootstrapping, | 1010 options.restored_key_for_bootstrapping, |
| 990 scoped_ptr<InternalComponentsFactory>( | 1011 scoped_ptr<InternalComponentsFactory>( |
| 991 options.internal_components_factory), | 1012 options.internal_components_factory), |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1169 initialization_state_ = NOT_INITIALIZED; | 1190 initialization_state_ = NOT_INITIALIZED; |
| 1170 | 1191 |
| 1171 DCHECK_EQ(MessageLoop::current(), frontend_loop_); | 1192 DCHECK_EQ(MessageLoop::current(), frontend_loop_); |
| 1172 if (!success) { | 1193 if (!success) { |
| 1173 initialization_state_ = NOT_INITIALIZED; | 1194 initialization_state_ = NOT_INITIALIZED; |
| 1174 frontend_->OnBackendInitialized( | 1195 frontend_->OnBackendInitialized( |
| 1175 syncer::WeakHandle<syncer::JsBackend>(), false); | 1196 syncer::WeakHandle<syncer::JsBackend>(), false); |
| 1176 return; | 1197 return; |
| 1177 } | 1198 } |
| 1178 | 1199 |
| 1179 // If setup has completed, start off in DOWNLOADING_NIGORI so that | |
| 1180 // we start off by refreshing nigori. | |
| 1181 CHECK(sync_prefs_.get()); | |
| 1182 if (sync_prefs_->HasSyncSetupCompleted() && | |
| 1183 initialization_state_ < DOWNLOADING_NIGORI) { | |
| 1184 initialization_state_ = DOWNLOADING_NIGORI; | |
| 1185 } | |
| 1186 | |
| 1187 // Run initialization state machine. | 1200 // Run initialization state machine. |
| 1188 switch (initialization_state_) { | 1201 switch (initialization_state_) { |
| 1189 case NOT_INITIALIZED: | 1202 case NOT_INITIALIZED: |
| 1203 // This configuration should result in a download request if the nigori | |
| 1204 // type's initial_sync_ended bit is unset. If the download request | |
| 1205 // contains progress markers, there is a risk that the server will try to | |
| 1206 // trigger migration. That would be disastrous, so we must rely on the | |
| 1207 // backend to ensure that this type never has both progress markers and | |
|
Nicolas Zea
2012/07/23 20:47:15
did you mean rely on the sync manager purging? Sin
rlarocque
2012/07/23 23:16:10
I'm using "backend" as a generic term to refer to
| |
| 1208 // !initial_sync_ended. | |
| 1190 initialization_state_ = DOWNLOADING_NIGORI; | 1209 initialization_state_ = DOWNLOADING_NIGORI; |
| 1191 ConfigureDataTypes( | 1210 ConfigureDataTypes( |
| 1192 syncer::CONFIGURE_REASON_NEW_CLIENT, | 1211 syncer::CONFIGURE_REASON_NEW_CLIENT, |
| 1193 syncer::ModelTypeSet(), | 1212 syncer::ModelTypeSet(), |
| 1194 syncer::ModelTypeSet(), | 1213 syncer::ModelTypeSet(), |
| 1195 WITH_NIGORI, | 1214 WITH_NIGORI, |
| 1196 // Calls back into this function. | 1215 // Calls back into this function. |
| 1197 base::Bind( | 1216 base::Bind( |
| 1198 &SyncBackendHost:: | 1217 &SyncBackendHost:: |
| 1199 HandleNigoriConfigurationCompletedOnFrontendLoop, | 1218 HandleNigoriConfigurationCompletedOnFrontendLoop, |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1375 FROM_HERE, | 1394 FROM_HERE, |
| 1376 base::Bind(&SyncBackendHost::Core::DoRefreshNigori, | 1395 base::Bind(&SyncBackendHost::Core::DoRefreshNigori, |
| 1377 core_.get(), sync_thread_done_callback)); | 1396 core_.get(), sync_thread_done_callback)); |
| 1378 } | 1397 } |
| 1379 | 1398 |
| 1380 #undef SDVLOG | 1399 #undef SDVLOG |
| 1381 | 1400 |
| 1382 #undef SLOG | 1401 #undef SLOG |
| 1383 | 1402 |
| 1384 } // namespace browser_sync | 1403 } // namespace browser_sync |
| OLD | NEW |