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