1 // Copyright 2013 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/browser/message_port_message_filter.h"
6
7 #include "content/browser/message_port_service.h"
8 #include "content/common/message_port_messages.h"
9
10 namespace content {
11
MessagePortMessageFilter(const NextRoutingIDCallback & callback)12 MessagePortMessageFilter::MessagePortMessageFilter(
13 const NextRoutingIDCallback& callback)
14 : BrowserMessageFilter(MessagePortMsgStart),
15 next_routing_id_(callback) {
16 }
17
~MessagePortMessageFilter()18 MessagePortMessageFilter::~MessagePortMessageFilter() {
19 }
20
OnChannelClosing()21 void MessagePortMessageFilter::OnChannelClosing() {
22 MessagePortService::GetInstance()->OnMessagePortMessageFilterClosing(this);
23 }
24
OnMessageReceived(const IPC::Message & message)25 bool MessagePortMessageFilter::OnMessageReceived(const IPC::Message& message) {
26 bool handled = true;
27 IPC_BEGIN_MESSAGE_MAP(MessagePortMessageFilter, message)
28 IPC_MESSAGE_HANDLER(MessagePortHostMsg_CreateMessagePort,
29 OnCreateMessagePort)
30 IPC_MESSAGE_FORWARD(MessagePortHostMsg_DestroyMessagePort,
31 MessagePortService::GetInstance(),
32 MessagePortService::Destroy)
33 IPC_MESSAGE_FORWARD(MessagePortHostMsg_Entangle,
34 MessagePortService::GetInstance(),
35 MessagePortService::Entangle)
36 IPC_MESSAGE_FORWARD(MessagePortHostMsg_PostMessage,
37 MessagePortService::GetInstance(),
38 MessagePortService::PostMessage)
39 IPC_MESSAGE_FORWARD(MessagePortHostMsg_QueueMessages,
40 MessagePortService::GetInstance(),
41 MessagePortService::QueueMessages)
42 IPC_MESSAGE_FORWARD(MessagePortHostMsg_SendQueuedMessages,
43 MessagePortService::GetInstance(),
44 MessagePortService::SendQueuedMessages)
45 IPC_MESSAGE_UNHANDLED(handled = false)
46 IPC_END_MESSAGE_MAP()
47
48 return handled;
49 }
50
OnDestruct() const51 void MessagePortMessageFilter::OnDestruct() const {
52 BrowserThread::DeleteOnIOThread::Destruct(this);
53 }
54
GetNextRoutingID()55 int MessagePortMessageFilter::GetNextRoutingID() {
56 return next_routing_id_.Run();
57 }
58
UpdateMessagePortsWithNewRoutes(const std::vector<int> & message_port_ids,std::vector<int> * new_routing_ids)59 void MessagePortMessageFilter::UpdateMessagePortsWithNewRoutes(
60 const std::vector<int>& message_port_ids,
61 std::vector<int>* new_routing_ids) {
62 DCHECK(new_routing_ids);
63 new_routing_ids->clear();
64 new_routing_ids->resize(message_port_ids.size());
65
66 for (size_t i = 0; i < message_port_ids.size(); ++i) {
67 (*new_routing_ids)[i] = GetNextRoutingID();
68 MessagePortService::GetInstance()->UpdateMessagePort(
69 message_port_ids[i],
70 this,
71 (*new_routing_ids)[i]);
72 }
73 }
74
OnCreateMessagePort(int * route_id,int * message_port_id)75 void MessagePortMessageFilter::OnCreateMessagePort(int *route_id,
76 int* message_port_id) {
77 *route_id = next_routing_id_.Run();
78 MessagePortService::GetInstance()->Create(*route_id, this, message_port_id);
79 }
80
81 } // namespace content
82