| Index: webkit/plugins/ppapi/ppapi_plugin_instance.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/ppapi_plugin_instance.cc (revision 77426)
|
| +++ webkit/plugins/ppapi/ppapi_plugin_instance.cc (working copy)
|
| @@ -42,6 +42,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"
|
| @@ -99,7 +100,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);
|
| @@ -201,12 +203,20 @@
|
| return instance->ExecuteScript(script, exception);
|
| }
|
|
|
| +void PostMessage(PP_Instance instance_id, PP_Var message) {
|
| + PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id);
|
| + if (!instance)
|
| + return;
|
| + instance->PostMessage(message);
|
| +}
|
| +
|
| const PPB_Instance ppb_instance = {
|
| &GetWindowObject,
|
| &GetOwnerElementObject,
|
| &BindGraphics,
|
| &IsFullFrame,
|
| &ExecuteScript,
|
| + &PostMessage
|
| };
|
|
|
| void NumberOfFindResultsChanged(PP_Instance instance_id,
|
| @@ -314,7 +324,8 @@
|
|
|
| PluginInstance::PluginInstance(PluginDelegate* delegate,
|
| PluginModule* module,
|
| - const PPP_Instance* instance_interface)
|
| + const PPP_Instance* instance_interface,
|
| + InterfaceOwner ppp_instance_owner)
|
| : delegate_(delegate),
|
| module_(module),
|
| instance_interface_(instance_interface),
|
| @@ -335,13 +346,16 @@
|
| plugin_graphics_3d_interface_(NULL),
|
| always_on_top_(false),
|
| fullscreen_container_(NULL),
|
| - fullscreen_(false) {
|
| + fullscreen_(false),
|
| + message_channel_(NULL),
|
| + ppp_instance_owner_(ppp_instance_owner) {
|
| pp_instance_ = ResourceTracker::Get()->AddInstance(this);
|
|
|
| memset(¤t_print_settings_, 0, sizeof(current_print_settings_));
|
| DCHECK(delegate);
|
| module_->InstanceCreated(this);
|
| delegate_->InstanceCreated(this);
|
| + message_channel_.reset(new MessageChannel(this));
|
| }
|
|
|
| PluginInstance::~PluginInstance() {
|
| @@ -363,11 +377,25 @@
|
| #if defined(OS_LINUX)
|
| ranges_.clear();
|
| #endif // defined(OS_LINUX)
|
| +
|
| + if (BROWSER_OWNS_INTERFACE == ppp_instance_owner_)
|
| + delete const_cast<PPP_Instance*>(instance_interface_);
|
| }
|
|
|
| // static
|
| -const PPB_Instance* PluginInstance::GetInterface() {
|
| - return &ppb_instance;
|
| +const void* PluginInstance::GetInterface(const std::string& interface) {
|
| + // At the time of writing, we support both 0.4 and 0.5. But for future-
|
| + // proofing, we also compare to PPB_INSTANCE_INTERFACE so that we can work
|
| + // with later versions, assuming other parts work. If PPB_Instance changes
|
| + // in a fashion that breaks the struct layout (e.g. modifying or deleting
|
| + // functions), this code must either get more complicated (to return a
|
| + // different, backwards-compatible struct) or just get rid of support for
|
| + // 0.4 and 0.5.
|
| + if ((interface == PPB_INSTANCE_INTERFACE_0_4)
|
| + || (interface == PPB_INSTANCE_INTERFACE_0_5)
|
| + || (interface == PPB_INSTANCE_INTERFACE))
|
| + return &ppb_instance;
|
| + return NULL;
|
| }
|
|
|
| // static
|
| @@ -590,6 +618,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);
|
| @@ -649,6 +681,13 @@
|
| return rv;
|
| }
|
|
|
| +void PluginInstance::HandleMessage(PP_Var message) {
|
| + if ((instance_interface_ != NULL) &&
|
| + (instance_interface_->HandleMessage != NULL)) {
|
| + instance_interface_->HandleMessage(pp_instance(), message);
|
| + }
|
| +}
|
| +
|
| PP_Var PluginInstance::GetInstanceObject() {
|
| return instance_interface_->GetInstanceObject(pp_instance());
|
| }
|
|
|