blob: febe92e16317a61837ac0a96d4cfd4262fb5c77d [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SYNC_SERVICE_GLUE_SYNC_ENGINE_IMPL_H_
#define COMPONENTS_SYNC_SERVICE_GLUE_SYNC_ENGINE_IMPL_H_
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "components/sync/base/data_type.h"
#include "components/sync/engine/connection_status.h"
#include "components/sync/engine/cycle/sync_cycle_snapshot.h"
#include "components/sync/engine/data_type_configurer.h"
#include "components/sync/engine/sync_credentials.h"
#include "components/sync/engine/sync_engine.h"
#include "components/sync/engine/sync_status.h"
#include "components/sync/invalidations/fcm_registration_token_observer.h"
#include "components/sync/invalidations/invalidations_listener.h"
namespace syncer {
class ActiveDevicesProvider;
class DataTypeConnector;
class ProtocolEvent;
class SyncEngineBackend;
class SyncInvalidationsService;
struct SyncProtocolError;
class SyncTransportDataPrefs;
// The only real implementation of the SyncEngine. See that interface's
// definition for documentation of public methods.
// Lives on the UI thread, and handles task-posting to SyncEngineBackend on
// the sync sequence as necessary.
class SyncEngineImpl : public SyncEngine,
public InvalidationsListener,
public FCMRegistrationTokenObserver {
public:
// `sync_invalidations_service` must not be null.
SyncEngineImpl(const std::string& name,
SyncInvalidationsService* sync_invalidations_service,
std::unique_ptr<ActiveDevicesProvider> active_devices_provider,
std::unique_ptr<SyncTransportDataPrefs> prefs,
const base::FilePath& sync_data_folder,
scoped_refptr<base::SequencedTaskRunner> sync_task_runner);
SyncEngineImpl(const SyncEngineImpl&) = delete;
SyncEngineImpl& operator=(const SyncEngineImpl&) = delete;
~SyncEngineImpl() override;
// SyncEngine implementation.
void Initialize(InitParams params) override;
bool IsInitialized() const override;
void TriggerRefresh(const DataTypeSet& types) override;
void UpdateCredentials(const SyncCredentials& credentials) override;
void InvalidateCredentials() override;
std::string GetCacheGuid() const override;
std::string GetBirthday() const override;
base::Time GetLastSyncedTimeForDebugging() const override;
void StartConfiguration() override;
void StartSyncingWithServer() override;
void StartHandlingInvalidations() override;
void SetEncryptionPassphrase(
const std::string& passphrase,
const KeyDerivationParams& key_derivation_params) override;
void SetExplicitPassphraseDecryptionKey(std::unique_ptr<Nigori> key) override;
void AddTrustedVaultDecryptionKeys(
const std::vector<std::vector<uint8_t>>& keys,
base::OnceClosure done_cb) override;
void StopSyncingForShutdown() override;
void Shutdown(ShutdownReason reason) override;
void ConfigureDataTypes(ConfigureParams params) override;
void ConnectDataType(DataType type,
std::unique_ptr<DataTypeActivationResponse>) override;
void DisconnectDataType(DataType type) override;
const SyncStatus& GetDetailedStatus() const override;
void HasUnsyncedItemsForTest(
base::OnceCallback<void(bool)> cb) const override;
void GetThrottledDataTypesForTest(
base::OnceCallback<void(DataTypeSet)> cb) const override;
void RequestBufferedProtocolEventsAndEnableForwarding() override;
void DisableProtocolEventForwarding() override;
void OnCookieJarChanged(bool account_mismatch,
base::OnceClosure callback) override;
bool IsNextPollTimeInThePast() const override;
void ClearNigoriDataForMigration() override;
void GetNigoriNodeForDebugging(AllNodesCallback callback) override;
void RecordNigoriMemoryUsageAndCountsHistograms() override;
// InvalidationsListener implementation.
void OnInvalidationReceived(const std::string& payload) override;
// FCMRegistrationTokenObserver implementation.
void OnFCMRegistrationTokenChanged() override;
static std::string GenerateCacheGUIDForTest();
private:
friend class SyncEngineBackend;
// Called when the syncer has finished performing a configuration.
void FinishConfigureDataTypesOnFrontendLoop(const DataTypeSet enabled_types,
base::OnceClosure ready_task);
// Reports backend initialization success. Includes some objects from sync
// manager initialization to be passed back to the UI thread.
//
// `data_type_connector` is our DataTypeConnector, which is owned because in
// production it is a proxy object to the real DataTypeConnector.
void HandleInitializationSuccessOnFrontendLoop(
std::unique_ptr<DataTypeConnector> data_type_connector,
const std::string& birthday,
const std::string& bag_of_chips);
// Forwards a ProtocolEvent to the host. Will not be called unless a call to
// SetForwardProtocolEvents() explicitly requested that we start forwarding
// these events.
void HandleProtocolEventOnFrontendLoop(std::unique_ptr<ProtocolEvent> event);
void HandleSyncStatusChanged(const SyncStatus& status);
// Handles backend initialization failure.
void HandleInitializationFailureOnFrontendLoop();
// Called from SyncEngineBackend::OnSyncCycleCompleted to handle updating
// frontend sequence components.
void HandleSyncCycleCompletedOnFrontendLoop(
const SyncCycleSnapshot& snapshot);
// Let the front end handle the actionable error event.
void HandleActionableProtocolErrorEventOnFrontendLoop(
const SyncProtocolError& sync_error);
// Handle a migration request.
void HandleMigrationRequestedOnFrontendLoop(const DataTypeSet types);
// Dispatched to from OnConnectionStatusChange to handle updating
// frontend UI components.
void HandleConnectionStatusChangeOnFrontendLoop(ConnectionStatus status);
void OnCookieJarChangedDoneOnFrontendLoop(base::OnceClosure callback);
// Called on each device infos change and might be called more than once with
// the same `active_devices`.
void OnActiveDevicesChanged();
// Sets the last synced time to the current time.
void UpdateLastSyncedTime();
// Updates the current state of standalone invalidations. Note that the
// invalidations can be handled even if the invalidation service is not fully
// initialized yet (e.g. while processing the incoming queue of messages
// received during browser startup).
void UpdateStandaloneInvalidationsState();
// Updates invalidator's state.
void OnInvalidatorStateChange(bool enabled);
// The task runner where all the sync engine operations happen.
scoped_refptr<base::SequencedTaskRunner> sync_task_runner_;
// Name used for debugging (set from profile_->GetDebugName()).
const std::string name_;
const std::unique_ptr<SyncTransportDataPrefs> prefs_;
// The cache GUID and birthday are stored in prefs, but also cached in memory.
// This is because in some cases (when an account gets removed from the
// device), the prefs can get cleared before the SyncEngine is destroyed.
std::string cached_cache_guid_;
std::string cached_birthday_;
raw_ptr<SyncInvalidationsService> sync_invalidations_service_ = nullptr;
// Our backend, which communicates directly to the syncapi. Use refptr instead
// of WeakHandle because `backend_` is created on the UI thread but released
// on the sync sequence.
scoped_refptr<SyncEngineBackend> backend_;
// The host which we serve (and are owned by). Set in Initialize() and nulled
// out in StopSyncingForShutdown().
raw_ptr<SyncEngineHost> host_ = nullptr;
bool initialized_ = false;
// A handle referencing the main interface for sync data types. This
// object is owned because in production code it is a proxy object.
std::unique_ptr<DataTypeConnector> data_type_connector_;
DataTypeSet last_enabled_types_;
SyncStatus cached_status_;
std::unique_ptr<ActiveDevicesProvider> active_devices_provider_;
// Time when current object has been created. Used for metrics only.
const base::TimeTicks engine_created_time_for_metrics_;
// Whether the histogram for enabled invalidations has been already recorded.
// This is used to record only the first "invalidatons enabled" event,
// otherwise the metrics would be skewed by invalidations disabling and
// re-enabling.
bool invalidations_enabled_reported_ = false;
// Checks that we're on the same sequence this was constructed on (UI
// sequence).
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<SyncEngineImpl> weak_ptr_factory_{this};
};
} // namespace syncer
#endif // COMPONENTS_SYNC_SERVICE_GLUE_SYNC_ENGINE_IMPL_H_