#ifndef COMPONENTS_BROWSER_SYNC_SYNC_INTERNALS_MESSAGE_HANDLER_H_
#define COMPONENTS_BROWSER_SYNC_SYNC_INTERNALS_MESSAGE_HANDLER_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/span.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "base/scoped_observation_traits.h"
#include "base/values.h"
#include "components/sync/engine/events/protocol_event_observer.h"
#include "components/sync/invalidations/invalidations_listener.h"
#include "components/sync/invalidations/sync_invalidations_service.h"
#include "components/sync/service/sync_service.h"
#include "components/sync/service/sync_service_observer.h"
namespace signin {
class IdentityManager;
}
namespace syncer {
class UserEventService;
struct TypeEntitiesCount;
}
namespace browser_sync {
class SyncInternalsMessageHandler : public syncer::SyncServiceObserver,
public syncer::ProtocolEventObserver,
public syncer::InvalidationsListener {
public:
class Delegate {
public:
virtual ~Delegate() = default;
virtual void SendEventToPage(std::string_view event_name,
base::span<const base::ValueView> args) = 0;
virtual void ResolvePageCallback(const base::ValueView callback_id,
const base::ValueView response) = 0;
};
using PageMessageHandler =
base::RepeatingCallback<void(const base::Value::List&)>;
using GetAboutSyncDataCb =
base::RepeatingCallback<base::Value::Dict(syncer::SyncService* service,
const std::string& channel)>;
SyncInternalsMessageHandler(
Delegate* delegate,
signin::IdentityManager* identity_manager,
syncer::SyncService* sync_service,
syncer::SyncInvalidationsService* sync_invalidations_service,
syncer::UserEventService* user_event_service,
const std::string& channel);
SyncInternalsMessageHandler(
Delegate* delegate,
GetAboutSyncDataCb get_about_sync_data_cb,
signin::IdentityManager* identity_manager,
syncer::SyncService* sync_service,
syncer::SyncInvalidationsService* sync_invalidations_service,
syncer::UserEventService* user_event_service,
const std::string& channel);
SyncInternalsMessageHandler(const SyncInternalsMessageHandler&) = delete;
SyncInternalsMessageHandler& operator=(const SyncInternalsMessageHandler&) =
delete;
~SyncInternalsMessageHandler() override;
base::flat_map<std::string, PageMessageHandler> GetMessageHandlerMap();
void DisableMessagesToPage();
private:
void SendAboutInfoAndEntityCounts();
void OnGotEntityCounts(const syncer::TypeEntitiesCount& entity_counts);
void HandleRequestDataAndRegisterForUpdates(const base::Value::List& args);
void HandleRequestListOfTypes(const base::Value::List& args);
void HandleRequestIncludeSpecificsInitialState(const base::Value::List& args);
void HandleGetAllNodes(const base::Value::List& args);
void HandleSetIncludeSpecifics(const base::Value::List& args);
void HandleWriteUserEvent(const base::Value::List& args);
void HandleRequestStart(const base::Value::List& args);
void HandleTriggerRefresh(const base::Value::List& args);
void OnReceivedAllNodes(const std::string& callback_id,
base::Value::List nodes);
void OnStateChanged(syncer::SyncService* sync) override;
void OnSyncShutdown(syncer::SyncService* sync) override;
void OnProtocolEvent(const syncer::ProtocolEvent& e) override;
void OnInvalidationReceived(const std::string& payload) override;
base::ScopedObservation<syncer::SyncService, syncer::SyncServiceObserver>
sync_service_observation_{this};
base::ScopedObservation<syncer::SyncService, syncer::ProtocolEventObserver>
protocol_event_observation_{this};
base::ScopedObservation<syncer::SyncInvalidationsService,
syncer::InvalidationsListener>
invalidations_observation_{this};
bool include_specifics_ = false;
const raw_ptr<Delegate> delegate_;
const GetAboutSyncDataCb get_about_sync_data_cb_;
const raw_ptr<signin::IdentityManager> identity_manager_;
const raw_ptr<syncer::SyncService> sync_service_;
const raw_ptr<syncer::SyncInvalidationsService> sync_invalidations_service_;
const raw_ptr<syncer::UserEventService> user_event_service_;
const std::string channel_;
base::WeakPtrFactory<SyncInternalsMessageHandler> weak_ptr_factory_{this};
};
}
namespace base {
template <>
struct ScopedObservationTraits<syncer::SyncService,
syncer::ProtocolEventObserver> {
static void AddObserver(syncer::SyncService* source,
syncer::ProtocolEventObserver* observer) {
source->AddProtocolEventObserver(observer);
}
static void RemoveObserver(syncer::SyncService* source,
syncer::ProtocolEventObserver* observer) {
source->RemoveProtocolEventObserver(observer);
}
};
template <>
struct ScopedObservationTraits<syncer::SyncInvalidationsService,
syncer::InvalidationsListener> {
static void AddObserver(syncer::SyncInvalidationsService* source,
syncer::InvalidationsListener* observer) {
source->AddListener(observer);
}
static void RemoveObserver(syncer::SyncInvalidationsService* source,
syncer::InvalidationsListener* observer) {
source->RemoveListener(observer);
}
};
}
#endif