1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_WEBUI_SYNC_INTERNALS_MESSAGE_HANDLER_H_
6#define CHROME_BROWSER_UI_WEBUI_SYNC_INTERNALS_MESSAGE_HANDLER_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/memory/weak_ptr.h"
13#include "base/scoped_observer.h"
14#include "base/values.h"
15#include "chrome/browser/sync/profile_sync_service_observer.h"
16#include "chrome/browser/sync/protocol_event_observer.h"
17#include "content/public/browser/web_ui_message_handler.h"
18#include "sync/internal_api/public/sessions/type_debug_info_observer.h"
19#include "sync/js/js_controller.h"
20#include "sync/js/js_event_handler.h"
21
22class ProfileSyncService;
23
24// The implementation for the chrome://sync-internals page.
25class SyncInternalsMessageHandler : public content::WebUIMessageHandler,
26                                    public syncer::JsEventHandler,
27                                    public ProfileSyncServiceObserver,
28                                    public browser_sync::ProtocolEventObserver,
29                                    public syncer::TypeDebugInfoObserver {
30 public:
31  SyncInternalsMessageHandler();
32  virtual ~SyncInternalsMessageHandler();
33
34  virtual void RegisterMessages() OVERRIDE;
35
36  // Sets up observers to receive events and forward them to the UI.
37  void HandleRegisterForEvents(const base::ListValue* args);
38
39  // Sets up observers to receive per-type counters and forward them to the UI.
40  void HandleRegisterForPerTypeCounters(const base::ListValue* args);
41
42  // Fires an event to send updated info back to the page.
43  void HandleRequestUpdatedAboutInfo(const base::ListValue* args);
44
45  // Fires and event to send the list of types back to the page.
46  void HandleRequestListOfTypes(const base::ListValue* args);
47
48  // Handler for getAllNodes message.  Needs a |request_id| argument.
49  void HandleGetAllNodes(const base::ListValue* args);
50
51  // syncer::JsEventHandler implementation.
52  virtual void HandleJsEvent(
53      const std::string& name,
54      const syncer::JsEventDetails& details) OVERRIDE;
55
56  // Callback used in GetAllNodes.
57  void OnReceivedAllNodes(int request_id, scoped_ptr<base::ListValue> nodes);
58
59  // ProfileSyncServiceObserver implementation.
60  virtual void OnStateChanged() OVERRIDE;
61
62  // ProtocolEventObserver implementation.
63  virtual void OnProtocolEvent(const syncer::ProtocolEvent& e) OVERRIDE;
64
65  // TypeDebugInfoObserver implementation.
66  virtual void OnCommitCountersUpdated(
67      syncer::ModelType type,
68      const syncer::CommitCounters& counters) OVERRIDE;
69  virtual void OnUpdateCountersUpdated(
70      syncer::ModelType type,
71      const syncer::UpdateCounters& counters) OVERRIDE;
72  virtual void OnStatusCountersUpdated(
73      syncer::ModelType type,
74      const syncer::StatusCounters& counters) OVERRIDE;
75
76  // Helper to emit counter updates.
77  //
78  // Used in implementation of On*CounterUpdated methods.  Emits the given
79  // dictionary value with additional data to specify the model type and
80  // counter type.
81  void EmitCounterUpdate(syncer::ModelType type,
82                         const std::string& counter_type,
83                         scoped_ptr<base::DictionaryValue> value);
84
85 private:
86  // Fetches updated aboutInfo and sends it to the page in the form of an
87  // onAboutInfoUpdated event.
88  void SendAboutInfo();
89
90  ProfileSyncService* GetProfileSyncService();
91
92  base::WeakPtr<syncer::JsController> js_controller_;
93
94  // A flag used to prevent double-registration with ProfileSyncService.
95  bool is_registered_;
96
97  // A flag used to prevent double-registration as TypeDebugInfoObserver with
98  // ProfileSyncService.
99  bool is_registered_for_counters_;
100
101  base::WeakPtrFactory<SyncInternalsMessageHandler> weak_ptr_factory_;
102
103  DISALLOW_COPY_AND_ASSIGN(SyncInternalsMessageHandler);
104};
105
106#endif  // CHROME_BROWSER_UI_WEBUI_SYNC_INTERNALS_MESSAGE_HANDLER_H_
107