| Index: chrome/browser/debugger/debugger_remote_service.cc
|
| diff --git a/chrome/browser/debugger/debugger_remote_service.cc b/chrome/browser/debugger/debugger_remote_service.cc
|
| deleted file mode 100644
|
| index 9d4aec7e69c64eea2b27a9231516009b53b25c60..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/debugger/debugger_remote_service.cc
|
| +++ /dev/null
|
| @@ -1,335 +0,0 @@
|
| -// Copyright (c) 2011 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 contains implementations of the DebuggerRemoteService methods,
|
| -// defines DebuggerRemoteService and DebuggerRemoteServiceCommand constants.
|
| -
|
| -#include "chrome/browser/debugger/debugger_remote_service.h"
|
| -
|
| -#include "base/json/json_reader.h"
|
| -#include "base/json/json_writer.h"
|
| -#include "base/stringprintf.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/debugger/devtools_protocol_handler.h"
|
| -#include "chrome/browser/debugger/devtools_remote_message.h"
|
| -#include "chrome/browser/debugger/inspectable_tab_proxy.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| -#include "chrome/common/render_messages.h"
|
| -#include "content/browser/debugger/devtools_manager.h"
|
| -#include "content/browser/renderer_host/render_view_host.h"
|
| -#include "content/browser/tab_contents/tab_contents.h"
|
| -#include "content/common/devtools_messages.h"
|
| -
|
| -namespace {
|
| -
|
| -// Constants for the "data", "result", and "command" JSON message fields.
|
| -const char kDataKey[] = "data";
|
| -const char kResultKey[] = "result";
|
| -const char kCommandKey[] = "command";
|
| -
|
| -} // namespace
|
| -
|
| -const char DebuggerRemoteServiceCommand::kAttach[] = "attach";
|
| -const char DebuggerRemoteServiceCommand::kDetach[] = "detach";
|
| -const char DebuggerRemoteServiceCommand::kDebuggerCommand[] =
|
| - "debugger_command";
|
| -const char DebuggerRemoteServiceCommand::kEvaluateJavascript[] =
|
| - "evaluate_javascript";
|
| -const char DebuggerRemoteServiceCommand::kFrameNavigate[] = "navigated";
|
| -const char DebuggerRemoteServiceCommand::kTabClosed[] = "closed";
|
| -
|
| -const char DebuggerRemoteService::kToolName[] = "V8Debugger";
|
| -
|
| -DebuggerRemoteService::DebuggerRemoteService(DevToolsProtocolHandler* delegate)
|
| - : delegate_(delegate) {}
|
| -
|
| -DebuggerRemoteService::~DebuggerRemoteService() {}
|
| -
|
| -// This method handles the V8Debugger tool commands which are
|
| -// retrieved from the request "command" field. If an operation result
|
| -// is ready off-hand (synchronously), it is sent back to the remote debugger.
|
| -// Otherwise the corresponding response is received through IPC from the
|
| -// V8 debugger via DevToolsClientHost.
|
| -void DebuggerRemoteService::HandleMessage(
|
| - const DevToolsRemoteMessage& message) {
|
| - const std::string destination = message.destination();
|
| - scoped_ptr<Value> request(base::JSONReader::Read(message.content(), true));
|
| - if (request.get() == NULL) {
|
| - // Bad JSON
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| - DictionaryValue* content;
|
| - if (!request->IsType(Value::TYPE_DICTIONARY)) {
|
| - NOTREACHED(); // Broken protocol :(
|
| - return;
|
| - }
|
| - content = static_cast<DictionaryValue*>(request.get());
|
| - if (!content->HasKey(kCommandKey)) {
|
| - NOTREACHED(); // Broken protocol :(
|
| - return;
|
| - }
|
| - std::string command;
|
| - DictionaryValue response;
|
| -
|
| - content->GetString(kCommandKey, &command);
|
| - response.SetString(kCommandKey, command);
|
| - bool send_response = true;
|
| - if (destination.empty()) {
|
| - // Unknown command (bad format?)
|
| - NOTREACHED();
|
| - response.SetInteger(kResultKey, RESULT_UNKNOWN_COMMAND);
|
| - SendResponse(response, message.tool(), message.destination());
|
| - return;
|
| - }
|
| - int32 tab_uid = -1;
|
| - base::StringToInt(destination, &tab_uid);
|
| -
|
| - if (command == DebuggerRemoteServiceCommand::kAttach) {
|
| - // TODO(apavlov): handle 0 for a new tab
|
| - response.SetString(kCommandKey, DebuggerRemoteServiceCommand::kAttach);
|
| - AttachToTab(destination, &response);
|
| - } else if (command == DebuggerRemoteServiceCommand::kDetach) {
|
| - response.SetString(kCommandKey, DebuggerRemoteServiceCommand::kDetach);
|
| - DetachFromTab(destination, &response);
|
| - } else if (command == DebuggerRemoteServiceCommand::kDebuggerCommand) {
|
| - send_response = DispatchDebuggerCommand(tab_uid, content, &response);
|
| - } else if (command == DebuggerRemoteServiceCommand::kEvaluateJavascript) {
|
| - send_response = DispatchEvaluateJavascript(tab_uid, content, &response);
|
| - } else {
|
| - // Unknown command
|
| - NOTREACHED();
|
| - response.SetInteger(kResultKey, RESULT_UNKNOWN_COMMAND);
|
| - }
|
| -
|
| - if (send_response) {
|
| - SendResponse(response, message.tool(), message.destination());
|
| - }
|
| -}
|
| -
|
| -void DebuggerRemoteService::OnConnectionLost() {
|
| - delegate_->inspectable_tab_proxy()->OnRemoteDebuggerDetached();
|
| -}
|
| -
|
| -// Sends a JSON response to the remote debugger using |response| as content,
|
| -// |tool| and |destination| as the respective header values.
|
| -void DebuggerRemoteService::SendResponse(const Value& response,
|
| - const std::string& tool,
|
| - const std::string& destination) {
|
| - std::string response_content;
|
| - base::JSONWriter::Write(&response, false, &response_content);
|
| - scoped_ptr<DevToolsRemoteMessage> response_message(
|
| - DevToolsRemoteMessageBuilder::instance().Create(tool,
|
| - destination,
|
| - response_content));
|
| - delegate_->Send(*response_message.get());
|
| -}
|
| -
|
| -// Gets a TabContents instance corresponding to the |tab_uid| using the
|
| -// InspectableTabProxy controllers map, or NULL if none found.
|
| -TabContents* DebuggerRemoteService::ToTabContents(int32 tab_uid) {
|
| - const InspectableTabProxy::TabMap& tab_map =
|
| - delegate_->inspectable_tab_proxy()->tab_map();
|
| - InspectableTabProxy::TabMap::const_iterator it = tab_map.find(tab_uid);
|
| - if (it != tab_map.end()) {
|
| - TabContents* tab_contents = it->second->tab_contents();
|
| - if (tab_contents == NULL) {
|
| - return NULL;
|
| - } else {
|
| - return tab_contents;
|
| - }
|
| - } else {
|
| - return NULL;
|
| - }
|
| -}
|
| -
|
| -// Gets invoked from a DevToolsClientHost callback whenever
|
| -// a message from the V8 VM debugger corresponding to |tab_id| is received.
|
| -// Composes a Chrome Developer Tools Protocol JSON response and sends it
|
| -// to the remote debugger.
|
| -void DebuggerRemoteService::DebuggerOutput(int32 tab_uid,
|
| - const std::string& message) {
|
| - std::string content = StringPrintf(
|
| - "{\"command\":\"%s\",\"result\":%s,\"data\":%s}",
|
| - DebuggerRemoteServiceCommand::kDebuggerCommand,
|
| - base::IntToString(RESULT_OK).c_str(),
|
| - message.c_str());
|
| - scoped_ptr<DevToolsRemoteMessage> response_message(
|
| - DevToolsRemoteMessageBuilder::instance().Create(
|
| - kToolName,
|
| - base::IntToString(tab_uid),
|
| - content));
|
| - delegate_->Send(*(response_message.get()));
|
| -}
|
| -
|
| -// Gets invoked from a DevToolsClientHost callback whenever
|
| -// a tab corresponding to |tab_id| changes its URL. |url| is the new
|
| -// URL of the tab (may be the same as the previous one if the tab is reloaded).
|
| -// Sends the corresponding message to the remote debugger.
|
| -void DebuggerRemoteService::FrameNavigate(int32 tab_uid,
|
| - const std::string& url) {
|
| - DictionaryValue value;
|
| - value.SetString(kCommandKey, DebuggerRemoteServiceCommand::kFrameNavigate);
|
| - value.SetInteger(kResultKey, RESULT_OK);
|
| - value.SetString(kDataKey, url);
|
| - SendResponse(value, kToolName, base::IntToString(tab_uid));
|
| -}
|
| -
|
| -// Gets invoked from a DevToolsClientHost callback whenever
|
| -// a tab corresponding to |tab_id| gets closed.
|
| -// Sends the corresponding message to the remote debugger.
|
| -void DebuggerRemoteService::TabClosed(int32 tab_id) {
|
| - DictionaryValue value;
|
| - value.SetString(kCommandKey, DebuggerRemoteServiceCommand::kTabClosed);
|
| - value.SetInteger(kResultKey, RESULT_OK);
|
| - SendResponse(value, kToolName, base::IntToString(tab_id));
|
| -}
|
| -
|
| -// Attaches a remote debugger to the target tab specified by |destination|
|
| -// by posting the DevToolsAgentMsg_Attach message and sends a response
|
| -// to the remote debugger immediately.
|
| -void DebuggerRemoteService::AttachToTab(const std::string& destination,
|
| - DictionaryValue* response) {
|
| - int32 tab_uid = -1;
|
| - base::StringToInt(destination, &tab_uid);
|
| - if (tab_uid < 0) {
|
| - // Bad tab_uid received from remote debugger (perhaps NaN)
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return;
|
| - }
|
| - if (tab_uid == 0) { // single tab_uid
|
| - // We've been asked to open a new tab with URL
|
| - // TODO(apavlov): implement
|
| - NOTIMPLEMENTED();
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return;
|
| - }
|
| - TabContents* tab_contents = ToTabContents(tab_uid);
|
| - if (tab_contents == NULL) {
|
| - // No active tab contents with tab_uid
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return;
|
| - }
|
| - RenderViewHost* target_host = tab_contents->render_view_host();
|
| - DevToolsClientHost* client_host =
|
| - delegate_->inspectable_tab_proxy()->ClientHostForTabId(tab_uid);
|
| - if (client_host == NULL) {
|
| - client_host =
|
| - delegate_->inspectable_tab_proxy()->NewClientHost(tab_uid, this);
|
| - DevToolsManager* manager = DevToolsManager::GetInstance();
|
| - if (manager != NULL) {
|
| - manager->RegisterDevToolsClientHostFor(target_host, client_host);
|
| - response->SetInteger(kResultKey, RESULT_OK);
|
| - } else {
|
| - response->SetInteger(kResultKey, RESULT_DEBUGGER_ERROR);
|
| - }
|
| - } else {
|
| - // DevToolsClientHost for this tab is already registered
|
| - response->SetInteger(kResultKey, RESULT_ILLEGAL_TAB_STATE);
|
| - }
|
| -}
|
| -
|
| -// Detaches a remote debugger from the target tab specified by |destination|
|
| -// by posting the DevToolsAgentMsg_Detach message and sends a response
|
| -// to the remote debugger immediately.
|
| -void DebuggerRemoteService::DetachFromTab(const std::string& destination,
|
| - DictionaryValue* response) {
|
| - int32 tab_uid = -1;
|
| - base::StringToInt(destination, &tab_uid);
|
| - if (tab_uid == -1) {
|
| - // Bad tab_uid received from remote debugger (NaN)
|
| - if (response != NULL) {
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - }
|
| - return;
|
| - }
|
| - int result_code;
|
| - DevToolsClientHostImpl* client_host =
|
| - delegate_->inspectable_tab_proxy()->ClientHostForTabId(tab_uid);
|
| - if (client_host != NULL) {
|
| - client_host->CloseImpl();
|
| - result_code = RESULT_OK;
|
| - } else {
|
| - // No client host registered for |tab_uid|.
|
| - result_code = RESULT_UNKNOWN_TAB;
|
| - }
|
| - if (response != NULL) {
|
| - response->SetInteger(kResultKey, result_code);
|
| - }
|
| -}
|
| -
|
| -// Sends a V8 debugger command to the target tab V8 debugger.
|
| -// Does not send back a response (which is received asynchronously
|
| -// through IPC) unless an error occurs before the command has actually
|
| -// been sent.
|
| -bool DebuggerRemoteService::DispatchDebuggerCommand(int tab_uid,
|
| - DictionaryValue* content,
|
| - DictionaryValue* response) {
|
| - if (tab_uid == -1) {
|
| - // Invalid tab_uid from remote debugger (perhaps NaN)
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return true;
|
| - }
|
| - DevToolsManager* manager = DevToolsManager::GetInstance();
|
| - if (manager == NULL) {
|
| - response->SetInteger(kResultKey, RESULT_DEBUGGER_ERROR);
|
| - return true;
|
| - }
|
| - TabContents* tab_contents = ToTabContents(tab_uid);
|
| - if (tab_contents == NULL) {
|
| - // Unknown tab_uid from remote debugger
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return true;
|
| - }
|
| - DevToolsClientHost* client_host =
|
| - manager->GetDevToolsClientHostFor(tab_contents->render_view_host());
|
| - if (client_host == NULL) {
|
| - // tab_uid is not being debugged (Attach has not been invoked)
|
| - response->SetInteger(kResultKey, RESULT_ILLEGAL_TAB_STATE);
|
| - return true;
|
| - }
|
| - std::string v8_command;
|
| - DictionaryValue* v8_command_value;
|
| - content->GetDictionary(kDataKey, &v8_command_value);
|
| - base::JSONWriter::Write(v8_command_value, false, &v8_command);
|
| - manager->ForwardToDevToolsAgent(
|
| - client_host, DevToolsAgentMsg_DebuggerCommand(MSG_ROUTING_NONE,
|
| - v8_command));
|
| - // Do not send the response right now, as the JSON will be received from
|
| - // the V8 debugger asynchronously.
|
| - return false;
|
| -}
|
| -
|
| -// Sends the immediate "evaluate Javascript" command to the V8 debugger.
|
| -// The evaluation result is not sent back to the client as this command
|
| -// is in fact needed to invoke processing of queued debugger commands.
|
| -bool DebuggerRemoteService::DispatchEvaluateJavascript(
|
| - int tab_uid,
|
| - DictionaryValue* content,
|
| - DictionaryValue* response) {
|
| - if (tab_uid == -1) {
|
| - // Invalid tab_uid from remote debugger (perhaps NaN)
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return true;
|
| - }
|
| - TabContents* tab_contents = ToTabContents(tab_uid);
|
| - if (tab_contents == NULL) {
|
| - // Unknown tab_uid from remote debugger
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return true;
|
| - }
|
| - RenderViewHost* render_view_host = tab_contents->render_view_host();
|
| - if (render_view_host == NULL) {
|
| - // No RenderViewHost
|
| - response->SetInteger(kResultKey, RESULT_UNKNOWN_TAB);
|
| - return true;
|
| - }
|
| - std::string javascript;
|
| - content->GetString(kDataKey, &javascript);
|
| - render_view_host->ExecuteJavascriptInWebFrame(string16(),
|
| - UTF8ToUTF16(javascript));
|
| - return false;
|
| -}
|
|
|