sync_backend_host_impl.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_IMPL_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_IMPL_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/thread.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/extensions_activity_monitor.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/glue/sync_backend_host.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/backend_data_type_configurer.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_observer.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_registrar.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/configure_reason.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/sync_manager.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/util/report_unrecoverable_error_function.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/util/unrecoverable_error_handler.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/internal_api/public/util/weak_handle.h"
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/notifier/invalidation_handler.h"
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/protocol/encryption.pb.h"
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/protocol/sync_protocol_error.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "sync/util/extensions_activity.h"
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class GURL;
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class Profile;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base {
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MessageLoop;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace invalidation {
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class InvalidationService;
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace syncer {
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class NetworkResources;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncManagerFactory;
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace sync_driver {
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SyncPrefs;
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace browser_sync {
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ChangeProcessor;
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncBackendHostCore;
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncBackendRegistrar;
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncedDeviceTracker;
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct DoInitializeOptions;
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The only real implementation of the SyncBackendHost.  See that interface's
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// definition for documentation of public methods.
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SyncBackendHostImpl
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : public SyncBackendHost,
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      public content::NotificationObserver,
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      public syncer::InvalidationHandler {
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef syncer::SyncStatus Status;
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Create a SyncBackendHost with a reference to the |frontend| that
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // it serves and communicates to via the SyncFrontend interface (on
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the same thread it used to call the constructor).  Must outlive
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |sync_prefs|.
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SyncBackendHostImpl(const std::string& name,
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                      Profile* profile,
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                      const base::WeakPtr<sync_driver::SyncPrefs>& sync_prefs);
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~SyncBackendHostImpl();
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // SyncBackendHost implementation.
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void Initialize(
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SyncFrontend* frontend,
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<base::Thread> sync_thread,
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::WeakHandle<syncer::JsEventHandler>& event_handler,
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GURL& service_url,
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::SyncCredentials& credentials,
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bool delete_sync_data_folder,
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<syncer::SyncManagerFactory> sync_manager_factory,
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<syncer::UnrecoverableErrorHandler> unrecoverable_error_handler,
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ReportUnrecoverableErrorFunction
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          report_unrecoverable_error_function,
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      syncer::NetworkResources* network_resources) OVERRIDE;
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void UpdateCredentials(
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::SyncCredentials& credentials) OVERRIDE;
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void StartSyncingWithServer() OVERRIDE;
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void SetEncryptionPassphrase(
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& passphrase,
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bool is_explicit) OVERRIDE;
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool SetDecryptionPassphrase(const std::string& passphrase)
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE WARN_UNUSED_RESULT;
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void StopSyncingForShutdown() OVERRIDE;
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual scoped_ptr<base::Thread> Shutdown(ShutdownOption option) OVERRIDE;
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void UnregisterInvalidationIds() OVERRIDE;
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void ConfigureDataTypes(
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ConfigureReason reason,
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const DataTypeConfigStateMap& config_state_map,
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const base::Callback<void(syncer::ModelTypeSet,
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                syncer::ModelTypeSet)>& ready_task,
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const base::Callback<void()>& retry_callback) OVERRIDE;
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void EnableEncryptEverything() OVERRIDE;
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void ActivateDataType(
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelType type, syncer::ModelSafeGroup group,
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ChangeProcessor* change_processor) OVERRIDE;
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DeactivateDataType(syncer::ModelType type) OVERRIDE;
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual syncer::UserShare* GetUserShare() const OVERRIDE;
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual Status GetDetailedStatus() OVERRIDE;
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual syncer::sessions::SyncSessionSnapshot
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GetLastSessionSnapshot() const OVERRIDE;
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool HasUnsyncedItems() const OVERRIDE;
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool IsNigoriEnabled() const OVERRIDE;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual syncer::PassphraseType GetPassphraseType() const OVERRIDE;
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual base::Time GetExplicitPassphraseTime() const OVERRIDE;
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool IsCryptographerReady(
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::BaseTransaction* trans) const OVERRIDE;
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void GetModelSafeRoutingInfo(
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelSafeRoutingInfo* out) const OVERRIDE;
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual SyncedDeviceTracker* GetSyncedDeviceTracker() const OVERRIDE;
127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void RequestBufferedProtocolEventsAndEnableForwarding() OVERRIDE;
128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void DisableProtocolEventForwarding() OVERRIDE;
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual base::MessageLoop* GetSyncLoopForTesting() OVERRIDE;
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The types and functions below are protected so that test
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // subclasses can use them.
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Allows tests to perform alternate core initialization work.
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void InitCore(scoped_ptr<DoInitializeOptions> options);
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Request the syncer to reconfigure with the specfied params.
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Virtual for testing.
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void RequestConfigureSyncer(
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ConfigureReason reason,
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelTypeSet to_download,
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelTypeSet to_purge,
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelTypeSet to_journal,
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelTypeSet to_unapply,
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelTypeSet to_ignore,
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::ModelSafeRoutingInfo& routing_info,
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const base::Callback<void(syncer::ModelTypeSet,
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                syncer::ModelTypeSet)>& ready_task,
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const base::Closure& retry_callback);
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Called when the syncer has finished performing a configuration.
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void FinishConfigureDataTypesOnFrontendLoop(
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::ModelTypeSet enabled_types,
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::ModelTypeSet succeeded_configuration_types,
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::ModelTypeSet failed_configuration_types,
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const base::Callback<void(syncer::ModelTypeSet,
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                syncer::ModelTypeSet)>& ready_task);
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Reports backend initialization success.  Includes some objects from sync
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // manager initialization to be passed back to the UI thread.
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void HandleInitializationSuccessOnFrontendLoop(
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const syncer::WeakHandle<syncer::JsBackend> js_backend,
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const syncer::WeakHandle<syncer::DataTypeDebugInfoListener>
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        debug_info_listener);
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Downloading of control types failed and will be retried. Invokes the
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // frontend's sync configure retry method.
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandleControlTypesDownloadRetry();
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Forwards a ProtocolEvent to the frontend.  Will not be called unless a
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // call to SetForwardProtocolEvents() explicitly requested that we start
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // forwarding these events.
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void HandleProtocolEventOnFrontendLoop(syncer::ProtocolEvent* event);
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SyncFrontend* frontend() { return frontend_; }
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend class SyncBackendHostCore;
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks if we have received a notice to turn on experimental datatypes
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // (via the nigori node) and informs the frontend if that is the case.
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Note: it is illegal to call this before the backend is initialized.
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void AddExperimentalTypes();
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Handles backend initialization failure.
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandleInitializationFailureOnFrontendLoop();
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Called from Core::OnSyncCycleCompleted to handle updating frontend
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // thread components.
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandleSyncCycleCompletedOnFrontendLoop(
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::sessions::SyncSessionSnapshot& snapshot);
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Called when the syncer failed to perform a configuration and will
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // eventually retry. FinishingConfigurationOnFrontendLoop(..) will be called
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // on successful completion.
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RetryConfigurationOnFrontendLoop(const base::Closure& retry_callback);
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Helpers to persist a token that can be used to bootstrap sync encryption
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // across browser restart to avoid requiring the user to re-enter their
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // passphrase.  |token| must be valid UTF-8 as we use the PrefService for
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // storage.
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void PersistEncryptionBootstrapToken(
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& token,
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::BootstrapTokenType token_type);
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // For convenience, checks if initialization state is INITIALIZED.
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool initialized() const { return initialized_; }
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Let the front end handle the actionable error event.
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandleActionableErrorEventOnFrontendLoop(
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::SyncProtocolError& sync_error);
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Handle a migration request.
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void HandleMigrationRequestedOnFrontendLoop(const syncer::ModelTypeSet types);
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Checks if |passphrase| can be used to decrypt the cryptographer's pending
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // keys that were cached during NotifyPassphraseRequired. Returns true if
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // decryption was successful. Returns false otherwise. Must be called with a
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // non-empty pending keys cache.
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool CheckPassphraseAgainstCachedPendingKeys(
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& passphrase) const;
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Invoked when a passphrase is required to decrypt a set of Nigori keys,
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // or for encrypting. |reason| denotes why the passphrase was required.
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |pending_keys| is a copy of the cryptographer's pending keys, that are
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // cached by the frontend. If there are no pending keys, or if the passphrase
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // required reason is REASON_ENCRYPTION, an empty EncryptedData object is
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // passed.
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void NotifyPassphraseRequired(syncer::PassphraseRequiredReason reason,
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                sync_pb::EncryptedData pending_keys);
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Invoked when the passphrase provided by the user has been accepted.
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void NotifyPassphraseAccepted();
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Invoked when the set of encrypted types or the encrypt
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // everything flag changes.
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void NotifyEncryptedTypesChanged(
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ModelTypeSet encrypted_types,
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      bool encrypt_everything);
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Invoked when sync finishes encrypting new datatypes.
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void NotifyEncryptionComplete();
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Invoked when the passphrase state has changed. Caches the passphrase state
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // for later use on the UI thread.
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If |type| is FROZEN_IMPLICIT_PASSPHRASE or CUSTOM_PASSPHRASE,
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |explicit_passphrase_time| is the time at which that passphrase was set
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // (if available).
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandlePassphraseTypeChangedOnFrontendLoop(
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::PassphraseType type,
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Time explicit_passphrase_time);
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandleStopSyncingPermanentlyOnFrontendLoop();
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Dispatched to from OnConnectionStatusChange to handle updating
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // frontend UI components.
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void HandleConnectionStatusChangeOnFrontendLoop(
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::ConnectionStatus status);
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // NotificationObserver implementation.
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void Observe(
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int type,
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const content::NotificationSource& source,
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const content::NotificationDetails& details) OVERRIDE;
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // InvalidationHandler implementation.
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnInvalidatorStateChange(
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      syncer::InvalidatorState state) OVERRIDE;
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnIncomingInvalidation(
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual std::string GetOwnerName() const OVERRIDE;
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::NotificationRegistrar notification_registrar_;
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // A reference to the MessageLoop used to construct |this|, so we know how
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // to safely talk back to the SyncFrontend.
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::MessageLoop* const frontend_loop_;
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* const profile_;
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Name used for debugging (set from profile_->GetDebugName()).
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const std::string name_;
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Our core, which communicates directly to the syncapi. Use refptr instead
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // of WeakHandle because |core_| is created on UI loop but released on
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // sync loop.
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<SyncBackendHostCore> core_;
289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool initialized_;
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
29223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  const base::WeakPtr<sync_driver::SyncPrefs> sync_prefs_;
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExtensionsActivityMonitor extensions_activity_monitor_;
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<SyncBackendRegistrar> registrar_;
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The frontend which we serve (and are owned by).
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SyncFrontend* frontend_;
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We cache the cryptographer's pending keys whenever NotifyPassphraseRequired
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // is called. This way, before the UI calls SetDecryptionPassphrase on the
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // syncer, it can avoid the overhead of an asynchronous decryption call and
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // give the user immediate feedback about the passphrase entered by first
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // trying to decrypt the cached pending keys on the UI thread. Note that
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // SetDecryptionPassphrase can still fail after the cached pending keys are
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // successfully decrypted if the pending keys have changed since the time they
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // were cached.
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  sync_pb::EncryptedData cached_pending_keys_;
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The state of the passphrase required to decrypt the bag of encryption keys
312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // in the nigori node. Updated whenever a new nigori node arrives or the user
313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // manually changes their passphrase state. Cached so we can synchronously
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // check it from the UI thread.
315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  syncer::PassphraseType cached_passphrase_type_;
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // If an explicit passphrase is in use, the time at which the passphrase was
318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // first set (if available).
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::Time cached_explicit_passphrase_time_;
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // UI-thread cache of the last SyncSessionSnapshot received from syncapi.
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  syncer::sessions::SyncSessionSnapshot last_snapshot_;
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  invalidation::InvalidationService* invalidator_;
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool invalidation_handler_registered_;
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtrFactory<SyncBackendHostImpl> weak_ptr_factory_;
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncBackendHostImpl);
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace browser_sync
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_GLUE_SYNC_BACKEND_HOST_IMPL_H_
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
336