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" 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/child/child_process.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/devtools_messages.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/devtools/devtools_agent.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDevToolsAgent.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDevToolsAgent; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageImpl : public WebDevToolsAgent::MessageDescriptor { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MessageImpl(const std::string& message, int routing_id) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : msg_(message), 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) routing_id_(routing_id) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MessageImpl() {} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebDevToolsAgent* agent() { 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DevToolsAgent* agent = DevToolsAgent::FromRoutingId(routing_id_); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!agent) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return agent->GetWebAgent(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual WebString message() { return WebString::fromUTF8(msg_); } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string msg_; 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int routing_id_; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DevToolsAgentFilter::DevToolsAgentFilter() 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message_handled_(false), 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) render_thread_loop_(base::MessageLoop::current()), 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) io_message_loop_proxy_(ChildProcess::current()->io_message_loop_proxy()), 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) current_routing_id_(0) {} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DevToolsAgentFilter::OnMessageReceived(const IPC::Message& message) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dispatch debugger commands directly from IO. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_handled_ = true; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_routing_id_ = message.routing_id(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(DevToolsAgentFilter, message) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(DevToolsAgentMsg_DispatchOnInspectorBackend, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDispatchOnInspectorBackend) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(message_handled_ = false) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return message_handled_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DevToolsAgentFilter::~DevToolsAgentFilter() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DevToolsAgentFilter::OnDispatchOnInspectorBackend( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& message) { 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (embedded_worker_routes_.find(current_routing_id_) != 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu embedded_worker_routes_.end()) { 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) message_handled_ = false; 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!WebDevToolsAgent::shouldInterruptForMessage( 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(message))) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_handled_ = false; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDevToolsAgent::interruptAndDispatch( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MessageImpl(message, current_routing_id_)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_thread_loop_->PostTask( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&WebDevToolsAgent::processPendingMessages)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsAgentFilter::AddEmbeddedWorkerRouteOnMainThread(int32 routing_id) { 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) io_message_loop_proxy_->PostTask( 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FROM_HERE, 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::Bind( 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &DevToolsAgentFilter::AddEmbeddedWorkerRoute, this, routing_id)); 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsAgentFilter::RemoveEmbeddedWorkerRouteOnMainThread( 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int32 routing_id) { 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) io_message_loop_proxy_->PostTask( 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FROM_HERE, 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::Bind( 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &DevToolsAgentFilter::RemoveEmbeddedWorkerRoute, this, routing_id)); 9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsAgentFilter::AddEmbeddedWorkerRoute(int32 routing_id) { 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu embedded_worker_routes_.insert(routing_id); 9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DevToolsAgentFilter::RemoveEmbeddedWorkerRoute(int32 routing_id) { 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu embedded_worker_routes_.erase(routing_id); 10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 106