summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ppapi/shared_impl/ppp_instance_combined.cc14
-rw-r--r--ppapi/shared_impl/ppp_instance_combined.h41
-rw-r--r--webkit/plugins/ppapi/event_conversion.cc56
-rw-r--r--webkit/plugins/ppapi/plugin_module.cc17
-rw-r--r--webkit/plugins/ppapi/ppapi_plugin_instance.cc27
-rw-r--r--webkit/plugins/ppapi/ppapi_plugin_instance.h8
6 files changed, 155 insertions, 8 deletions
diff --git a/ppapi/shared_impl/ppp_instance_combined.cc b/ppapi/shared_impl/ppp_instance_combined.cc
index 1ec928e..ffb96a4 100644
--- a/ppapi/shared_impl/ppp_instance_combined.cc
+++ b/ppapi/shared_impl/ppp_instance_combined.cc
@@ -8,7 +8,19 @@ namespace ppapi {
PPP_Instance_Combined::PPP_Instance_Combined(
const PPP_Instance_1_0& instance_if)
- : PPP_Instance_1_0(instance_if) {
+ : PPP_Instance_1_0(instance_if),
+ HandleInputEvent_0_5(NULL) {
+}
+
+PPP_Instance_Combined::PPP_Instance_Combined(
+ const PPP_Instance_0_5& instance_if)
+ : PPP_Instance_1_0(),
+ HandleInputEvent_0_5(instance_if.HandleInputEvent) {
+ DidCreate = instance_if.DidCreate;
+ DidDestroy = instance_if.DidDestroy;
+ DidChangeView = instance_if.DidChangeView;
+ DidChangeFocus = instance_if.DidChangeFocus;
+ HandleDocumentLoad = instance_if.HandleDocumentLoad;
}
} // namespace ppapi
diff --git a/ppapi/shared_impl/ppp_instance_combined.h b/ppapi/shared_impl/ppp_instance_combined.h
index 12e3301..4bba1f8 100644
--- a/ppapi/shared_impl/ppp_instance_combined.h
+++ b/ppapi/shared_impl/ppp_instance_combined.h
@@ -7,12 +7,53 @@
#include "base/basictypes.h"
#include "ppapi/c/ppp_instance.h"
+#include "ppapi/c/pp_input_event.h"
+// TODO(dmichael): This is here only for temporary backwards compatibility so
+// that NaCl and other plugins aren't broken while the change propagates. This
+// needs to be deleted in 14, because we don't intend to support PPP_Instance.
+// HandleInputEvent.
+// --- Begin backwards compatibility code.
+union PP_InputEventData {
+ struct PP_InputEvent_Key key;
+ struct PP_InputEvent_Character character;
+ struct PP_InputEvent_Mouse mouse;
+ struct PP_InputEvent_Wheel wheel;
+ char padding[64];
+};
+struct PP_InputEvent {
+ PP_InputEvent_Type type;
+ int32_t padding;
+ PP_TimeTicks time_stamp;
+ union PP_InputEventData u;
+};
+PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_InputEvent, 80);
+
+#define PPP_INSTANCE_INTERFACE_0_5 "PPP_Instance;0.5"
+
+struct PPP_Instance_0_5 {
+ PP_Bool (*DidCreate)(PP_Instance instance,
+ uint32_t argc,
+ const char* argn[],
+ const char* argv[]);
+ void (*DidDestroy)(PP_Instance instance);
+ void (*DidChangeView)(PP_Instance instance,
+ const struct PP_Rect* position,
+ const struct PP_Rect* clip);
+ void (*DidChangeFocus)(PP_Instance instance, PP_Bool has_focus);
+ PP_Bool (*HandleInputEvent)(PP_Instance instance,
+ const struct PP_InputEvent* event);
+ PP_Bool (*HandleDocumentLoad)(PP_Instance instance, PP_Resource url_loader);
+};
+// --- End backwards compatibility code.
namespace ppapi {
struct PPP_Instance_Combined : public PPP_Instance_1_0 {
public:
explicit PPP_Instance_Combined(const PPP_Instance_1_0& instance_if);
+ explicit PPP_Instance_Combined(const PPP_Instance_0_5& instance_if);
+ PP_Bool (*HandleInputEvent_0_5)(PP_Instance instance,
+ const struct PP_InputEvent* event);
DISALLOW_COPY_AND_ASSIGN(PPP_Instance_Combined);
};
diff --git a/webkit/plugins/ppapi/event_conversion.cc b/webkit/plugins/ppapi/event_conversion.cc
index eb051da..bfd9ee1 100644
--- a/webkit/plugins/ppapi/event_conversion.cc
+++ b/webkit/plugins/ppapi/event_conversion.cc
@@ -13,6 +13,8 @@
#include "base/utf_string_conversion_utils.h"
#include "ppapi/c/pp_input_event.h"
#include "ppapi/shared_impl/input_event_impl.h"
+// TODO(dmichael): Remove this include when PP_InputEvent is gone from m14.
+#include "ppapi/shared_impl/ppp_instance_combined.h"
#include "ppapi/shared_impl/time_conversion.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
#include "webkit/plugins/ppapi/common.h"
@@ -96,7 +98,7 @@ void AppendCharEvent(const WebInputEvent& event,
key_event.text[utf16_char_count])
utf16_char_count++;
- // Make a separate InputEventData for each Unicode character in the input.
+ // Make a separate PP_InputEvent for each Unicode character in the input.
base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count);
while (!iter.end()) {
InputEventData result = GetEventWithCommonFieldsAndType(event);
@@ -242,8 +244,60 @@ WebMouseWheelEvent* BuildMouseWheelEvent(const InputEventData& event) {
return mouse_wheel_event;
}
+void InputEventDataToPPInputEvent(const InputEventData& data,
+ PP_InputEvent* result) {
+ memset(result, 0, sizeof(PP_InputEvent));
+ result->type = data.event_type;
+ result->time_stamp = data.event_time_stamp;
+
+ switch (data.event_type) {
+ case PP_INPUTEVENT_TYPE_MOUSEDOWN:
+ case PP_INPUTEVENT_TYPE_MOUSEUP:
+ case PP_INPUTEVENT_TYPE_MOUSEMOVE:
+ case PP_INPUTEVENT_TYPE_MOUSEENTER:
+ case PP_INPUTEVENT_TYPE_MOUSELEAVE:
+ case PP_INPUTEVENT_TYPE_CONTEXTMENU:
+ result->u.mouse.modifier = data.event_modifiers;
+ result->u.mouse.button = data.mouse_button;
+ result->u.mouse.x = static_cast<float>(data.mouse_position.x);
+ result->u.mouse.y = static_cast<float>(data.mouse_position.y);
+ result->u.mouse.click_count = data.mouse_click_count;
+ break;
+ case PP_INPUTEVENT_TYPE_WHEEL:
+ result->u.wheel.modifier = data.event_modifiers;
+ result->u.wheel.delta_x = data.wheel_delta.x;
+ result->u.wheel.delta_y = data.wheel_delta.y;
+ result->u.wheel.wheel_ticks_x = data.wheel_ticks.x;
+ result->u.wheel.wheel_ticks_y = data.wheel_ticks.y;
+ break;
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
+ case PP_INPUTEVENT_TYPE_KEYDOWN:
+ case PP_INPUTEVENT_TYPE_KEYUP:
+ result->u.key.modifier = data.event_modifiers;
+ result->u.key.key_code = data.key_code;
+ break;
+ case PP_INPUTEVENT_TYPE_CHAR:
+ result->u.character.modifier = data.event_modifiers;
+ base::strlcpy(result->u.character.text, data.character_text.c_str(),
+ arraysize(result->u.character.text));
+ break;
+ case PP_INPUTEVENT_TYPE_UNDEFINED:
+ break;
+ }
+}
+
} // namespace
+void CreatePPEvent(const WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events) {
+ std::vector<InputEventData> data;
+ CreateInputEventData(event, &data);
+
+ pp_events->resize(data.size());
+ for (size_t i = 0; i < data.size(); i++)
+ InputEventDataToPPInputEvent(data[i], &(*pp_events)[i]);
+}
+
void CreateInputEventData(const WebInputEvent& event,
std::vector<InputEventData>* result) {
result->clear();
diff --git a/webkit/plugins/ppapi/plugin_module.cc b/webkit/plugins/ppapi/plugin_module.cc
index c665325..62d69cc 100644
--- a/webkit/plugins/ppapi/plugin_module.cc
+++ b/webkit/plugins/ppapi/plugin_module.cc
@@ -74,6 +74,9 @@
#include "ppapi/c/trusted/ppb_image_data_trusted.h"
#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
#include "ppapi/shared_impl/input_event_impl.h"
+// TODO(dmichael): Delete this include after PPP_Instance_0_5 goes away in m14.
+// This is just to get the PPP_INSTANCE_0_5 definition.
+#include "ppapi/shared_impl/ppp_instance_combined.h"
#include "ppapi/shared_impl/time_conversion.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/thunk.h"
@@ -289,19 +292,19 @@ const void* GetInterface(const char* name) {
return ::ppapi::thunk::GetPPB_ImageData_Thunk();
if (strcmp(name, PPB_IMAGEDATA_TRUSTED_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_ImageDataTrusted_Thunk();
- if (strcmp(name, PPB_INPUT_EVENT_INTERFACE_1_0) == 0)
+ if (strcmp(name, PPB_INPUT_EVENT_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_InputEvent_Thunk();
if (strcmp(name, PPB_INSTANCE_INTERFACE_1_0) == 0)
return ::ppapi::thunk::GetPPB_Instance_1_0_Thunk();
if (strcmp(name, PPB_INSTANCE_PRIVATE_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_Instance_Private_Thunk();
- if (strcmp(name, PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0) == 0)
+ if (strcmp(name, PPB_KEYBOARD_INPUT_EVENT_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_KeyboardInputEvent_Thunk();
if (strcmp(name, PPB_MEMORY_DEV_INTERFACE) == 0)
return PPB_Memory_Impl::GetInterface();
if (strcmp(name, PPB_MESSAGING_INTERFACE_1_0) == 0)
return ::ppapi::thunk::GetPPB_Messaging_Thunk();
- if (strcmp(name, PPB_MOUSE_INPUT_EVENT_INTERFACE_1_0) == 0)
+ if (strcmp(name, PPB_MOUSE_INPUT_EVENT_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_MouseInputEvent_Thunk();
if (strcmp(name, PPB_PROXY_PRIVATE_INTERFACE) == 0)
return PPB_Proxy_Impl::GetInterface();
@@ -329,7 +332,7 @@ const void* GetInterface(const char* name) {
return ::ppapi::thunk::GetPPB_VideoDecoder_Thunk();
if (strcmp(name, PPB_VIDEOLAYER_DEV_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_VideoLayer_Thunk();
- if (strcmp(name, PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0) == 0)
+ if (strcmp(name, PPB_WHEEL_INPUT_EVENT_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_WheelInputEvent_Thunk();
if (strcmp(name, PPB_WIDGET_DEV_INTERFACE) == 0)
return ::ppapi::thunk::GetPPB_Widget_Thunk();
@@ -506,7 +509,11 @@ PluginInstance* PluginModule::CreateInstance(PluginDelegate* delegate) {
const void* ppp_instance = GetPluginInterface(PPP_INSTANCE_INTERFACE_1_0);
if (ppp_instance) {
instance = PluginInstance::Create1_0(delegate, this, ppp_instance);
- } if (!instance) {
+ } else if ((ppp_instance = GetPluginInterface(PPP_INSTANCE_INTERFACE_0_5))) {
+ // TODO(dmichael): Remove support for 0.5 in m14.
+ instance = PluginInstance::Create0_5(delegate, this, ppp_instance);
+ }
+ if (!instance) {
LOG(WARNING) << "Plugin doesn't support instance interface, failing.";
return NULL;
}
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc
index 56682d1..ecc7125 100644
--- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc
+++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc
@@ -189,6 +189,18 @@ void RectToPPRect(const gfx::Rect& input, PP_Rect* output) {
} // namespace
// static
+PluginInstance* PluginInstance::Create0_5(PluginDelegate* delegate,
+ PluginModule* module,
+ const void* ppp_instance_if_0_5) {
+ const PPP_Instance_0_5* interface =
+ static_cast<const PPP_Instance_0_5*>(ppp_instance_if_0_5);
+ return new PluginInstance(
+ delegate,
+ module,
+ new ::ppapi::PPP_Instance_Combined(*interface));
+}
+
+// static
PluginInstance* PluginInstance::Create1_0(PluginDelegate* delegate,
PluginModule* module,
const void* ppp_instance_if_1_0) {
@@ -468,6 +480,21 @@ bool PluginInstance::HandleInputEvent(const WebKit::WebInputEvent& event,
}
}
+ // For compatibility, also send all input events through the old interface,
+ // if it exists.
+ // TODO(brettw) remove this.
+ if (instance_interface_->HandleInputEvent_0_5) {
+ std::vector<PP_InputEvent> pp_events;
+ CreatePPEvent(event, &pp_events);
+
+ // Each input event may generate more than one PP_InputEvent.
+ for (size_t i = 0; i < pp_events.size(); i++) {
+ rv |= PP_ToBool(
+ instance_interface_->HandleInputEvent_0_5(pp_instance(),
+ &pp_events[i]));
+ }
+ }
+
if (cursor_.get())
*cursor_info = *cursor_;
return rv;
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.h b/webkit/plugins/ppapi/ppapi_plugin_instance.h
index f3e71a2..a69c54a 100644
--- a/webkit/plugins/ppapi/ppapi_plugin_instance.h
+++ b/webkit/plugins/ppapi/ppapi_plugin_instance.h
@@ -86,8 +86,14 @@ class PluginInstance : public base::RefCounted<PluginInstance>,
public ::ppapi::thunk::PPB_Instance_FunctionAPI,
public ::ppapi::InstanceImpl {
public:
+ // TODO(dmichael): Delete this for m14.
// Create and return a PluginInstance object which supports the
- // PPP_Instance_1_0 interface.
+ // PPP_Instance_0_5 interface.
+ static PluginInstance* Create0_5(PluginDelegate* delegate,
+ PluginModule* module,
+ const void* ppp_instance_if_0_5);
+ // Create and return a PluginInstance object which supports the
+ // PPP_Instance_0_5 interface.
static PluginInstance* Create1_0(PluginDelegate* delegate,
PluginModule* module,
const void* ppp_instance_if_1_0);