| Index: ppapi/proxy/ppp_messaging_proxy.cc
|
| diff --git a/ppapi/proxy/ppp_messaging_proxy.cc b/ppapi/proxy/ppp_messaging_proxy.cc
|
| index ba83ca7432b88fc829528ccc5c4abf754984f557..0bbe65c50cd14715c0d44a83f4f229873f3e1ebc 100644
|
| --- a/ppapi/proxy/ppp_messaging_proxy.cc
|
| +++ b/ppapi/proxy/ppp_messaging_proxy.cc
|
| @@ -8,17 +8,39 @@
|
|
|
| #include "ppapi/c/ppp_messaging.h"
|
| #include "ppapi/proxy/host_dispatcher.h"
|
| +#include "ppapi/proxy/message_handler.h"
|
| +#include "ppapi/proxy/plugin_dispatcher.h"
|
| #include "ppapi/proxy/plugin_resource_tracker.h"
|
| #include "ppapi/proxy/plugin_var_tracker.h"
|
| #include "ppapi/proxy/ppapi_messages.h"
|
| #include "ppapi/proxy/serialized_var.h"
|
| #include "ppapi/shared_impl/ppapi_globals.h"
|
| #include "ppapi/shared_impl/proxy_lock.h"
|
| +#include "ppapi/shared_impl/scoped_pp_var.h"
|
| #include "ppapi/shared_impl/var_tracker.h"
|
|
|
| namespace ppapi {
|
| namespace proxy {
|
|
|
| +namespace {
|
| +
|
| +MessageHandler* GetMessageHandler(Dispatcher* dispatcher,
|
| + PP_Instance instance) {
|
| + if (!dispatcher)
|
| + return NULL;
|
| + if (!dispatcher->IsPlugin())
|
| + return NULL;
|
| + PluginDispatcher* plugin_dispatcher =
|
| + static_cast<PluginDispatcher*>(dispatcher);
|
| + InstanceData* instance_data = plugin_dispatcher->GetInstanceData(instance);
|
| + if (!instance_data)
|
| + return NULL;
|
| +
|
| + return instance_data->message_handler.get();
|
| +}
|
| +
|
| +}
|
| +
|
| PPP_Messaging_Proxy::PPP_Messaging_Proxy(Dispatcher* dispatcher)
|
| : InterfaceProxy(dispatcher),
|
| ppp_messaging_impl_(NULL) {
|
| @@ -39,6 +61,9 @@ bool PPP_Messaging_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| IPC_BEGIN_MESSAGE_MAP(PPP_Messaging_Proxy, msg)
|
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPMessaging_HandleMessage,
|
| OnMsgHandleMessage)
|
| + IPC_MESSAGE_HANDLER_DELAY_REPLY(
|
| + PpapiMsg_PPPMessageHandler_HandleBlockingMessage,
|
| + OnMsgHandleBlockingMessage)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| IPC_END_MESSAGE_MAP()
|
| return handled;
|
| @@ -47,13 +72,39 @@ bool PPP_Messaging_Proxy::OnMessageReceived(const IPC::Message& msg) {
|
| void PPP_Messaging_Proxy::OnMsgHandleMessage(
|
| PP_Instance instance, SerializedVarReceiveInput message_data) {
|
| PP_Var received_var(message_data.GetForInstance(dispatcher(), instance));
|
| - // SerializedVarReceiveInput will decrement the reference count, but we want
|
| - // to give the recipient a reference.
|
| - PpapiGlobals::Get()->GetVarTracker()->AddRefVar(received_var);
|
| - CallWhileUnlocked(ppp_messaging_impl_->HandleMessage,
|
| - instance,
|
| - received_var);
|
| + MessageHandler* message_handler = GetMessageHandler(dispatcher(), instance);
|
| + if (message_handler) {
|
| + message_handler->HandleMessage(ScopedPPVar(received_var));
|
| + } else {
|
| + // SerializedVarReceiveInput will decrement the reference count, but we want
|
| + // to give the recipient a reference in the legacy API.
|
| + PpapiGlobals::Get()->GetVarTracker()->AddRefVar(received_var);
|
| + CallWhileUnlocked(ppp_messaging_impl_->HandleMessage,
|
| + instance,
|
| + received_var);
|
| + }
|
| }
|
|
|
| +void PPP_Messaging_Proxy::OnMsgHandleBlockingMessage(
|
| + PP_Instance instance,
|
| + SerializedVarReceiveInput message_data,
|
| + IPC::Message* reply_msg) {
|
| + ScopedPPVar received_var(message_data.GetForInstance(dispatcher(), instance));
|
| + MessageHandler* message_handler = GetMessageHandler(dispatcher(), instance);
|
| + if (message_handler) {
|
| + message_handler->HandleBlockingMessage(received_var,
|
| + scoped_ptr<IPC::Message>(reply_msg));
|
| + return;
|
| + }
|
| + // We have no handler, but we still need to respond to unblock the renderer
|
| + // and inform the JavaScript caller.
|
| + PpapiMsg_PPPMessageHandler_HandleBlockingMessage::WriteReplyParams(
|
| + reply_msg,
|
| + SerializedVarReturnValue::Convert(dispatcher(), PP_MakeUndefined()),
|
| + false /* was_handled */);
|
| + dispatcher()->Send(reply_msg);
|
| +}
|
| +
|
| +
|
| } // namespace proxy
|
| } // namespace ppapi
|
|
|