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 10namespace content { 11 12MessagePortMessageFilter::MessagePortMessageFilter( 13 const NextRoutingIDCallback& callback) 14 : BrowserMessageFilter(MessagePortMsgStart), 15 next_routing_id_(callback) { 16} 17 18MessagePortMessageFilter::~MessagePortMessageFilter() { 19} 20 21void MessagePortMessageFilter::OnChannelClosing() { 22 MessagePortService::GetInstance()->OnMessagePortMessageFilterClosing(this); 23} 24 25bool 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 51void MessagePortMessageFilter::OnDestruct() const { 52 BrowserThread::DeleteOnIOThread::Destruct(this); 53} 54 55int MessagePortMessageFilter::GetNextRoutingID() { 56 return next_routing_id_.Run(); 57} 58 59void 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 75void 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