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