summaryrefslogtreecommitdiffstats
path: root/webkit/glue/devtools/debugger_agent_manager.h
blob: 8eb458cdbe0a13bbdab6334f5f78e00c6f8b9047 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright (c) 2009 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 WEBKIT_GLUE_DEVTOOLS_DEBUGGER_AGENT_MANAGER_H_
#define WEBKIT_GLUE_DEVTOOLS_DEBUGGER_AGENT_MANAGER_H_

#include <wtf/HashMap.h>
#include <wtf/HashSet.h>

#include "base/basictypes.h"
#include "v8/include/v8-debug.h"
#include "webkit/glue/webdevtoolsagent.h"

class DebuggerAgentImpl;
class DictionaryValue;

// There is single v8 instance per render process. Also there may be several
// RenderViews and consequently devtools agents in the process that want to talk
// to the v8 debugger. This class coordinates communication between the debug
// agents and v8 debugger. It will set debug output handler as long as at least
// one debugger agent is attached and remove it when last debugger agent is
// detached. When message is received from debugger it will route it to the
// right debugger agent if there is one otherwise the message will be ignored.
//
// TODO(yurys): v8 may send a message(e.g. exception event) after which it
// would expect some actions from the handler. If there is no appropriate
// debugger agent to handle such messages the manager should perform the action
// itself, otherwise v8 may hang waiting for the action.
//
// TODO(yurys): disable plugin message handling while v8 is paused on a
// breakpoint.
class DebuggerAgentManager {
 public:
  static void DebugAttach(DebuggerAgentImpl* debugger_agent);
  static void DebugDetach(DebuggerAgentImpl* debugger_agent);
  static void DebugBreak(DebuggerAgentImpl* debugger_agent);
  static void DebugCommand(const std::string& command);

  static void ExecuteDebuggerCommand(const std::string& command,
                                     int caller_id);
  static void SetMessageLoopDispatchHandler(
      WebDevToolsAgent::MessageLoopDispatchHandler handler);

 private:
  DebuggerAgentManager();
  ~DebuggerAgentManager();

  static void V8DebugMessageHandler(const uint16_t* message,
                                    int length,
                                    v8::Debug::ClientData* data);
  static void V8DebugHostDispatchHandler();
  static void DebuggerOutput(const std::string& out,
                             v8::Debug::ClientData* caller_data);
  static void SendCommandToV8(const std::wstring& cmd,
                              v8::Debug::ClientData* data);

  static DebuggerAgentImpl* FindAgentForCurrentV8Context();
  static DebuggerAgentImpl* FindDebuggerAgentForToolsAgent(
      int caller_id);

  typedef HashSet<DebuggerAgentImpl*> AttachedAgentsSet;
  static AttachedAgentsSet* attached_agents_;

  static WebDevToolsAgent::MessageLoopDispatchHandler
      message_loop_dispatch_handler_;

  DISALLOW_COPY_AND_ASSIGN(DebuggerAgentManager);
};

#endif  // WEBKIT_GLUE_DEVTOOLS_DEBUGGER_AGENT_MANAGER_H_