// 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. // This file declares the DebuggerRemoteServiceCommand struct and the // DebuggerRemoteService class which handles commands directed to the // "V8Debugger" tool. #ifndef CHROME_BROWSER_DEBUGGER_DEBUGGER_REMOTE_SERVICE_H_ #define CHROME_BROWSER_DEBUGGER_DEBUGGER_REMOTE_SERVICE_H_ #pragma once #include <string> #include "base/basictypes.h" #include "chrome/browser/debugger/devtools_remote.h" class DevToolsProtocolHandler; class DevToolsRemoteMessage; class DictionaryValue; class Value; class TabContents; // Contains constants for DebuggerRemoteService tool protocol commands // (V8-related only). struct DebuggerRemoteServiceCommand { static const std::string kAttach; static const std::string kDetach; static const std::string kDebuggerCommand; static const std::string kEvaluateJavascript; static const std::string kFrameNavigate; // navigation event static const std::string kTabClosed; // tab closing event }; // Handles V8 debugger-related messages from the remote debugger (like // attach to V8 debugger, detach from V8 debugger, send command to V8 debugger) // and proxies JSON messages from V8 debugger to the remote debugger. class DebuggerRemoteService : public DevToolsRemoteListener { public: // |delegate| (never NULL) is the protocol handler instance // which dispatches messages to this service. The responses from the // V8 VM debugger are routed back to |delegate|. // The ownership of |delegate| is NOT transferred to this class. explicit DebuggerRemoteService(DevToolsProtocolHandler* delegate); // Handles a JSON message from the tab_uid-associated V8 debugger. void DebuggerOutput(int32 tab_uid, const std::string& message); // Handles a frame navigation event. void FrameNavigate(int32 tab_uid, const std::string& url); // Handles a tab closing event. void TabClosed(int32 tab_uid); // Detaches the remote debugger from the tab specified by |destination|. // It is public so that we can detach from the tab on the remote debugger // connection loss. // If |response| is not NULL, the operation result will be written // as the "result" field in |response|, otherwise the result // will not be propagated back to the caller. void DetachFromTab(const std::string& destination, DictionaryValue* response); // DevToolsRemoteListener interface. // Processes |message| from the remote debugger, where the tool is // "V8Debugger". Either sends the reply immediately or waits for an // asynchronous response from the V8 debugger. virtual void HandleMessage(const DevToolsRemoteMessage& message); // Gets invoked on the remote debugger [socket] connection loss. // Notifies the InspectableTabProxy of the remote debugger detachment. virtual void OnConnectionLost(); // Specifies a tool name ("V8Debugger") handled by this class. static const std::string kToolName; private: // Operation result returned in the "result" field. typedef enum { RESULT_OK = 0, RESULT_ILLEGAL_TAB_STATE, RESULT_UNKNOWN_TAB, RESULT_DEBUGGER_ERROR, RESULT_UNKNOWN_COMMAND } Result; virtual ~DebuggerRemoteService(); // Attaches a remote debugger to the tab specified by |destination|. // Writes the attachment result (one of Result enum values) into |response|. void AttachToTab(const std::string& destination, DictionaryValue* response); // Retrieves a WebContents instance for the specified |tab_uid| // or NULL if no such tab is found or no WebContents instance // corresponds to that tab. TabContents* ToTabContents(int32 tab_uid); // Sends a JSON message with the |response| to the remote debugger. // |tool| and |destination| are used as the respective header values. void SendResponse(const Value& response, const std::string& tool, const std::string& destination); // Redirects a V8 debugger command from |content| to a V8 debugger associated // with the |tab_uid| and writes the result into |response| if it becomes // known immediately. bool DispatchDebuggerCommand(int tab_uid, DictionaryValue* content, DictionaryValue* response); // Redirects a Javascript evaluation command from |content| to // a V8 debugger associated with the |tab_uid| and writes the result // into |response| if it becomes known immediately. bool DispatchEvaluateJavascript(int tab_uid, DictionaryValue* content, DictionaryValue* response); // The delegate is used to get an InspectableTabProxy instance. DevToolsProtocolHandler* delegate_; DISALLOW_COPY_AND_ASSIGN(DebuggerRemoteService); }; #endif // CHROME_BROWSER_DEBUGGER_DEBUGGER_REMOTE_SERVICE_H_