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