blob: fc18b5be5a70fc5b7ccdf403f9f1c86f74eaa20b [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_COMPONENTS_WEBUI_SYNC_INTERNALS_SYNC_INTERNALS_MESSAGE_HANDLER_H_
#define IOS_COMPONENTS_WEBUI_SYNC_INTERNALS_SYNC_INTERNALS_MESSAGE_HANDLER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "components/sync/driver/sync_service_observer.h"
#include "components/sync/engine/events/protocol_event_observer.h"
#include "components/sync/js/js_controller.h"
#include "components/sync/js/js_event_handler.h"
#include "ios/web/public/webui/web_ui_ios_message_handler.h"
namespace syncer {
class SyncService;
struct TypeEntitiesCount;
} // namespace syncer
// The implementation for the chrome://sync-internals page.
class SyncInternalsMessageHandler : public web::WebUIIOSMessageHandler,
public syncer::JsEventHandler,
public syncer::SyncServiceObserver,
public syncer::ProtocolEventObserver {
public:
SyncInternalsMessageHandler();
~SyncInternalsMessageHandler() override;
void RegisterMessages() override;
// Fires an event to send updated data to the About page and registers
// observers to notify the page upon updates.
void HandleRequestDataAndRegisterForUpdates(const base::ListValue* args);
// Fires an event to send the list of types back to the page.
void HandleRequestListOfTypes(const base::ListValue* args);
// Fires an event to send the initial state of the "include specifics" flag.
void HandleRequestIncludeSpecificsInitialState(const base::ListValue* args);
// Handler for getAllNodes message. Needs a |request_id| argument.
void HandleGetAllNodes(const base::ListValue* args);
// Handler for setting internal state of if specifics should be included in
// protocol events when sent to be displayed.
void HandleSetIncludeSpecifics(const base::ListValue* args);
// Handler for requestStart message.
void HandleRequestStart(const base::ListValue* args);
// Handler for requestStopKeepData message.
void HandleRequestStopKeepData(const base::ListValue* args);
// Handler for requestStopClearData message.
void HandleRequestStopClearData(const base::ListValue* args);
// Handler for triggerRefresh message.
void HandleTriggerRefresh(const base::ListValue* args);
// syncer::JsEventHandler implementation.
void HandleJsEvent(const std::string& name,
const syncer::JsEventDetails& details) override;
// Callback used in GetAllNodes.
void OnReceivedAllNodes(const std::string& callback_id,
std::unique_ptr<base::ListValue> nodes);
// syncer::SyncServiceObserver implementation.
void OnStateChanged(syncer::SyncService* sync) override;
// ProtocolEventObserver implementation.
void OnProtocolEvent(const syncer::ProtocolEvent& e) override;
private:
// Synchronously fetches updated aboutInfo and sends it to the page in the
// form of an onAboutInfoUpdated event. The entity counts for each data type
// are retrieved asynchronously and sent via an onEntityCountsUpdated event
// once they are retrieved.
void SendAboutInfoAndEntityCounts();
void OnGotEntityCounts(
const std::vector<syncer::TypeEntitiesCount>& entity_counts);
syncer::SyncService* GetSyncService();
void DispatchEvent(const std::string& name, const base::Value& details_value);
base::WeakPtr<syncer::JsController> js_controller_;
// A flag used to prevent double-registration with ProfileSyncService.
bool is_registered_ = false;
// Whether specifics should be included when converting protocol events to a
// human readable format.
bool include_specifics_ = false;
base::WeakPtrFactory<SyncInternalsMessageHandler> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(SyncInternalsMessageHandler);
};
#endif // IOS_COMPONENTS_WEBUI_SYNC_INTERNALS_SYNC_INTERNALS_MESSAGE_HANDLER_H_