Index: ppapi/proxy/plugin_message_filter.cc |
diff --git a/ppapi/proxy/plugin_message_filter.cc b/ppapi/proxy/plugin_message_filter.cc |
index 9f178f15acc67f0c5adc8bc077460d8d44497934..68d4cac5fbd71e148f901b4189816b26cc03682f 100644 |
--- a/ppapi/proxy/plugin_message_filter.cc |
+++ b/ppapi/proxy/plugin_message_filter.cc |
@@ -4,14 +4,24 @@ |
#include "ppapi/proxy/plugin_message_filter.h" |
+#include "base/bind.h" |
+#include "base/logging.h" |
#include "ppapi/proxy/ppapi_messages.h" |
+#include "ppapi/proxy/resource_message_params.h" |
+#include "ppapi/proxy/resource_reply_thread_registrar.h" |
+#include "ppapi/shared_impl/ppapi_globals.h" |
+#include "ppapi/shared_impl/proxy_lock.h" |
+#include "ppapi/shared_impl/resource.h" |
+#include "ppapi/shared_impl/resource_tracker.h" |
namespace ppapi { |
namespace proxy { |
PluginMessageFilter::PluginMessageFilter( |
- std::set<PP_Instance>* seen_instance_ids) |
+ std::set<PP_Instance>* seen_instance_ids, |
+ scoped_refptr<ResourceReplyThreadRegistrar> registrar) |
: seen_instance_ids_(seen_instance_ids), |
+ resource_reply_thread_registrar_(registrar), |
channel_(NULL) { |
} |
@@ -30,6 +40,7 @@ bool PluginMessageFilter::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(PluginMessageFilter, message) |
IPC_MESSAGE_HANDLER(PpapiMsg_ReserveInstanceId, OnMsgReserveInstanceId) |
+ IPC_MESSAGE_HANDLER(PpapiPluginMsg_ResourceReply, OnMsgResourceReply) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -42,6 +53,13 @@ bool PluginMessageFilter::Send(IPC::Message* msg) { |
return false; |
} |
+// static |
+void PluginMessageFilter::DispatchResourceReplyForTest( |
+ const ResourceMessageReplyParams& reply_params, |
+ const IPC::Message& nested_msg) { |
+ DispatchResourceReply(reply_params, nested_msg); |
+} |
+ |
void PluginMessageFilter::OnMsgReserveInstanceId(PP_Instance instance, |
bool* usable) { |
// See the message definition for how this works. |
@@ -57,5 +75,37 @@ void PluginMessageFilter::OnMsgReserveInstanceId(PP_Instance instance, |
*usable = true; |
} |
+void PluginMessageFilter::OnMsgResourceReply( |
+ const ResourceMessageReplyParams& reply_params, |
+ const IPC::Message& nested_msg) { |
+ // TODO(yzshen): Bind() will do an extra copy, do I need to somehow eliminate |
+ // it? Compare with the previous code. |
+ scoped_refptr<base::MessageLoopProxy> target = |
+ resource_reply_thread_registrar_->GetTargetThread( |
+ reply_params.pp_resource(), reply_params.sequence()); |
+ |
+ target->PostTask( |
+ FROM_HERE, |
+ base::Bind(&DispatchResourceReply, reply_params, nested_msg)); |
+} |
+ |
+// TODO(yzshen): I think new resources in in-process mode don't use plugin |
+// dispatcher, make sure that is right. |
+// static |
+void PluginMessageFilter::DispatchResourceReply( |
+ const ResourceMessageReplyParams& reply_params, |
+ const IPC::Message& nested_msg) { |
+ ProxyAutoLock lock; |
+ Resource* resource = PpapiGlobals::Get()->GetResourceTracker()->GetResource( |
+ reply_params.pp_resource()); |
+ if (!resource) { |
+ DVLOG_IF(1, reply_params.sequence() != 0) |
+ << "Pepper resource reply message received but the resource doesn't " |
+ "exist (probably has been destroyed)."; |
+ return; |
+ } |
+ resource->OnReplyReceived(reply_params, nested_msg); |
+} |
+ |
} // namespace proxy |
} // namespace ppapi |