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

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

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 #ifndef CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_H_ 5 #ifndef CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_H_
6 #define CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_H_ 6 #define CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_H_
7 #pragma once 7 #pragma once
8 8
9 #include <map> 9 #include <map>
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/callback.h" 13 #include "base/callback.h"
14 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
15 #include "base/file_path.h" 15 #include "base/file_path.h"
16 #include "base/gtest_prod_util.h" 16 #include "base/gtest_prod_util.h"
17 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
18 #include "base/message_loop.h" 18 #include "base/message_loop.h"
19 #include "base/synchronization/lock.h" 19 #include "base/synchronization/lock.h"
20 #include "base/threading/thread.h" 20 #include "base/threading/thread.h"
21 #include "base/timer.h" 21 #include "base/timer.h"
22 #include "chrome/browser/sync/engine/configure_reason.h" 22 #include "chrome/browser/sync/engine/configure_reason.h"
23 #include "chrome/browser/sync/engine/model_safe_worker.h" 23 #include "chrome/browser/sync/engine/model_safe_worker.h"
24 #include "chrome/browser/sync/engine/syncapi.h"
25 #include "chrome/browser/sync/glue/data_type_controller.h"
26 #include "chrome/browser/sync/glue/ui_model_worker.h" 24 #include "chrome/browser/sync/glue/ui_model_worker.h"
27 #include "chrome/browser/sync/js/js_backend.h" 25 #include "chrome/browser/sync/js/js_backend.h"
28 #include "chrome/browser/sync/notifier/sync_notifier_factory.h" 26 #include "chrome/browser/sync/notifier/sync_notifier_factory.h"
29 #include "chrome/browser/sync/syncable/model_type.h" 27 #include "chrome/browser/sync/syncable/model_type.h"
30 #include "chrome/browser/sync/weak_handle.h" 28 #include "chrome/browser/sync/weak_handle.h"
31 #include "chrome/common/net/gaia/google_service_auth_error.h" 29 #include "chrome/common/net/gaia/google_service_auth_error.h"
32 #include "googleurl/src/gurl.h" 30 #include "googleurl/src/gurl.h"
33 #include "net/url_request/url_request_context_getter.h" 31 #include "net/url_request/url_request_context_getter.h"
34 32
35 class CancelableTask; 33 class CancelableTask;
36 class Profile; 34 class Profile;
37 35
38 namespace net { 36 namespace net {
39 class URLRequestContextGetter; 37 class URLRequestContextGetter;
40 } 38 }
41 39
42 namespace browser_sync { 40 namespace browser_sync {
43 41
44 namespace sessions { 42 namespace sessions {
45 struct SyncSessionSnapshot; 43 struct SyncSessionSnapshot;
46 } 44 }
47 45
48 class ChangeProcessor; 46 class ChangeProcessor;
49 class DataTypeController;
50 class JsEventHandler; 47 class JsEventHandler;
51 48
52 // SyncFrontend is the interface used by SyncBackendHost to communicate with 49 // SyncFrontend is the interface used by SyncBackendHost to communicate with
53 // the entity that created it and, presumably, is interested in sync-related 50 // the entity that created it and, presumably, is interested in sync-related
54 // activity. 51 // activity.
55 // NOTE: All methods will be invoked by a SyncBackendHost on the same thread 52 // NOTE: All methods will be invoked by a SyncBackendHost on the same thread
56 // used to create that SyncBackendHost. 53 // used to create that SyncBackendHost.
57 class SyncFrontend { 54 class SyncFrontend {
58 public: 55 public:
59 SyncFrontend() {} 56 SyncFrontend() {}
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 SyncBackendHost(); 123 SyncBackendHost();
127 virtual ~SyncBackendHost(); 124 virtual ~SyncBackendHost();
128 125
129 // Called on |frontend_loop_| to kick off asynchronous initialization. 126 // Called on |frontend_loop_| to kick off asynchronous initialization.
130 // As a fallback when no cached auth information is available, try to 127 // As a fallback when no cached auth information is available, try to
131 // bootstrap authentication using |lsid|, if it isn't empty. 128 // bootstrap authentication using |lsid|, if it isn't empty.
132 // Optionally delete the Sync Data folder (if it's corrupt). 129 // Optionally delete the Sync Data folder (if it's corrupt).
133 void Initialize(SyncFrontend* frontend, 130 void Initialize(SyncFrontend* frontend,
134 const WeakHandle<JsEventHandler>& event_handler, 131 const WeakHandle<JsEventHandler>& event_handler,
135 const GURL& service_url, 132 const GURL& service_url,
136 const syncable::ModelTypeSet& types, 133 const syncable::ModelTypeSet& initial_types,
137 const sync_api::SyncCredentials& credentials, 134 const sync_api::SyncCredentials& credentials,
138 bool delete_sync_data_folder); 135 bool delete_sync_data_folder);
139 136
140 // Called from |frontend_loop| to update SyncCredentials. 137 // Called from |frontend_loop| to update SyncCredentials.
141 void UpdateCredentials(const sync_api::SyncCredentials& credentials); 138 void UpdateCredentials(const sync_api::SyncCredentials& credentials);
142 139
143 // This starts the SyncerThread running a Syncer object to communicate with 140 // This starts the SyncerThread running a Syncer object to communicate with
144 // sync servers. Until this is called, no changes will leave or enter this 141 // sync servers. Until this is called, no changes will leave or enter this
145 // browser from the cloud / sync servers. 142 // browser from the cloud / sync servers.
146 // Called on |frontend_loop_|. 143 // Called on |frontend_loop_|.
147 virtual void StartSyncingWithServer(); 144 virtual void StartSyncingWithServer();
148 145
149 // Called on |frontend_loop_| to asynchronously set the passphrase. 146 // Called on |frontend_loop_| to asynchronously set the passphrase.
150 // |is_explicit| is true if the call is in response to the user explicitly 147 // |is_explicit| is true if the call is in response to the user explicitly
151 // setting a passphrase as opposed to implicitly (from the users' perspective) 148 // setting a passphrase as opposed to implicitly (from the users' perspective)
152 // using their Google Account password. An implicit SetPassphrase will *not* 149 // using their Google Account password. An implicit SetPassphrase will *not*
153 // *not* override an explicit passphrase set previously. 150 // *not* override an explicit passphrase set previously.
154 void SetPassphrase(const std::string& passphrase, bool is_explicit); 151 void SetPassphrase(const std::string& passphrase, bool is_explicit);
155 152
156 // Called on |frontend_loop_| to kick off shutdown. 153 // Called on |frontend_loop_| to kick off shutdown.
157 // |sync_disabled| indicates if syncing is being disabled or not. 154 // |sync_disabled| indicates if syncing is being disabled or not.
158 // See the implementation and Core::DoShutdown for details. 155 // See the implementation and Core::DoShutdown for details.
159 void Shutdown(bool sync_disabled); 156 void Shutdown(bool sync_disabled);
160 157
161 // Changes the set of data types that are currently being synced. 158 // Changes the set of data types that are currently being synced.
162 // The ready_task will be run when all of the requested data types 159 // The ready_task will be run when all of the requested data types
163 // are up-to-date and ready for activation. The task will cancelled 160 // are up-to-date and ready for activation. The task will be
164 // upon shutdown. The method takes ownership of the task pointer. 161 // cancelled upon shutdown.
165 virtual void ConfigureDataTypes( 162 virtual void ConfigureDataTypes(
166 const DataTypeController::TypeMap& data_type_controllers, 163 const syncable::ModelTypeSet& types_to_add,
167 const syncable::ModelTypeSet& types, 164 const syncable::ModelTypeSet& types_to_remove,
168 sync_api::ConfigureReason reason, 165 sync_api::ConfigureReason reason,
169 base::Callback<void(bool)> ready_task, 166 base::Callback<void(bool)> ready_task,
170 bool enable_nigori); 167 bool enable_nigori);
171 168
172 // Makes an asynchronous call to syncer to switch to config mode. When done 169 // Makes an asynchronous call to syncer to switch to config mode. When done
173 // syncer will call us back on FinishConfigureDataTypes. 170 // syncer will call us back on FinishConfigureDataTypes.
174 virtual void StartConfiguration(Callback0::Type* callback); 171 virtual void StartConfiguration(Callback0::Type* callback);
175 172
176 // Encrypts the specified datatypes and marks them as needing encryption on 173 // Encrypts the specified datatypes and marks them as needing encryption on
177 // other machines. This affects all machines synced to this account and all 174 // other machines. This affects all machines synced to this account and all
178 // data belonging to the specified types. 175 // data belonging to the specified types.
179 // Note: actual work is done on sync_thread_'s message loop. 176 // Note: actual work is done on sync_thread_'s message loop.
180 virtual void EncryptDataTypes( 177 virtual void EncryptDataTypes(
181 const syncable::ModelTypeSet& encrypted_types); 178 const syncable::ModelTypeSet& encrypted_types);
182 179
183 syncable::ModelTypeSet GetEncryptedDataTypes() const; 180 syncable::ModelTypeSet GetEncryptedDataTypes() const;
184 181
185 // Activates change processing for the given data type. This must 182 // Activates change processing for the given data type. This must
186 // be called synchronously with the data type's model association so 183 // be called synchronously with the data type's model association so
187 // no changes are dropped between model association and change 184 // no changes are dropped between model association and change
188 // processor activation. 185 // processor activation.
189 void ActivateDataType(DataTypeController* data_type_controller, 186 void ActivateDataType(
190 ChangeProcessor* change_processor); 187 syncable::ModelType type, ModelSafeGroup group,
188 ChangeProcessor* change_processor);
191 189
192 // Deactivates change processing for the given data type. 190 // Deactivates change processing for the given data type.
193 void DeactivateDataType(DataTypeController* data_type_controller, 191 void DeactivateDataType(syncable::ModelType type);
194 ChangeProcessor* change_processor);
195 192
196 // Asks the server to clear all data associated with ChromeSync. 193 // Asks the server to clear all data associated with ChromeSync.
197 virtual bool RequestClearServerData(); 194 virtual bool RequestClearServerData();
198 195
199 // Called on |frontend_loop_| to obtain a handle to the UserShare needed 196 // Called on |frontend_loop_| to obtain a handle to the UserShare needed
200 // for creating transactions. 197 // for creating transactions.
201 sync_api::UserShare* GetUserShare() const; 198 sync_api::UserShare* GetUserShare() const;
202 199
203 // Called from any thread to obtain current status information in detailed or 200 // Called from any thread to obtain current status information in detailed or
204 // summarized form. 201 // summarized form.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 // 2) Then, from |frontend_loop_|, halt the sync_thread_ (which is 347 // 2) Then, from |frontend_loop_|, halt the sync_thread_ (which is
351 // a blocking call). This causes syncapi thread-exit handlers 348 // a blocking call). This causes syncapi thread-exit handlers
352 // to run and make use of cached pointers to various components 349 // to run and make use of cached pointers to various components
353 // owned implicitly by us. 350 // owned implicitly by us.
354 // 3) Destroy this Core. That will delete syncapi components in a 351 // 3) Destroy this Core. That will delete syncapi components in a
355 // safe order because the thread that was using them has exited 352 // safe order because the thread that was using them has exited
356 // (in step 2). 353 // (in step 2).
357 void DoShutdown(bool stopping_sync); 354 void DoShutdown(bool stopping_sync);
358 355
359 // Posts a config request on the sync thread. 356 // Posts a config request on the sync thread.
360 virtual void DoRequestConfig(const syncable::ModelTypeBitSet& added_types, 357 virtual void DoRequestConfig(
358 const syncable::ModelTypeBitSet& types_to_config,
361 sync_api::ConfigureReason reason); 359 sync_api::ConfigureReason reason);
362 360
363 // Start the configuration mode. 361 // Start the configuration mode.
364 virtual void DoStartConfiguration(Callback0::Type* callback); 362 virtual void DoStartConfiguration(Callback0::Type* callback);
365 363
366 // Set the base request context to use when making HTTP calls. 364 // Set the base request context to use when making HTTP calls.
367 // This method will add a reference to the context to persist it 365 // This method will add a reference to the context to persist it
368 // on the IO thread. Must be removed from IO thread. 366 // on the IO thread. Must be removed from IO thread.
369 367
370 sync_api::SyncManager* sync_manager() { return sync_manager_.get(); } 368 sync_api::SyncManager* sync_manager() { return sync_manager_.get(); }
(...skipping 30 matching lines...) Expand all
401 "", true)); 399 "", true));
402 } 400 }
403 #endif 401 #endif
404 402
405 private: 403 private:
406 friend class base::RefCountedThreadSafe<SyncBackendHost::Core>; 404 friend class base::RefCountedThreadSafe<SyncBackendHost::Core>;
407 friend class SyncBackendHostForProfileSyncTest; 405 friend class SyncBackendHostForProfileSyncTest;
408 406
409 virtual ~Core(); 407 virtual ~Core();
410 408
411 // Return change processor for a particular model (return NULL on failure).
412 ChangeProcessor* GetProcessor(syncable::ModelType modeltype);
413
414 // Invoked when initialization of syncapi is complete and we can start 409 // Invoked when initialization of syncapi is complete and we can start
415 // our timer. 410 // our timer.
416 // This must be called from the thread on which SaveChanges is intended to 411 // This must be called from the thread on which SaveChanges is intended to
417 // be run on; the host's |sync_thread_|. 412 // be run on; the host's |sync_thread_|.
418 void StartSavingChanges(); 413 void StartSavingChanges();
419 414
420 // Invoked periodically to tell the syncapi to persist its state 415 // Invoked periodically to tell the syncapi to persist its state
421 // by writing to disk. 416 // by writing to disk.
422 // This is called from the thread we were created on (which is the 417 // This is called from the thread we were created on (which is the
423 // SyncBackendHost |sync_thread_|), using a repeating timer that is kicked 418 // SyncBackendHost |sync_thread_|), using a repeating timer that is kicked
(...skipping 27 matching lines...) Expand all
451 sessions::SyncSessionSnapshot* snapshot); 446 sessions::SyncSessionSnapshot* snapshot);
452 447
453 void HandleStopSyncingPermanentlyOnFrontendLoop(); 448 void HandleStopSyncingPermanentlyOnFrontendLoop();
454 449
455 // Called to handle success/failure of clearing server data 450 // Called to handle success/failure of clearing server data
456 void HandleClearServerDataSucceededOnFrontendLoop(); 451 void HandleClearServerDataSucceededOnFrontendLoop();
457 void HandleClearServerDataFailedOnFrontendLoop(); 452 void HandleClearServerDataFailedOnFrontendLoop();
458 453
459 void FinishConfigureDataTypesOnFrontendLoop(); 454 void FinishConfigureDataTypesOnFrontendLoop();
460 455
461 // Return true if a model lives on the current thread.
462 bool IsCurrentThreadSafeForModel(syncable::ModelType model_type);
463
464 Profile* profile_; 456 Profile* profile_;
465 457
466 // Our parent SyncBackendHost 458 // Our parent SyncBackendHost
467 SyncBackendHost* host_; 459 SyncBackendHost* host_;
468 460
469 // The timer used to periodically call SaveChanges. 461 // The timer used to periodically call SaveChanges.
470 base::RepeatingTimer<Core> save_changes_timer_; 462 base::RepeatingTimer<Core> save_changes_timer_;
471 463
472 // The top-level syncapi entry point. Lives on the sync thread. 464 // The top-level syncapi entry point. Lives on the sync thread.
473 scoped_ptr<sync_api::SyncManager> sync_manager_; 465 scoped_ptr<sync_api::SyncManager> sync_manager_;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 struct PendingConfigureDataTypesState { 513 struct PendingConfigureDataTypesState {
522 PendingConfigureDataTypesState(); 514 PendingConfigureDataTypesState();
523 ~PendingConfigureDataTypesState(); 515 ~PendingConfigureDataTypesState();
524 516
525 // A task that should be called once data type configuration is 517 // A task that should be called once data type configuration is
526 // complete. 518 // complete.
527 base::Callback<void(bool)> ready_task; 519 base::Callback<void(bool)> ready_task;
528 520
529 // The set of types that we are waiting to be initially synced in a 521 // The set of types that we are waiting to be initially synced in a
530 // configuration cycle. 522 // configuration cycle.
531 syncable::ModelTypeSet initial_types; 523 syncable::ModelTypeSet types_to_add;
532 524
533 // Additional details about which types were added. 525 // Additional details about which types were added.
534 syncable::ModelTypeBitSet added_types; 526 syncable::ModelTypeSet added_types;
535 sync_api::ConfigureReason reason; 527 sync_api::ConfigureReason reason;
536 }; 528 };
537 529
538 UIModelWorker* ui_worker(); 530 UIModelWorker* ui_worker();
539 531
540 // Helper function for ConfigureDataTypes() that fills in |state| 532 // Return change processor for a particular model (return NULL on failure).
541 // and |deleted_type|. Does not take ownership of routing_info|. 533 ChangeProcessor* GetProcessor(syncable::ModelType modeltype);
534
535 // Like GetProcessor(), but |registrar_lock_| must already be
536 // held.
537 ChangeProcessor* GetProcessorUnsafe(syncable::ModelType modeltype);
538
539 // Return true if a model lives on the current thread.
540 bool IsCurrentThreadSafeForModel(syncable::ModelType model_type) const;
541
542 // Helper function for ConfigureDataTypes() that fills in |state|.
543 // Does not take ownership of |routing_info|.
542 static void GetPendingConfigModeState( 544 static void GetPendingConfigModeState(
543 const DataTypeController::TypeMap& data_type_controllers, 545 const syncable::ModelTypeSet& types_to_add,
544 const syncable::ModelTypeSet& types, 546 const syncable::ModelTypeSet& types_to_remove,
545 base::Callback<void(bool)> ready_task, 547 base::Callback<void(bool)> ready_task,
546 ModelSafeRoutingInfo* routing_info, 548 ModelSafeRoutingInfo* routing_info,
547 sync_api::ConfigureReason reason, 549 sync_api::ConfigureReason reason,
548 bool nigori_enabled, 550 PendingConfigureDataTypesState* state);
549 PendingConfigureDataTypesState* state,
550 bool* deleted_type);
551 551
552 // For convenience, checks if initialization state is INITIALIZED. 552 // For convenience, checks if initialization state is INITIALIZED.
553 bool initialized() const { return initialization_state_ == INITIALIZED; } 553 bool initialized() const { return initialization_state_ == INITIALIZED; }
554 554
555 // A thread where all the sync operations happen. 555 // A thread where all the sync operations happen.
556 base::Thread sync_thread_; 556 base::Thread sync_thread_;
557 557
558 // A reference to the MessageLoop used to construct |this|, so we know how 558 // A reference to the MessageLoop used to construct |this|, so we know how
559 // to safely talk back to the SyncFrontend. 559 // to safely talk back to the SyncFrontend.
560 MessageLoop* const frontend_loop_; 560 MessageLoop* const frontend_loop_;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 606
607 // UI-thread cache of the last SyncSessionSnapshot received from syncapi. 607 // UI-thread cache of the last SyncSessionSnapshot received from syncapi.
608 scoped_ptr<sessions::SyncSessionSnapshot> last_snapshot_; 608 scoped_ptr<sessions::SyncSessionSnapshot> last_snapshot_;
609 609
610 DISALLOW_COPY_AND_ASSIGN(SyncBackendHost); 610 DISALLOW_COPY_AND_ASSIGN(SyncBackendHost);
611 }; 611 };
612 612
613 } // namespace browser_sync 613 } // namespace browser_sync
614 614
615 #endif // CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_H_ 615 #endif // CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698