14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/message_port_message_filter.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/message_port_service.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/message_port_messages.h"
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content {
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MessagePortMessageFilter::MessagePortMessageFilter(
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const NextRoutingIDCallback& callback)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(MessagePortMsgStart),
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      next_routing_id_(callback) {
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)MessagePortMessageFilter::~MessagePortMessageFilter() {
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MessagePortMessageFilter::OnChannelClosing() {
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MessagePortService::GetInstance()->OnMessagePortMessageFilterClosing(this);
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool MessagePortMessageFilter::OnMessageReceived(const IPC::Message& message) {
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool handled = true;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(MessagePortMessageFilter, message)
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_HANDLER(MessagePortHostMsg_CreateMessagePort,
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        OnCreateMessagePort)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_FORWARD(MessagePortHostMsg_DestroyMessagePort,
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::GetInstance(),
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::Destroy)
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_FORWARD(MessagePortHostMsg_Entangle,
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::GetInstance(),
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::Entangle)
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_FORWARD(MessagePortHostMsg_PostMessage,
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::GetInstance(),
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::PostMessage)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_FORWARD(MessagePortHostMsg_QueueMessages,
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::GetInstance(),
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::QueueMessages)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_FORWARD(MessagePortHostMsg_SendQueuedMessages,
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::GetInstance(),
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        MessagePortService::SendQueuedMessages)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return handled;
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MessagePortMessageFilter::OnDestruct() const {
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::DeleteOnIOThread::Destruct(this);
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int MessagePortMessageFilter::GetNextRoutingID() {
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return next_routing_id_.Run();
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void MessagePortMessageFilter::UpdateMessagePortsWithNewRoutes(
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::vector<int>& message_port_ids,
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::vector<int>* new_routing_ids) {
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(new_routing_ids);
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  new_routing_ids->clear();
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  new_routing_ids->resize(message_port_ids.size());
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  for (size_t i = 0; i < message_port_ids.size(); ++i) {
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    (*new_routing_ids)[i] = GetNextRoutingID();
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    MessagePortService::GetInstance()->UpdateMessagePort(
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        message_port_ids[i],
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        this,
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        (*new_routing_ids)[i]);
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void MessagePortMessageFilter::OnCreateMessagePort(int *route_id,
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                   int* message_port_id) {
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  *route_id = next_routing_id_.Run();
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MessagePortService::GetInstance()->Create(*route_id, this, message_port_id);
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace content
82