devtools_agent_filter.cc revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/devtools/devtools_agent_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/devtools_messages.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/devtools/devtools_agent.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDevToolsAgent.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDevToolsAgent; 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageImpl : public WebDevToolsAgent::MessageDescriptor { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageImpl(const std::string& message, int host_id) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : msg(message), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_id(host_id) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MessageImpl() {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebDevToolsAgent* agent() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsAgent* agent = DevToolsAgent::FromHostId(host_id); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!agent) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return agent->GetWebAgent(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebString message() { return WebString::fromUTF8(msg); } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string msg; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int host_id; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DevToolsAgentFilter::DevToolsAgentFilter() 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message_handled_(false), 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_thread_loop_(base::MessageLoop::current()), 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_routing_id_(0) {} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DevToolsAgentFilter::OnMessageReceived(const IPC::Message& message) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatch debugger commands directly from IO. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_handled_ = true; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_routing_id_ = message.routing_id(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(DevToolsAgentFilter, message) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DevToolsAgentMsg_DispatchOnInspectorBackend, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDispatchOnInspectorBackend) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(message_handled_ = false) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_handled_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DevToolsAgentFilter::~DevToolsAgentFilter() {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DevToolsAgentFilter::OnDispatchOnInspectorBackend( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!WebDevToolsAgent::shouldInterruptForMessage( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(message))) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_handled_ = false; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDevToolsAgent::interruptAndDispatch( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MessageImpl(message, current_routing_id_)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_loop_->PostTask( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&WebDevToolsAgent::processPendingMessages)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 76