Index: ppapi/proxy/message_handler.cc |
diff --git a/ppapi/proxy/message_handler.cc b/ppapi/proxy/message_handler.cc |
index fff878811fcb3a9d028cf379836676a150a3c101..e095dd76509a84465b2953d362ea02f4db51ce18 100644 |
--- a/ppapi/proxy/message_handler.cc |
+++ b/ppapi/proxy/message_handler.cc |
@@ -16,14 +16,18 @@ namespace ppapi { |
namespace proxy { |
namespace { |
-typedef void (*HandleMessageFunc)(PP_Instance, void*, PP_Var); |
-typedef PP_Var (*HandleBlockingMessageFunc)(PP_Instance, void*, PP_Var); |
+typedef void (*HandleMessageFunc)(PP_Instance, void*, const PP_Var*); |
+typedef void (*HandleBlockingMessageFunc)( |
+ PP_Instance, void*, const PP_Var*, PP_Var*); |
+typedef void (*HandleMessageFunc_0_1)(PP_Instance, void*, PP_Var); |
+typedef PP_Var (*HandleBlockingMessageFunc_0_1)(PP_Instance, void*, PP_Var); |
void HandleMessageWrapper(HandleMessageFunc function, |
PP_Instance instance, |
void* user_data, |
ScopedPPVar message_data) { |
- CallWhileUnlocked(function, instance, user_data, message_data.get()); |
+ CallWhileUnlocked(function, instance, user_data, |
+ &message_data.get()); |
} |
void HandleBlockingMessageWrapper(HandleBlockingMessageFunc function, |
@@ -34,6 +38,32 @@ void HandleBlockingMessageWrapper(HandleBlockingMessageFunc function, |
PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
if (!dispatcher) |
return; |
+ PP_Var result = PP_MakeUndefined(); |
+ CallWhileUnlocked( |
+ function, instance, user_data, &message_data.get(), &result); |
+ PpapiMsg_PPPMessageHandler_HandleBlockingMessage::WriteReplyParams( |
+ reply_msg.get(), |
+ SerializedVarReturnValue::Convert(dispatcher, result), |
+ true /* was_handled */); |
+ dispatcher->Send(reply_msg.release()); |
+} |
+ |
+// TODO(dmichael): Remove the 0_1 verions; crbug.com/414398 |
+void HandleMessageWrapper_0_1(HandleMessageFunc_0_1 function, |
+ PP_Instance instance, |
+ void* user_data, |
+ ScopedPPVar message_data) { |
+ CallWhileUnlocked(function, instance, user_data, message_data.get()); |
+} |
+ |
+void HandleBlockingMessageWrapper_0_1(HandleBlockingMessageFunc_0_1 function, |
+ PP_Instance instance, |
+ void* user_data, |
+ ScopedPPVar message_data, |
+ scoped_ptr<IPC::Message> reply_msg) { |
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
+ if (!dispatcher) |
+ return; |
PP_Var return_value = CallWhileUnlocked(function, |
instance, |
user_data, |
@@ -50,7 +80,45 @@ void HandleBlockingMessageWrapper(HandleBlockingMessageFunc function, |
// static |
scoped_ptr<MessageHandler> MessageHandler::Create( |
PP_Instance instance, |
- const PPP_MessageHandler_0_1* handler_if, |
+ const PPP_MessageHandler_0_2* handler_if, |
+ void* user_data, |
+ PP_Resource message_loop, |
+ int32_t* error) { |
+ scoped_ptr<MessageHandler> result; |
+ // The interface and all function pointers must be valid. |
+ if (!handler_if || |
+ !handler_if->HandleMessage || |
+ !handler_if->HandleBlockingMessage || |
+ !handler_if->Destroy) { |
+ *error = PP_ERROR_BADARGUMENT; |
+ return result.Pass(); |
+ } |
+ thunk::EnterResourceNoLock<thunk::PPB_MessageLoop_API> |
+ enter_loop(message_loop, true); |
+ if (enter_loop.failed()) { |
+ *error = PP_ERROR_BADRESOURCE; |
+ return result.Pass(); |
+ } |
+ scoped_refptr<MessageLoopResource> message_loop_resource( |
+ static_cast<MessageLoopResource*>(enter_loop.object())); |
+ if (message_loop_resource->is_main_thread_loop()) { |
+ *error = PP_ERROR_WRONG_THREAD; |
+ return result.Pass(); |
+ } |
+ |
+ result.reset(new MessageHandler( |
+ instance, handler_if, user_data, message_loop_resource)); |
+ *error = PP_OK; |
+ return result.Pass(); |
+} |
+ |
+// CreateDeprecated is a near-exact copy of Create, but we'll just delete it |
+// when 0.1 is deprecated, so need to get fancy to avoid code duplication. |
+// TODO(dmichael) crbug.com/414398 |
+// static |
+scoped_ptr<MessageHandler> MessageHandler::CreateDeprecated( |
+ PP_Instance instance, |
+ const PPP_MessageHandler_0_1_Deprecated* handler_if, |
void* user_data, |
PP_Resource message_loop, |
int32_t* error) { |
@@ -88,6 +156,13 @@ MessageHandler::~MessageHandler() { |
if (message_loop_->message_loop_proxy().get()) { |
// The posted task won't have the proxy lock, but that's OK, it doesn't |
// touch any internal state; it's a direct call on the plugin's function. |
+ if (handler_if_0_1_) { |
+ message_loop_->message_loop_proxy()->PostTask(FROM_HERE, |
+ base::Bind(handler_if_0_1_->Destroy, |
+ instance_, |
+ user_data_)); |
+ return; |
+ } |
message_loop_->message_loop_proxy()->PostTask(FROM_HERE, |
base::Bind(handler_if_->Destroy, |
instance_, |
@@ -100,6 +175,16 @@ bool MessageHandler::LoopIsValid() const { |
} |
void MessageHandler::HandleMessage(ScopedPPVar var) { |
+ if (handler_if_0_1_) { |
+ // TODO(dmichael): Remove this code path. crbug.com/414398 |
+ message_loop_->message_loop_proxy()->PostTask(FROM_HERE, |
+ RunWhileLocked(base::Bind(&HandleMessageWrapper_0_1, |
+ handler_if_0_1_->HandleMessage, |
+ instance_, |
+ user_data_, |
+ var))); |
+ return; |
+ } |
message_loop_->message_loop_proxy()->PostTask(FROM_HERE, |
RunWhileLocked(base::Bind(&HandleMessageWrapper, |
handler_if_->HandleMessage, |
@@ -110,6 +195,17 @@ void MessageHandler::HandleMessage(ScopedPPVar var) { |
void MessageHandler::HandleBlockingMessage(ScopedPPVar var, |
scoped_ptr<IPC::Message> reply_msg) { |
+ if (handler_if_0_1_) { |
+ // TODO(dmichael): Remove this code path. crbug.com/414398 |
+ message_loop_->message_loop_proxy()->PostTask(FROM_HERE, |
+ RunWhileLocked(base::Bind(&HandleBlockingMessageWrapper_0_1, |
+ handler_if_0_1_->HandleBlockingMessage, |
+ instance_, |
+ user_data_, |
+ var, |
+ base::Passed(reply_msg.Pass())))); |
+ return; |
+ } |
message_loop_->message_loop_proxy()->PostTask(FROM_HERE, |
RunWhileLocked(base::Bind(&HandleBlockingMessageWrapper, |
handler_if_->HandleBlockingMessage, |
@@ -121,11 +217,24 @@ void MessageHandler::HandleBlockingMessage(ScopedPPVar var, |
MessageHandler::MessageHandler( |
PP_Instance instance, |
- const PPP_MessageHandler_0_1* handler_if, |
+ const PPP_MessageHandler_0_2* handler_if, |
void* user_data, |
scoped_refptr<MessageLoopResource> message_loop) |
: instance_(instance), |
handler_if_(handler_if), |
+ handler_if_0_1_(NULL), |
+ user_data_(user_data), |
+ message_loop_(message_loop) { |
+} |
+ |
+MessageHandler::MessageHandler( |
+ PP_Instance instance, |
+ const PPP_MessageHandler_0_1_Deprecated* handler_if, |
+ void* user_data, |
+ scoped_refptr<MessageLoopResource> message_loop) |
+ : instance_(instance), |
+ handler_if_(NULL), |
+ handler_if_0_1_(handler_if), |
user_data_(user_data), |
message_loop_(message_loop) { |
} |