diff options
-rw-r--r-- | ppapi/shared_impl/ppp_instance_combined.cc | 14 | ||||
-rw-r--r-- | ppapi/shared_impl/ppp_instance_combined.h | 41 | ||||
-rw-r--r-- | webkit/plugins/ppapi/event_conversion.cc | 56 | ||||
-rw-r--r-- | webkit/plugins/ppapi/plugin_module.cc | 17 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.cc | 27 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.h | 8 |
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); |