Index: chrome/browser/sync/glue/sync_backend_host.h |
diff --git a/chrome/browser/sync/glue/sync_backend_host.h b/chrome/browser/sync/glue/sync_backend_host.h |
index d7958aca0ab17741c792aae56ed2f69257fbc722..dab35d56d6195e671900ca12615971def59d58e5 100644 |
--- a/chrome/browser/sync/glue/sync_backend_host.h |
+++ b/chrome/browser/sync/glue/sync_backend_host.h |
@@ -231,10 +231,6 @@ class SyncBackendHost { |
const GoogleServiceAuthError& GetAuthError() const; |
const sessions::SyncSessionSnapshot* GetLastSessionSnapshot() const; |
- const FilePath& sync_data_folder_path() const { |
- return sync_data_folder_path_; |
- } |
- |
// Determines if the underlying sync engine has made any local changes to |
// items that have not yet been synced with the server. |
// ONLY CALL THIS IF OnInitializationComplete was called! |
@@ -254,6 +250,58 @@ class SyncBackendHost { |
void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) const; |
protected: |
+ // The types and functions below are protected so that test |
+ // subclasses can use them. |
+ // |
+ // TODO(akalin): Figure out a better way for tests to hook into |
+ // SyncBackendHost. |
+ |
+ typedef base::Callback<sync_api::HttpPostProviderFactory*(void)> |
+ MakeHttpBridgeFactoryFn; |
+ |
+ struct DoInitializeOptions { |
+ DoInitializeOptions( |
+ MessageLoop* sync_loop, |
+ SyncBackendRegistrar* registrar, |
+ const WeakHandle<JsEventHandler>& event_handler, |
+ const GURL& service_url, |
+ MakeHttpBridgeFactoryFn make_http_bridge_factory_fn, |
+ const sync_api::SyncCredentials& credentials, |
+ sync_notifier::SyncNotifierFactory* sync_notifier_factory, |
+ bool delete_sync_data_folder, |
+ const std::string& restored_key_for_bootstrapping, |
+ bool setup_for_test_mode); |
+ ~DoInitializeOptions(); |
+ |
+ MessageLoop* sync_loop; |
+ SyncBackendRegistrar* registrar; |
+ WeakHandle<JsEventHandler> event_handler; |
+ GURL service_url; |
+ // Overridden by tests. |
+ MakeHttpBridgeFactoryFn make_http_bridge_factory_fn; |
+ sync_api::SyncCredentials credentials; |
+ sync_notifier::SyncNotifierFactory* const sync_notifier_factory; |
+ std::string lsid; |
+ bool delete_sync_data_folder; |
+ std::string restored_key_for_bootstrapping; |
+ bool setup_for_test_mode; |
+ }; |
+ |
+ // Allows tests to perform alternate core initialization work. |
+ virtual void InitCore(const DoInitializeOptions& options); |
+ |
+ // Called from Core::OnSyncCycleCompleted to handle updating frontend |
+ // thread components. |
+ void HandleSyncCycleCompletedOnFrontendLoop( |
+ sessions::SyncSessionSnapshot* snapshot); |
+ |
+ // Called to finish the job of ConfigureDataTypes once the syncer is in |
+ // configuration mode. |
+ void FinishConfigureDataTypesOnFrontendLoop(); |
+ |
+ bool IsDownloadingNigoriForTest() const; |
+ |
+ private: |
// An enum representing the steps to initializing the SyncBackendHost. |
enum InitializationState { |
NOT_ATTEMPTED, |
@@ -274,7 +322,9 @@ class SyncBackendHost { |
class Core : public base::RefCountedThreadSafe<SyncBackendHost::Core>, |
public sync_api::SyncManager::Observer { |
public: |
- Core(const std::string& name, SyncBackendHost* backend); |
+ Core(const std::string& name, |
+ const FilePath& sync_data_folder_path, |
+ const base::WeakPtr<SyncBackendHost>& backend); |
// SyncManager::Observer implementation. The Core just acts like an air |
// traffic controller here, forwarding incoming messages to appropriate |
@@ -301,32 +351,6 @@ class SyncBackendHost { |
virtual void OnActionableError( |
const browser_sync::SyncProtocolError& sync_error) OVERRIDE; |
- struct DoInitializeOptions { |
- DoInitializeOptions( |
- MessageLoop* sync_loop, |
- SyncBackendRegistrar* registrar, |
- const WeakHandle<JsEventHandler>& event_handler, |
- const GURL& service_url, |
- const scoped_refptr<net::URLRequestContextGetter>& |
- request_context_getter, |
- const sync_api::SyncCredentials& credentials, |
- bool delete_sync_data_folder, |
- const std::string& restored_key_for_bootstrapping, |
- bool setup_for_test_mode); |
- ~DoInitializeOptions(); |
- |
- MessageLoop* sync_loop; |
- SyncBackendRegistrar* registrar; |
- WeakHandle<JsEventHandler> event_handler; |
- GURL service_url; |
- scoped_refptr<net::URLRequestContextGetter> request_context_getter; |
- sync_api::SyncCredentials credentials; |
- std::string lsid; |
- bool delete_sync_data_folder; |
- std::string restored_key_for_bootstrapping; |
- bool setup_for_test_mode; |
- }; |
- |
// Note: |
// |
// The Do* methods are the various entry points from our |
@@ -407,18 +431,6 @@ class SyncBackendHost { |
// A callback from the SyncerThread when it is safe to continue config. |
void FinishConfigureDataTypes(); |
- // Called to handle updating frontend thread components whenever we may |
- // need to alert the frontend that the backend is intialized. |
- void HandleInitializationCompletedOnFrontendLoop( |
- const WeakHandle<JsBackend>& js_backend, |
- bool success); |
- |
- // Called when configuration of the Nigori node has completed as |
- // part of the initialization process. |
- void HandleNigoriConfigurationCompletedOnFrontendLoop( |
- const WeakHandle<JsBackend>& js_backend, |
- syncable::ModelTypeSet failed_configuration_types); |
- |
private: |
friend class base::RefCountedThreadSafe<SyncBackendHost::Core>; |
friend class SyncBackendHostForProfileSyncTest; |
@@ -439,52 +451,14 @@ class SyncBackendHost { |
// initialization. |
void SaveChanges(); |
- // Let the front end handle the actionable error event. |
- void HandleActionableErrorEventOnFrontendLoop( |
- const browser_sync::SyncProtocolError& sync_error); |
- |
- // Dispatched to from OnAuthError to handle updating frontend UI |
- // components. |
- void HandleAuthErrorEventOnFrontendLoop( |
- const GoogleServiceAuthError& new_auth_error); |
- |
- // Invoked when a passphrase is required to decrypt a set of Nigori keys, |
- // or for encrypting. |reason| denotes why the passhrase was required. |
- void NotifyPassphraseRequired(sync_api::PassphraseRequiredReason reason); |
- |
- // Invoked when the passphrase provided by the user has been accepted. |
- void NotifyPassphraseAccepted(const std::string& bootstrap_token); |
- |
- // Invoked when an updated token is available from the sync server. |
- void NotifyUpdatedToken(const std::string& token); |
- |
- // Invoked when the set of encrypted types or the encrypt |
- // everything flag changes. |
- void NotifyEncryptedTypesChanged( |
- syncable::ModelTypeSet encrypted_types, |
- bool encrypt_everything); |
- |
- // Invoked when sync finishes encrypting new datatypes. |
- void NotifyEncryptionComplete(); |
- |
- // Called from Core::OnSyncCycleCompleted to handle updating frontend |
- // thread components. |
- void HandleSyncCycleCompletedOnFrontendLoop( |
- sessions::SyncSessionSnapshot* snapshot); |
- |
- void HandleStopSyncingPermanentlyOnFrontendLoop(); |
- |
- // Called to handle success/failure of clearing server data |
- void HandleClearServerDataSucceededOnFrontendLoop(); |
- void HandleClearServerDataFailedOnFrontendLoop(); |
- |
- void FinishConfigureDataTypesOnFrontendLoop(); |
- |
// Name used for debugging. |
const std::string name_; |
- // Our parent SyncBackendHost |
- SyncBackendHost* host_; |
+ // Path of the folder that stores the sync data files. |
+ const FilePath sync_data_folder_path_; |
+ |
+ // Our parent SyncBackendHost. |
+ WeakHandle<SyncBackendHost> host_; |
// The loop where all the sync backend operations happen. |
// Non-NULL only between calls to DoInitialize() and DoShutdown(). |
@@ -503,6 +477,24 @@ class SyncBackendHost { |
DISALLOW_COPY_AND_ASSIGN(Core); |
}; |
+ struct PendingConfigureDataTypesState { |
+ PendingConfigureDataTypesState(); |
+ ~PendingConfigureDataTypesState(); |
+ |
+ // The ready_task will be run when configuration is done with the |
+ // set of all types that failed configuration (i.e., if its |
+ // argument is non-empty, then an error was encountered). |
+ base::Callback<void(syncable::ModelTypeSet)> ready_task; |
+ |
+ // The set of types that we are waiting to be initially synced in a |
+ // configuration cycle. |
+ syncable::ModelTypeSet types_to_add; |
+ |
+ // Additional details about which types were added. |
+ syncable::ModelTypeSet added_types; |
+ sync_api::ConfigureReason reason; |
+ }; |
+ |
// Checks if we have received a notice to turn on experimental datatypes |
// (via the nigori node) and informs the frontend if that is the case. |
// Note: it is illegal to call this before the backend is initialized. |
@@ -515,50 +507,54 @@ class SyncBackendHost { |
const WeakHandle<JsBackend>& js_backend, |
bool success); |
- // Called to finish the job of ConfigureDataTypes once the syncer is in |
- // configuration mode. |
- void FinishConfigureDataTypesOnFrontendLoop(); |
- |
- // Allows tests to perform alternate core initialization work. |
- virtual void InitCore(const Core::DoInitializeOptions& options); |
- |
- // Factory method for HttpPostProviderFactories. Should be |
- // thread-safe. |
- virtual sync_api::HttpPostProviderFactory* MakeHttpBridgeFactory( |
- const scoped_refptr<net::URLRequestContextGetter>& getter); |
- |
// Helpers to persist a token that can be used to bootstrap sync encryption |
// across browser restart to avoid requiring the user to re-enter their |
// passphrase. |token| must be valid UTF-8 as we use the PrefService for |
// storage. |
void PersistEncryptionBootstrapToken(const std::string& token); |
- // Our core, which communicates directly to the syncapi. |
- scoped_refptr<Core> core_; |
+ // For convenience, checks if initialization state is INITIALIZED. |
+ bool initialized() const { return initialization_state_ == INITIALIZED; } |
- InitializationState initialization_state_; |
+ // Let the front end handle the actionable error event. |
+ void HandleActionableErrorEventOnFrontendLoop( |
+ const browser_sync::SyncProtocolError& sync_error); |
- private: |
- struct PendingConfigureDataTypesState { |
- PendingConfigureDataTypesState(); |
- ~PendingConfigureDataTypesState(); |
+ // Invoked when a passphrase is required to decrypt a set of Nigori keys, |
+ // or for encrypting. |reason| denotes why the passhrase was required. |
+ void NotifyPassphraseRequired(sync_api::PassphraseRequiredReason reason); |
- // The ready_task will be run when configuration is done with the |
- // set of all types that failed configuration (i.e., if its |
- // argument is non-empty, then an error was encountered). |
- base::Callback<void(syncable::ModelTypeSet)> ready_task; |
+ // Invoked when the passphrase provided by the user has been accepted. |
+ void NotifyPassphraseAccepted(const std::string& bootstrap_token); |
- // The set of types that we are waiting to be initially synced in a |
- // configuration cycle. |
- syncable::ModelTypeSet types_to_add; |
+ // Invoked when an updated token is available from the sync server. |
+ void NotifyUpdatedToken(const std::string& token); |
- // Additional details about which types were added. |
- syncable::ModelTypeSet added_types; |
- sync_api::ConfigureReason reason; |
- }; |
+ // Invoked when the set of encrypted types or the encrypt |
+ // everything flag changes. |
+ void NotifyEncryptedTypesChanged( |
+ syncable::ModelTypeSet encrypted_types, |
+ bool encrypt_everything); |
- // For convenience, checks if initialization state is INITIALIZED. |
- bool initialized() const { return initialization_state_ == INITIALIZED; } |
+ // Invoked when sync finishes encrypting new datatypes. |
+ void NotifyEncryptionComplete(); |
+ |
+ void HandleStopSyncingPermanentlyOnFrontendLoop(); |
+ |
+ // Called to handle success/failure of clearing server data |
+ void HandleClearServerDataSucceededOnFrontendLoop(); |
+ void HandleClearServerDataFailedOnFrontendLoop(); |
+ |
+ // Dispatched to from OnAuthError to handle updating frontend UI |
+ // components. |
+ void HandleAuthErrorEventOnFrontendLoop( |
+ const GoogleServiceAuthError& new_auth_error); |
+ |
+ // Called when configuration of the Nigori node has completed as |
+ // part of the initialization process. |
+ void HandleNigoriConfigurationCompletedOnFrontendLoop( |
+ const WeakHandle<JsBackend>& js_backend, |
+ syncable::ModelTypeSet failed_configuration_types); |
// Must be called on |frontend_loop_|. |done_callback| is called on |
// |frontend_loop_|. |
@@ -568,6 +564,8 @@ class SyncBackendHost { |
// initialization is done yet. |
void StopSyncManagerForShutdown(const base::Closure& closure); |
+ base::WeakPtrFactory<SyncBackendHost> weak_ptr_factory_; |
+ |
// A thread where all the sync operations happen. |
base::Thread sync_thread_; |
@@ -577,11 +575,16 @@ class SyncBackendHost { |
Profile* const profile_; |
- const base::WeakPtr<SyncPrefs> sync_prefs_; |
- |
// Name used for debugging (set from profile_->GetDebugName()). |
const std::string name_; |
+ // Our core, which communicates directly to the syncapi. |
+ scoped_refptr<Core> core_; |
+ |
+ InitializationState initialization_state_; |
+ |
+ const base::WeakPtr<SyncPrefs> sync_prefs_; |
+ |
sync_notifier::SyncNotifierFactory sync_notifier_factory_; |
scoped_ptr<SyncBackendRegistrar> registrar_; |
@@ -589,9 +592,6 @@ class SyncBackendHost { |
// The frontend which we serve (and are owned by). |
SyncFrontend* frontend_; |
- // Path of the folder that stores the sync data files. |
- FilePath sync_data_folder_path_; |
- |
scoped_ptr<PendingConfigureDataTypesState> pending_download_state_; |
scoped_ptr<PendingConfigureDataTypesState> pending_config_mode_state_; |