// 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_