Index: webkit/plugins/ppapi/ppapi_plugin_instance.cc |
=================================================================== |
--- webkit/plugins/ppapi/ppapi_plugin_instance.cc (revision 78988) |
+++ webkit/plugins/ppapi/ppapi_plugin_instance.cc (working copy) |
@@ -11,8 +11,10 @@ |
#include "base/utf_string_conversions.h" |
#include "ppapi/c/dev/ppb_find_dev.h" |
#include "ppapi/c/dev/ppb_fullscreen_dev.h" |
+#include "ppapi/c/dev/ppb_messaging_dev.h" |
#include "ppapi/c/dev/ppb_zoom_dev.h" |
#include "ppapi/c/dev/ppp_find_dev.h" |
+#include "ppapi/c/dev/ppp_messaging_dev.h" |
#include "ppapi/c/dev/ppp_selection_dev.h" |
#include "ppapi/c/dev/ppp_zoom_dev.h" |
#include "ppapi/c/pp_input_event.h" |
@@ -42,6 +44,7 @@ |
#include "webkit/plugins/ppapi/common.h" |
#include "webkit/plugins/ppapi/event_conversion.h" |
#include "webkit/plugins/ppapi/fullscreen_container.h" |
+#include "webkit/plugins/ppapi/message_channel.h" |
#include "webkit/plugins/ppapi/plugin_delegate.h" |
#include "webkit/plugins/ppapi/plugin_module.h" |
#include "webkit/plugins/ppapi/plugin_object.h" |
@@ -100,7 +103,8 @@ |
namespace { |
#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ |
- COMPILE_ASSERT(int(WebCursorInfo::webkit_name) == int(np_name), \ |
+ COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ |
+ == static_cast<int>(np_name), \ |
mismatching_enums) |
COMPILE_ASSERT_MATCHING_ENUM(TypePointer, PP_CURSORTYPE_POINTER); |
@@ -262,13 +266,23 @@ |
return PP_TRUE; |
} |
- |
const PPB_Fullscreen_Dev ppb_fullscreen = { |
&IsFullscreen, |
&SetFullscreen, |
&GetScreenSize |
}; |
+void PostMessage(PP_Instance instance_id, PP_Var message) { |
+ PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
+ if (!instance) |
+ return; |
+ instance->PostMessage(message); |
+} |
+ |
+const PPB_Messaging_Dev ppb_messaging = { |
+ &PostMessage |
+}; |
+ |
void ZoomChanged(PP_Instance instance_id, double factor) { |
PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
if (!instance) |
@@ -326,9 +340,11 @@ |
has_content_area_focus_(false), |
find_identifier_(-1), |
plugin_find_interface_(NULL), |
+ plugin_messaging_interface_(NULL), |
plugin_pdf_interface_(NULL), |
plugin_selection_interface_(NULL), |
plugin_zoom_interface_(NULL), |
+ checked_for_plugin_messaging_interface_(false), |
#if defined(OS_LINUX) |
canvas_(NULL), |
#endif // defined(OS_LINUX) |
@@ -337,6 +353,7 @@ |
always_on_top_(false), |
fullscreen_container_(NULL), |
fullscreen_(false), |
+ message_channel_(NULL), |
sad_plugin_(NULL) { |
pp_instance_ = ResourceTracker::Get()->AddInstance(this); |
@@ -344,6 +361,7 @@ |
DCHECK(delegate); |
module_->InstanceCreated(this); |
delegate_->InstanceCreated(this); |
+ message_channel_.reset(new MessageChannel(this)); |
} |
PluginInstance::~PluginInstance() { |
@@ -383,6 +401,11 @@ |
} |
// static |
+const PPB_Messaging_Dev* PluginInstance::GetMessagingInterface() { |
+ return &ppb_messaging; |
+} |
+ |
+// static |
const PPB_Zoom_Dev* PluginInstance::GetZoomInterface() { |
return &ppb_zoom; |
} |
@@ -604,6 +627,10 @@ |
return ret; |
} |
+void PluginInstance::PostMessage(PP_Var message) { |
+ message_channel_->PostMessageToJavaScript(message); |
+} |
+ |
void PluginInstance::Delete() { |
// Keep a reference on the stack. See NOTE above. |
scoped_refptr<PluginInstance> ref(this); |
@@ -663,6 +690,14 @@ |
return rv; |
} |
+void PluginInstance::HandleMessage(PP_Var message) { |
+ // Keep a reference on the stack. See NOTE above. |
+ scoped_refptr<PluginInstance> ref(this); |
+ if (!LoadMessagingInterface()) |
+ return; |
+ plugin_messaging_interface_->HandleMessage(pp_instance(), message); |
+} |
+ |
PP_Var PluginInstance::GetInstanceObject() { |
return instance_interface_->GetInstanceObject(pp_instance()); |
} |
@@ -839,6 +874,17 @@ |
return !!plugin_find_interface_; |
} |
+bool PluginInstance::LoadMessagingInterface() { |
+ if (!checked_for_plugin_messaging_interface_) { |
+ checked_for_plugin_messaging_interface_ = true; |
+ plugin_messaging_interface_ = |
+ reinterpret_cast<const PPP_Messaging_Dev*>(module_->GetPluginInterface( |
+ PPP_MESSAGING_DEV_INTERFACE)); |
+ } |
+ |
+ return !!plugin_messaging_interface_; |
+} |
+ |
bool PluginInstance::LoadPdfInterface() { |
if (!plugin_pdf_interface_) { |
plugin_pdf_interface_ = |