• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2009 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 // This file declares the DebuggerRemoteServiceCommand struct and the
6 // DebuggerRemoteService class which handles commands directed to the
7 // "V8Debugger" tool.
8 #ifndef CHROME_BROWSER_DEBUGGER_DEBUGGER_REMOTE_SERVICE_H_
9 #define CHROME_BROWSER_DEBUGGER_DEBUGGER_REMOTE_SERVICE_H_
10 #pragma once
11 
12 #include <string>
13 
14 #include "base/basictypes.h"
15 #include "chrome/browser/debugger/devtools_remote.h"
16 
17 class DevToolsProtocolHandler;
18 class DevToolsRemoteMessage;
19 class DictionaryValue;
20 class Value;
21 class TabContents;
22 
23 // Contains constants for DebuggerRemoteService tool protocol commands
24 // (V8-related only).
25 struct DebuggerRemoteServiceCommand {
26   static const std::string kAttach;
27   static const std::string kDetach;
28   static const std::string kDebuggerCommand;
29   static const std::string kEvaluateJavascript;
30   static const std::string kFrameNavigate;  // navigation event
31   static const std::string kTabClosed;  // tab closing event
32 };
33 
34 // Handles V8 debugger-related messages from the remote debugger (like
35 // attach to V8 debugger, detach from V8 debugger, send command to V8 debugger)
36 // and proxies JSON messages from V8 debugger to the remote debugger.
37 class DebuggerRemoteService : public DevToolsRemoteListener {
38  public:
39   // |delegate| (never NULL) is the protocol handler instance
40   // which dispatches messages to this service. The responses from the
41   // V8 VM debugger are routed back to |delegate|.
42   // The ownership of |delegate| is NOT transferred to this class.
43   explicit DebuggerRemoteService(DevToolsProtocolHandler* delegate);
44 
45   // Handles a JSON message from the tab_uid-associated V8 debugger.
46   void DebuggerOutput(int32 tab_uid, const std::string& message);
47 
48   // Handles a frame navigation event.
49   void FrameNavigate(int32 tab_uid, const std::string& url);
50 
51   // Handles a tab closing event.
52   void TabClosed(int32 tab_uid);
53 
54   // Detaches the remote debugger from the tab specified by |destination|.
55   // It is public so that we can detach from the tab on the remote debugger
56   // connection loss.
57   // If |response| is not NULL, the operation result will be written
58   // as the "result" field in |response|, otherwise the result
59   // will not be propagated back to the caller.
60   void DetachFromTab(const std::string& destination,
61                      DictionaryValue* response);
62 
63   // DevToolsRemoteListener interface.
64 
65   // Processes |message| from the remote debugger, where the tool is
66   // "V8Debugger". Either sends the reply immediately or waits for an
67   // asynchronous response from the V8 debugger.
68   virtual void HandleMessage(const DevToolsRemoteMessage& message);
69 
70   // Gets invoked on the remote debugger [socket] connection loss.
71   // Notifies the InspectableTabProxy of the remote debugger detachment.
72   virtual void OnConnectionLost();
73 
74   // Specifies a tool name ("V8Debugger") handled by this class.
75   static const std::string kToolName;
76 
77  private:
78   // Operation result returned in the "result" field.
79   typedef enum {
80     RESULT_OK = 0,
81     RESULT_ILLEGAL_TAB_STATE,
82     RESULT_UNKNOWN_TAB,
83     RESULT_DEBUGGER_ERROR,
84     RESULT_UNKNOWN_COMMAND
85   } Result;
86 
87   virtual ~DebuggerRemoteService();
88 
89   // Attaches a remote debugger to the tab specified by |destination|.
90   // Writes the attachment result (one of Result enum values) into |response|.
91   void AttachToTab(const std::string& destination,
92                    DictionaryValue* response);
93 
94   // Retrieves a WebContents instance for the specified |tab_uid|
95   // or NULL if no such tab is found or no WebContents instance
96   // corresponds to that tab.
97   TabContents* ToTabContents(int32 tab_uid);
98 
99   // Sends a JSON message with the |response| to the remote debugger.
100   // |tool| and |destination| are used as the respective header values.
101   void SendResponse(const Value& response,
102                     const std::string& tool,
103                     const std::string& destination);
104 
105   // Redirects a V8 debugger command from |content| to a V8 debugger associated
106   // with the |tab_uid| and writes the result into |response| if it becomes
107   // known immediately.
108   bool DispatchDebuggerCommand(int tab_uid,
109                                DictionaryValue* content,
110                                DictionaryValue* response);
111 
112   // Redirects a Javascript evaluation command from |content| to
113   // a V8 debugger associated with the |tab_uid| and writes the result
114   // into |response| if it becomes known immediately.
115   bool DispatchEvaluateJavascript(int tab_uid,
116                                   DictionaryValue* content,
117                                   DictionaryValue* response);
118 
119   // The delegate is used to get an InspectableTabProxy instance.
120   DevToolsProtocolHandler* delegate_;
121   DISALLOW_COPY_AND_ASSIGN(DebuggerRemoteService);
122 };
123 
124 #endif  // CHROME_BROWSER_DEBUGGER_DEBUGGER_REMOTE_SERVICE_H_
125