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)#ifndef PPAPI_PROXY_PLUGIN_MESSAGE_FILTER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_PLUGIN_MESSAGE_FILTER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ResourceMessageReplyParams; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ResourceReplyThreadRegistrar; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens for messages on the I/O thread of the plugin and handles some of 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them to avoid needing to block on the plugin. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one instance of this class for each renderer channel (same as for 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the PluginDispatchers). 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PPAPI_PROXY_EXPORT PluginMessageFilter : public IPC::MessageFilter, 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public IPC::Sender { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |seen_instance_ids| is a pointer to a set that will be used to uniquify 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // PP_Instances across all renderer channels. The same pointer should be 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // passed to each MessageFilter to ensure uniqueness, and the value should 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // outlive this class. It could be NULL if this filter is for a browser 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // channel. 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |thread_registrar| is used to look up handling threads for resource 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // reply messages. It shouldn't be NULL. 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PluginMessageFilter( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<PP_Instance>* seen_instance_ids, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<ResourceReplyThreadRegistrar> thread_registrar); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PluginMessageFilter(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MessageFilter implementation. 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFilterRemoved() OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Sender implementation. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Send(IPC::Message* msg) OVERRIDE; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Simulates an incoming resource reply that is handled on the calling thread. 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For testing only. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void DispatchResourceReplyForTest( 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceMessageReplyParams& reply_params, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& nested_msg); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnMsgReserveInstanceId(PP_Instance instance, bool* usable); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnMsgResourceReply(const ResourceMessageReplyParams& reply_params, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& nested_msg); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Dispatches the given resource reply to the appropriate resource in the 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // plugin process. 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void DispatchResourceReply( 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ResourceMessageReplyParams& reply_params, 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& nested_msg); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // All instance IDs ever queried by any renderer on this plugin. This is used 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to make sure that new instance IDs are unique. This is a non-owning 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // pointer. It is managed by PluginDispatcher::PluginDelegate. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<PP_Instance>* seen_instance_ids_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<ResourceReplyThreadRegistrar> resource_reply_thread_registrar_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The IPC sender to the renderer. May be NULL if we're not currently 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attached as a filter. 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPC::Sender* sender_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PPAPI_PROXY_PLUGIN_MESSAGE_FILTER_H_ 84