Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(274)

Unified Diff: ppapi/proxy/ppp_messaging_proxy.cc

Issue 264303002: PPAPI: Implement synchronous postMessage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698