| Index: ppapi/cpp/instance.cc
|
| diff --git a/ppapi/cpp/instance.cc b/ppapi/cpp/instance.cc
|
| index a5be2b9761358af70c48fb7628a7cfb08375af1b..74b93216729dfe7d1bc5bb6ec09e93f7c72f8bbf 100644
|
| --- a/ppapi/cpp/instance.cc
|
| +++ b/ppapi/cpp/instance.cc
|
| @@ -9,12 +9,15 @@
|
| #include "ppapi/c/ppb_input_event.h"
|
| #include "ppapi/c/ppb_instance.h"
|
| #include "ppapi/c/ppb_messaging.h"
|
| +#include "ppapi/c/ppp_message_handler.h"
|
| #include "ppapi/cpp/compositor.h"
|
| #include "ppapi/cpp/graphics_2d.h"
|
| #include "ppapi/cpp/graphics_3d.h"
|
| #include "ppapi/cpp/image_data.h"
|
| #include "ppapi/cpp/instance_handle.h"
|
| #include "ppapi/cpp/logging.h"
|
| +#include "ppapi/cpp/message_handler.h"
|
| +#include "ppapi/cpp/message_loop.h"
|
| #include "ppapi/cpp/module.h"
|
| #include "ppapi/cpp/module_impl.h"
|
| #include "ppapi/cpp/point.h"
|
| @@ -42,6 +45,38 @@ template <> const char* interface_name<PPB_Messaging_1_0>() {
|
| return PPB_MESSAGING_INTERFACE_1_0;
|
| }
|
|
|
| +template <> const char* interface_name<PPB_Messaging_1_2>() {
|
| + return PPB_MESSAGING_INTERFACE_1_2;
|
| +}
|
| +
|
| +// PPP_MessageHandler implementation -------------------------------------------
|
| +void HandleMessage(PP_Instance pp_instance,
|
| + void* user_data,
|
| + const PP_Var* var) {
|
| + MessageHandler* message_handler = static_cast<MessageHandler*>(user_data);
|
| + message_handler->HandleMessage(InstanceHandle(pp_instance), Var(*var));
|
| +}
|
| +
|
| +void HandleBlockingMessage(PP_Instance pp_instance,
|
| + void* user_data,
|
| + const PP_Var* var,
|
| + PP_Var* result) {
|
| + MessageHandler* message_handler = static_cast<MessageHandler*>(user_data);
|
| + pp::Var result_var =
|
| + message_handler->HandleBlockingMessage(InstanceHandle(pp_instance),
|
| + Var(*var));
|
| + *result = result_var.Detach();
|
| +}
|
| +
|
| +void Destroy(PP_Instance pp_instance, void* user_data) {
|
| + MessageHandler* message_handler = static_cast<MessageHandler*>(user_data);
|
| + message_handler->WasUnregistered(InstanceHandle(pp_instance));
|
| +}
|
| +
|
| +static PPP_MessageHandler_0_2 message_handler_if = {
|
| + &HandleMessage, &HandleBlockingMessage, &Destroy
|
| +};
|
| +
|
| } // namespace
|
|
|
| Instance::Instance(PP_Instance instance) : pp_instance_(instance) {
|
| @@ -130,10 +165,30 @@ void Instance::ClearInputEventRequest(uint32_t event_classes) {
|
| }
|
|
|
| void Instance::PostMessage(const Var& message) {
|
| - if (!has_interface<PPB_Messaging_1_0>())
|
| + if (has_interface<PPB_Messaging_1_2>()) {
|
| + get_interface<PPB_Messaging_1_2>()->PostMessage(pp_instance(),
|
| + message.pp_var());
|
| + } else if (has_interface<PPB_Messaging_1_0>()) {
|
| + get_interface<PPB_Messaging_1_0>()->PostMessage(pp_instance(),
|
| + message.pp_var());
|
| + }
|
| +}
|
| +
|
| +int32_t Instance::RegisterMessageHandler(MessageHandler* message_handler,
|
| + const MessageLoop& message_loop) {
|
| + if (!has_interface<PPB_Messaging_1_2>())
|
| + return PP_ERROR_NOTSUPPORTED;
|
| + return get_interface<PPB_Messaging_1_2>()->RegisterMessageHandler(
|
| + pp_instance(),
|
| + message_handler,
|
| + &message_handler_if,
|
| + message_loop.pp_resource());
|
| +}
|
| +
|
| +void Instance::UnregisterMessageHandler() {
|
| + if (!has_interface<PPB_Messaging_1_2>())
|
| return;
|
| - get_interface<PPB_Messaging_1_0>()->PostMessage(pp_instance(),
|
| - message.pp_var());
|
| + get_interface<PPB_Messaging_1_2>()->UnregisterMessageHandler(pp_instance());
|
| }
|
|
|
| void Instance::LogToConsole(PP_LogLevel level, const Var& value) {
|
|
|