15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_message_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/ipc_channel.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/resource_message_params.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/resource_reply_thread_registrar.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/resource.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginMessageFilter::PluginMessageFilter( 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<PP_Instance>* seen_instance_ids, 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<ResourceReplyThreadRegistrar> registrar) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : seen_instance_ids_(seen_instance_ids), 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource_reply_thread_registrar_(registrar), 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_(NULL) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PluginMessageFilter::~PluginMessageFilter() { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PluginMessageFilter::OnFilterAdded(IPC::Sender* sender) { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_ = sender; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginMessageFilter::OnFilterRemoved() { 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_ = NULL; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginMessageFilter::OnMessageReceived(const IPC::Message& message) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PluginMessageFilter, message) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_ReserveInstanceId, OnMsgReserveInstanceId) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiPluginMsg_ResourceReply, OnMsgResourceReply) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PluginMessageFilter::Send(IPC::Message* msg) { 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (sender_) 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return sender_->Send(msg); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete msg; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginMessageFilter::DispatchResourceReplyForTest( 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceMessageReplyParams& reply_params, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& nested_msg) { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DispatchResourceReply(reply_params, nested_msg); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PluginMessageFilter::OnMsgReserveInstanceId(PP_Instance instance, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* usable) { 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |seen_instance_ids_| is set to NULL, we are not supposed to see this 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // message. 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(seen_instance_ids_); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See the message definition for how this works. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (seen_instance_ids_->find(instance) != seen_instance_ids_->end()) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instance ID already seen, reject it. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *usable = false; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This instance ID is new so we can return that it's usable and mark it as 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used for future reference. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seen_instance_ids_->insert(instance); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *usable = true; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginMessageFilter::OnMsgResourceReply( 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceMessageReplyParams& reply_params, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& nested_msg) { 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> target = 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_reply_thread_registrar_->GetTargetThread(reply_params, 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nested_msg); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!target.get()) { 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DispatchResourceReply(reply_params, nested_msg); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci target->PostTask( 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&DispatchResourceReply, reply_params, nested_msg)); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PluginMessageFilter::DispatchResourceReply( 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceMessageReplyParams& reply_params, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& nested_msg) { 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProxyAutoLock lock; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Resource* resource = PpapiGlobals::Get()->GetResourceTracker()->GetResource( 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reply_params.pp_resource()); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!resource) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG_IF(1, reply_params.sequence() != 0) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "Pepper resource reply message received but the resource doesn't " 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "exist (probably has been destroyed)."; 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource->OnReplyReceived(reply_params, nested_msg); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 116