Index: ppapi/proxy/ppb_instance_proxy.cc |
=================================================================== |
--- ppapi/proxy/ppb_instance_proxy.cc (revision 106763) |
+++ ppapi/proxy/ppb_instance_proxy.cc (working copy) |
@@ -9,6 +9,7 @@ |
#include "ppapi/c/ppb_instance.h" |
#include "ppapi/c/ppb_messaging.h" |
#include "ppapi/c/ppb_mouse_lock.h" |
+#include "ppapi/proxy/enter_proxy.h" |
#include "ppapi/proxy/host_dispatcher.h" |
#include "ppapi/proxy/plugin_dispatcher.h" |
#include "ppapi/proxy/ppapi_messages.h" |
@@ -41,7 +42,8 @@ |
} // namespace |
PPB_Instance_Proxy::PPB_Instance_Proxy(Dispatcher* dispatcher) |
- : InterfaceProxy(dispatcher) { |
+ : InterfaceProxy(dispatcher), |
+ callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
} |
PPB_Instance_Proxy::~PPB_Instance_Proxy() { |
@@ -68,6 +70,7 @@ |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(PPB_Instance_Proxy, msg) |
+ // Plugin -> Host messages. |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_GetWindowObject, |
OnMsgGetWindowObject) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_GetOwnerElementObject, |
@@ -112,6 +115,11 @@ |
OnMsgGetDocumentURL) |
IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBInstance_GetPluginInstanceURL, |
OnMsgGetPluginInstanceURL) |
+ |
+ // Host -> Plugin messages. |
+ IPC_MESSAGE_HANDLER(PpapiMsg_PPBInstance_MouseLockComplete, |
+ OnMsgMouseLockComplete) |
+ |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |
@@ -362,8 +370,17 @@ |
if (!callback.func) |
return PP_ERROR_BADARGUMENT; |
+ // Save the mouse callback on the instance data. |
+ InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())-> |
+ GetInstanceData(instance); |
+ if (!data) |
+ return PP_ERROR_BADARGUMENT; |
+ if (data->mouse_lock_callback.func) |
+ return PP_ERROR_INPROGRESS; // Already have a pending callback. |
+ data->mouse_lock_callback = callback; |
+ |
dispatcher()->Send(new PpapiHostMsg_PPBInstance_LockMouse( |
- API_ID_PPB_INSTANCE, instance, SendCallback(callback))); |
+ API_ID_PPB_INSTANCE, instance)); |
return PP_OK_COMPLETIONPENDING; |
} |
@@ -514,15 +531,12 @@ |
enter.functions()->PostMessage(instance, message.Get(dispatcher())); |
} |
-void PPB_Instance_Proxy::OnMsgLockMouse(PP_Instance instance, |
- uint32_t serialized_callback) { |
- EnterFunctionNoLock<PPB_Instance_FunctionAPI> enter(instance, true); |
- if (enter.failed()) |
- return; |
- PP_CompletionCallback callback = ReceiveCallback(serialized_callback); |
- int32_t result = enter.functions()->LockMouse(instance, callback); |
- if (result != PP_OK_COMPLETIONPENDING) |
- PP_RunCompletionCallback(&callback, result); |
+void PPB_Instance_Proxy::OnMsgLockMouse(PP_Instance instance) { |
+ EnterHostFunctionForceCallback<PPB_Instance_FunctionAPI> enter( |
+ instance, callback_factory_, |
+ &PPB_Instance_Proxy::MouseLockCompleteInHost, instance); |
+ if (enter.succeeded()) |
+ enter.SetResult(enter.functions()->LockMouse(instance, enter.callback())); |
} |
void PPB_Instance_Proxy::OnMsgUnlockMouse(PP_Instance instance) { |
@@ -580,5 +594,25 @@ |
} |
} |
+void PPB_Instance_Proxy::OnMsgMouseLockComplete(PP_Instance instance, |
+ int32_t result) { |
+ // Save the mouse callback on the instance data. |
+ InstanceData* data = static_cast<PluginDispatcher*>(dispatcher())-> |
+ GetInstanceData(instance); |
+ if (!data) |
+ return; // Instance was probably deleted. |
+ if (!data->mouse_lock_callback.func) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ PP_RunAndClearCompletionCallback(&data->mouse_lock_callback, result); |
+} |
+ |
+void PPB_Instance_Proxy::MouseLockCompleteInHost(int32_t result, |
+ PP_Instance instance) { |
+ dispatcher()->Send(new PpapiMsg_PPBInstance_MouseLockComplete( |
+ API_ID_PPB_INSTANCE, instance, result)); |
+} |
+ |
} // namespace proxy |
} // namespace ppapi |