blob: bdc0a41c758fb4a7d8ca85bbe224197ab96eabd6 [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_DRIVER_GLUE_SYNC_ENGINE_IMPL_H_
#define COMPONENTS_SYNC_DRIVER_GLUE_SYNC_ENGINE_IMPL_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "components/invalidation/public/invalidation_handler.h"
#include "components/sync/base/extensions_activity.h"
#include "components/sync/base/model_type.h"
#include "components/sync/engine/configure_reason.h"
#include "components/sync/engine/connection_status.h"
#include "components/sync/engine/cycle/sync_cycle_snapshot.h"
#include "components/sync/engine/model_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 invalidation {
class InvalidationService;
} // namespace invalidation
namespace syncer {
class ActiveDevicesProvider;
class ModelTypeConnector;
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.
class SyncEngineImpl : public SyncEngine,
public invalidation::InvalidationHandler,
public InvalidationsListener,
public FCMRegistrationTokenObserver {
public:
using Status = SyncStatus;
// |sync_invalidations_service| must not be null.
SyncEngineImpl(const std::string& name,
invalidation::InvalidationService* invalidator,
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,
const base::RepeatingClosure& sync_transport_data_cleared_cb);
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 ModelTypeSet& 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(ModelType type,
std::unique_ptr<DataTypeActivationResponse>) override;
void DisconnectDataType(ModelType type) override;
void SetProxyTabsDatatypeEnabled(bool enabled) override;
const Status& GetDetailedStatus() const override;
void HasUnsyncedItemsForTest(
base::OnceCallback<void(bool)> cb) const override;
void GetThrottledDataTypesForTest(
base::OnceCallback<void(ModelTypeSet)> cb) const override;
void RequestBufferedProtocolEventsAndEnableForwarding() override;
void DisableProtocolEventForwarding() override;
void OnCookieJarChanged(bool account_mismatch,
base::OnceClosure callback) override;
void SetInvalidationsForSessionsEnabled(bool enabled) override;
void GetNigoriNodeForDebugging(AllNodesCallback callback) override;
// InvalidationHandler implementation.
void OnInvalidatorStateChange(invalidation::InvalidatorState state) override;
void OnIncomingInvalidation(
const invalidation::TopicInvalidationMap& invalidation_map) override;
std::string GetOwnerName() const override;
void OnInvalidatorClientIdChange(const std::string& client_id) 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 ModelTypeSet 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.
//
// |model_type_connector| is our ModelTypeConnector, which is owned because in
// production it is a proxy object to the real ModelTypeConnector.
void HandleInitializationSuccessOnFrontendLoop(
std::unique_ptr<ModelTypeConnector> model_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 thread 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 ModelTypeSet types);
// Dispatched to from OnConnectionStatusChange to handle updating
// frontend UI components.
void HandleConnectionStatusChangeOnFrontendLoop(ConnectionStatus status);
void OnCookieJarChangedDoneOnFrontendLoop(base::OnceClosure callback);
void SendInterestedTopicsToInvalidator();
// 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();
// Helper function that clears SyncTransportDataPrefs and also notifies
// upper layers via |sync_transport_data_cleared_cb_|.
void ClearLocalTransportDataAndNotify();
// Updates the current state of standalone invalidations.
void UpdateStandaloneInvalidationsState();
// 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_;
const base::RepeatingClosure sync_transport_data_cleared_cb_;
// Our backend, which communicates directly to the syncapi. Use refptr instead
// of WeakHandle because |backend_| is created on UI loop but released on
// sync loop.
scoped_refptr<SyncEngineBackend> backend_;
// 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<ModelTypeConnector> model_type_connector_;
bool initialized_ = false;
// The host which we serve (and are owned by). Set in Initialize() and nulled
// out in StopSyncingForShutdown().
// DanglingUntriaged because it is assigned a DanglingUntriaged pointer.
raw_ptr<SyncEngineHost, DanglingUntriaged> host_ = nullptr;
raw_ptr<invalidation::InvalidationService> invalidator_ = nullptr;
bool invalidation_handler_registered_ = false;
raw_ptr<SyncInvalidationsService> sync_invalidations_service_ = nullptr;
ModelTypeSet last_enabled_types_;
bool sessions_invalidation_enabled_;
SyncStatus cached_status_;
std::unique_ptr<ActiveDevicesProvider> active_devices_provider_;
// Checks that we're on the same thread this was constructed on (UI thread).
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<SyncEngineImpl> weak_ptr_factory_{this};
};
} // namespace syncer
#endif // COMPONENTS_SYNC_DRIVER_GLUE_SYNC_ENGINE_IMPL_H_