1 // Copyright (c) 2012 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.
5 #ifndef PPAPI_PROXY_HOST_DISPATCHER_H_
6 #define PPAPI_PROXY_HOST_DISPATCHER_H_
12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/process.h"
15 #include "ipc/ipc_channel_proxy.h"
16 #include "ppapi/c/pp_instance.h"
17 #include "ppapi/proxy/dispatcher.h"
19 struct PPB_Proxy_Private
;
27 class PPAPI_PROXY_EXPORT HostDispatcher
: public Dispatcher
{
29 // This interface receives notifications about sync messages being sent by
30 // the dispatcher to the plugin process. It is used to detect a hung plugin.
32 // Note that there can be nested sync messages, so the begin/end status
33 // actually represents a stack of blocking messages.
34 class SyncMessageStatusReceiver
: public IPC::ChannelProxy::MessageFilter
{
36 // Notification that a sync message is about to be sent out.
37 virtual void BeginBlockOnSyncMessage() = 0;
39 // Notification that a sync message reply was received and the dispatcher
40 // is no longer blocked on a sync message.
41 virtual void EndBlockOnSyncMessage() = 0;
44 virtual ~SyncMessageStatusReceiver() {}
47 // Constructor for the renderer side. This will take a reference to the
48 // SyncMessageStatusReceiver.
50 // You must call InitHostWithChannel after the constructor.
51 HostDispatcher(PP_Module module
,
52 PP_GetInterface_Func local_get_interface
,
53 SyncMessageStatusReceiver
* sync_status
,
54 const PpapiPermissions
& permissions
);
57 // You must call this function before anything else. Returns true on success.
58 // The delegate pointer must outlive this class, ownership is not
60 virtual bool InitHostWithChannel(Delegate
* delegate
,
61 const IPC::ChannelHandle
& channel_handle
,
63 const Preferences
& preferences
);
65 // The host side maintains a mapping from PP_Instance to Dispatcher so
66 // that we can send the messages to the right channel.
67 static HostDispatcher
* GetForInstance(PP_Instance instance
);
68 static void SetForInstance(PP_Instance instance
,
69 HostDispatcher
* dispatcher
);
70 static void RemoveForInstance(PP_Instance instance
);
72 // Returns the host's notion of our PP_Module. This will be different than
73 // the plugin's notion of its PP_Module because the plugin process may be
74 // used by multiple renderer processes.
76 // Use this value instead of a value from the plugin whenever talking to the
78 PP_Module
pp_module() const { return pp_module_
; }
80 // Dispatcher overrides.
81 virtual bool IsPlugin() const;
82 virtual bool Send(IPC::Message
* msg
);
85 virtual bool OnMessageReceived(const IPC::Message
& msg
) OVERRIDE
;
86 virtual void OnChannelError() OVERRIDE
;
88 // Proxied version of calling GetInterface on the plugin. This will check
89 // if the plugin supports the given interface (with caching) and returns the
90 // pointer to the proxied interface if it is supported. Returns NULL if the
91 // given interface isn't supported by the plugin or the proxy.
92 const void* GetProxiedInterface(const std::string
& iface_name
);
94 // See the value below. Call this when processing a scripting message from
95 // the plugin that can be reentered. This is set to false at the beginning
96 // of processing of each message from the plugin.
97 void set_allow_plugin_reentrancy() {
98 allow_plugin_reentrancy_
= true;
101 // Returns the proxy interface for talking to the implementation.
102 const PPB_Proxy_Private
* ppb_proxy() const { return ppb_proxy_
; }
105 // Overridden from Dispatcher.
106 virtual void OnInvalidMessageReceived();
109 void OnHostMsgLogWithSource(PP_Instance instance
,
111 const std::string
& source
,
112 const std::string
& value
);
114 scoped_refptr
<SyncMessageStatusReceiver
> sync_status_
;
116 PP_Module pp_module_
;
118 // Maps interface name to whether that interface is supported. If an interface
119 // name is not in the map, that implies that we haven't queried for it yet.
120 typedef base::hash_map
<std::string
, bool> PluginSupportedMap
;
121 PluginSupportedMap plugin_supported_
;
123 // Guaranteed non-NULL.
124 const PPB_Proxy_Private
* ppb_proxy_
;
126 // Set to true when the plugin is in a state that it can be reentered by a
127 // sync message from the host. We allow reentrancy only when we're processing
128 // a sync message from the renderer that is a scripting command. When the
129 // plugin is in this state, it needs to accept reentrancy since scripting may
130 // ultimately call back into the plugin.
131 bool allow_plugin_reentrancy_
;
133 DISALLOW_COPY_AND_ASSIGN(HostDispatcher
);
136 // Create this object on the stack to prevent the module (and hence the
137 // dispatcher) from being deleted out from under you. This is necessary when
138 // calling some scripting functions that may delete the plugin.
140 // This class does nothing if used on the plugin side.
141 class ScopedModuleReference
{
143 explicit ScopedModuleReference(Dispatcher
* dispatcher
);
144 ~ScopedModuleReference();
147 HostDispatcher
* dispatcher_
;
149 DISALLOW_COPY_AND_ASSIGN(ScopedModuleReference
);
155 #endif // PPAPI_PROXY_HOST_DISPATCHER_H_