devtools_agent_filter.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
1// Copyright (c) 2012 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#include "content/renderer/devtools/devtools_agent_filter.h" 6 7#include "base/bind.h" 8#include "base/message_loop/message_loop.h" 9#include "content/common/devtools_messages.h" 10#include "content/renderer/devtools/devtools_agent.h" 11#include "content/renderer/plugin_channel_host.h" 12#include "third_party/WebKit/public/platform/WebString.h" 13#include "third_party/WebKit/public/web/WebDevToolsAgent.h" 14 15using WebKit::WebDevToolsAgent; 16using WebKit::WebString; 17 18namespace content { 19 20namespace { 21 22class MessageImpl : public WebDevToolsAgent::MessageDescriptor { 23 public: 24 MessageImpl(const std::string& message, int host_id) 25 : msg(message), 26 host_id(host_id) { 27 } 28 virtual ~MessageImpl() {} 29 virtual WebDevToolsAgent* agent() { 30 DevToolsAgent* agent = DevToolsAgent::FromHostId(host_id); 31 if (!agent) 32 return 0; 33 return agent->GetWebAgent(); 34 } 35 virtual WebString message() { return WebString::fromUTF8(msg); } 36 private: 37 std::string msg; 38 int host_id; 39}; 40 41} // namespace 42 43DevToolsAgentFilter::DevToolsAgentFilter() 44 : message_handled_(false), 45 render_thread_loop_(base::MessageLoop::current()), 46 current_routing_id_(0) {} 47 48bool DevToolsAgentFilter::OnMessageReceived(const IPC::Message& message) { 49 // Dispatch debugger commands directly from IO. 50 message_handled_ = true; 51 current_routing_id_ = message.routing_id(); 52 IPC_BEGIN_MESSAGE_MAP(DevToolsAgentFilter, message) 53 IPC_MESSAGE_HANDLER(DevToolsAgentMsg_DispatchOnInspectorBackend, 54 OnDispatchOnInspectorBackend) 55 IPC_MESSAGE_UNHANDLED(message_handled_ = false) 56 IPC_END_MESSAGE_MAP() 57 return message_handled_; 58} 59 60DevToolsAgentFilter::~DevToolsAgentFilter() {} 61 62void DevToolsAgentFilter::OnDispatchOnInspectorBackend( 63 const std::string& message) { 64 if (!WebDevToolsAgent::shouldInterruptForMessage( 65 WebString::fromUTF8(message))) { 66 message_handled_ = false; 67 return; 68 } 69 WebDevToolsAgent::interruptAndDispatch( 70 new MessageImpl(message, current_routing_id_)); 71 72 render_thread_loop_->PostTask( 73 FROM_HERE, base::Bind(&WebDevToolsAgent::processPendingMessages)); 74} 75 76} // namespace content 77