summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DEPS2
-rw-r--r--base/i18n/char_iterator.cc20
-rw-r--r--base/i18n/char_iterator.h5
-rw-r--r--remoting/client/plugin/chromoting_instance.cc23
-rw-r--r--remoting/client/plugin/chromoting_instance.h4
-rw-r--r--remoting/client/plugin/pepper_input_handler.cc21
-rw-r--r--remoting/client/plugin/pepper_input_handler.h12
-rw-r--r--webkit/glue/plugins/pepper_event_conversion.cc288
-rw-r--r--webkit/glue/plugins/pepper_event_conversion.h18
-rw-r--r--webkit/glue/plugins/pepper_plugin_instance.cc17
-rw-r--r--webkit/glue/plugins/pepper_plugin_instance.h1
-rw-r--r--webkit/glue/plugins/pepper_scrollbar.cc2
-rw-r--r--webkit/glue/plugins/pepper_scrollbar.h2
-rw-r--r--webkit/glue/plugins/pepper_webplugin_impl.cc1
-rw-r--r--webkit/glue/plugins/pepper_widget.cc2
-rw-r--r--webkit/glue/plugins/pepper_widget.h4
16 files changed, 261 insertions, 161 deletions
diff --git a/DEPS b/DEPS
index 7287ecd..ed7c01c 100644
--- a/DEPS
+++ b/DEPS
@@ -167,7 +167,7 @@ deps = {
Var("libvpx_revision"),
"src/third_party/ppapi":
- (Var("googlecode_url") % "ppapi") + "/trunk@256",
+ (Var("googlecode_url") % "ppapi") + "/trunk@259",
"src/third_party/libjingle/source":
(Var("googlecode_url") % "libjingle") + "/branches/nextsnap@" +
diff --git a/base/i18n/char_iterator.cc b/base/i18n/char_iterator.cc
index c323c5d..a6cf944 100644
--- a/base/i18n/char_iterator.cc
+++ b/base/i18n/char_iterator.cc
@@ -40,7 +40,18 @@ UTF16CharIterator::UTF16CharIterator(const string16* str)
char_pos_(0),
char_(0) {
if (len_)
- U16_NEXT(str_, next_pos_, len_, char_);
+ ReadChar();
+}
+
+UTF16CharIterator::UTF16CharIterator(const char16* str, size_t str_len)
+ : str_(str),
+ len_(str_len),
+ array_pos_(0),
+ next_pos_(0),
+ char_pos_(0),
+ char_(0) {
+ if (len_)
+ ReadChar();
}
bool UTF16CharIterator::Advance() {
@@ -50,9 +61,14 @@ bool UTF16CharIterator::Advance() {
array_pos_ = next_pos_;
char_pos_++;
if (next_pos_ < len_)
- U16_NEXT(str_, next_pos_, len_, char_);
+ ReadChar();
return true;
}
+void UTF16CharIterator::ReadChar() {
+ // This is actually a huge macro, so is worth having in a separate function.
+ U16_NEXT(str_, next_pos_, len_, char_);
+}
+
} // namespace base
diff --git a/base/i18n/char_iterator.h b/base/i18n/char_iterator.h
index 784c6e5d..835ac06 100644
--- a/base/i18n/char_iterator.h
+++ b/base/i18n/char_iterator.h
@@ -76,6 +76,7 @@ class UTF16CharIterator {
public:
// Requires |str| to live as long as the UTF16CharIterator does.
UTF16CharIterator(const string16* str);
+ UTF16CharIterator(const char16* str, size_t str_len);
~UTF16CharIterator() {}
// Return the starting array index of the current character within the
@@ -97,6 +98,10 @@ class UTF16CharIterator {
bool Advance();
private:
+ // Fills in the current character we found and advances to the next
+ // character, updating all flags as necessary.
+ void ReadChar();
+
// The string we're iterating over.
const char16* str_;
diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc
index 71f3563..0c63c49 100644
--- a/remoting/client/plugin/chromoting_instance.cc
+++ b/remoting/client/plugin/chromoting_instance.cc
@@ -19,7 +19,7 @@
#include "remoting/client/plugin/pepper_input_handler.h"
#include "remoting/client/plugin/pepper_view.h"
#include "remoting/jingle_glue/jingle_thread.h"
-#include "third_party/ppapi/c/pp_event.h"
+#include "third_party/ppapi/c/pp_input_event.h"
#include "third_party/ppapi/cpp/completion_callback.h"
#include "third_party/ppapi/cpp/rect.h"
@@ -112,33 +112,34 @@ bool ChromotingInstance::CurrentlyOnPluginThread() const {
return pepper_main_loop_dont_post_to_me_ == MessageLoop::current();
}
-bool ChromotingInstance::HandleEvent(const PP_Event& event) {
+bool ChromotingInstance::HandleEvent(const PP_InputEvent& event) {
DCHECK(CurrentlyOnPluginThread());
PepperInputHandler* pih
= static_cast<PepperInputHandler*>(input_handler_.get());
switch (event.type) {
- case PP_EVENT_TYPE_MOUSEDOWN:
+ case PP_INPUTEVENT_TYPE_MOUSEDOWN:
pih->HandleMouseButtonEvent(true, event.u.mouse);
return true;
- case PP_EVENT_TYPE_MOUSEUP:
+ case PP_INPUTEVENT_TYPE_MOUSEUP:
pih->HandleMouseButtonEvent(false, event.u.mouse);
return true;
- case PP_EVENT_TYPE_MOUSEMOVE:
- case PP_EVENT_TYPE_MOUSEENTER:
- case PP_EVENT_TYPE_MOUSELEAVE:
+ case PP_INPUTEVENT_TYPE_MOUSEMOVE:
+ case PP_INPUTEVENT_TYPE_MOUSEENTER:
+ case PP_INPUTEVENT_TYPE_MOUSELEAVE:
pih->HandleMouseMoveEvent(event.u.mouse);
return true;
- case PP_EVENT_TYPE_KEYDOWN:
- case PP_EVENT_TYPE_KEYUP:
- pih->HandleKeyEvent(event.type == PP_EVENT_TYPE_KEYDOWN, event.u.key);
+ case PP_INPUTEVENT_TYPE_KEYDOWN:
+ case PP_INPUTEVENT_TYPE_KEYUP:
+ pih->HandleKeyEvent(event.type == PP_INPUTEVENT_TYPE_KEYDOWN,
+ event.u.key);
return true;
- case PP_EVENT_TYPE_CHAR:
+ case PP_INPUTEVENT_TYPE_CHAR:
pih->HandleCharacterEvent(event.u.character);
return true;
diff --git a/remoting/client/plugin/chromoting_instance.h b/remoting/client/plugin/chromoting_instance.h
index 6d6d6f7..9001838 100644
--- a/remoting/client/plugin/chromoting_instance.h
+++ b/remoting/client/plugin/chromoting_instance.h
@@ -14,7 +14,6 @@
#include "base/scoped_ptr.h"
#include "remoting/client/client_context.h"
#include "remoting/client/host_connection.h"
-#include "third_party/ppapi/c/pp_event.h"
#include "third_party/ppapi/c/pp_instance.h"
#include "third_party/ppapi/c/pp_rect.h"
#include "third_party/ppapi/c/pp_resource.h"
@@ -22,6 +21,7 @@
#include "third_party/ppapi/cpp/var.h"
class MessageLoop;
+struct PP_InputEvent;
namespace base {
class Thread;
@@ -50,7 +50,7 @@ class ChromotingInstance : public pp::Instance {
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]);
virtual void Connect(const ClientConfig& config);
- virtual bool HandleEvent(const PP_Event& event);
+ virtual bool HandleEvent(const PP_InputEvent& event);
virtual pp::Var GetInstanceObject();
virtual void ViewChanged(const pp::Rect& position, const pp::Rect& clip);
diff --git a/remoting/client/plugin/pepper_input_handler.cc b/remoting/client/plugin/pepper_input_handler.cc
index 2ba1603..c5677bd 100644
--- a/remoting/client/plugin/pepper_input_handler.cc
+++ b/remoting/client/plugin/pepper_input_handler.cc
@@ -4,6 +4,8 @@
#include "remoting/client/plugin/pepper_input_handler.h"
+#include "third_party/ppapi/c/pp_input_event.h"
+
namespace remoting {
PepperInputHandler::PepperInputHandler(ClientContext* context,
@@ -19,27 +21,28 @@ void PepperInputHandler::Initialize() {
}
void PepperInputHandler::HandleKeyEvent(bool keydown,
- const PP_Event_Key& event) {
- SendKeyEvent(keydown, event.normalizedKeyCode);
+ const PP_InputEvent_Key& event) {
+ SendKeyEvent(keydown, event.key_code);
}
-void PepperInputHandler::HandleCharacterEvent(const PP_Event_Character& event) {
+void PepperInputHandler::HandleCharacterEvent(const PP_InputEvent_Character& event) {
// TODO(garykac): Coordinate key and char events.
}
-void PepperInputHandler::HandleMouseMoveEvent(const PP_Event_Mouse& event) {
+void PepperInputHandler::HandleMouseMoveEvent(const PP_InputEvent_Mouse& event) {
SendMouseMoveEvent(static_cast<int>(event.x),
static_cast<int>(event.y));
}
-void PepperInputHandler::HandleMouseButtonEvent(bool button_down,
- const PP_Event_Mouse& event) {
+void PepperInputHandler::HandleMouseButtonEvent(
+ bool button_down,
+ const PP_InputEvent_Mouse& event) {
MouseButton button = MouseButtonUndefined;
- if (event.button == PP_EVENT_MOUSEBUTTON_LEFT) {
+ if (event.button == PP_INPUTEVENT_MOUSEBUTTON_LEFT) {
button = MouseButtonLeft;
- } else if (event.button == PP_EVENT_MOUSEBUTTON_MIDDLE) {
+ } else if (event.button == PP_INPUTEVENT_MOUSEBUTTON_MIDDLE) {
button = MouseButtonMiddle;
- } else if (event.button == PP_EVENT_MOUSEBUTTON_RIGHT) {
+ } else if (event.button == PP_INPUTEVENT_MOUSEBUTTON_RIGHT) {
button = MouseButtonRight;
}
diff --git a/remoting/client/plugin/pepper_input_handler.h b/remoting/client/plugin/pepper_input_handler.h
index dd2a76e..f7ad657 100644
--- a/remoting/client/plugin/pepper_input_handler.h
+++ b/remoting/client/plugin/pepper_input_handler.h
@@ -7,7 +7,9 @@
#include "remoting/client/input_handler.h"
-#include "third_party/ppapi/c/pp_event.h"
+struct PP_InputEvent_Character;
+struct PP_InputEvent_Key;
+struct PP_InputEvent_Mouse;
namespace remoting {
@@ -20,12 +22,12 @@ class PepperInputHandler : public InputHandler {
void Initialize();
- void HandleKeyEvent(bool keydown, const PP_Event_Key& event);
- void HandleCharacterEvent(const PP_Event_Character& event);
+ void HandleKeyEvent(bool keydown, const PP_InputEvent_Key& event);
+ void HandleCharacterEvent(const PP_InputEvent_Character& event);
- void HandleMouseMoveEvent(const PP_Event_Mouse& event);
+ void HandleMouseMoveEvent(const PP_InputEvent_Mouse& event);
void HandleMouseButtonEvent(bool button_down,
- const PP_Event_Mouse& event);
+ const PP_InputEvent_Mouse& event);
private:
DISALLOW_COPY_AND_ASSIGN(PepperInputHandler);
diff --git a/webkit/glue/plugins/pepper_event_conversion.cc b/webkit/glue/plugins/pepper_event_conversion.cc
index 99297e6..7c4f779 100644
--- a/webkit/glue/plugins/pepper_event_conversion.cc
+++ b/webkit/glue/plugins/pepper_event_conversion.cc
@@ -4,9 +4,13 @@
#include "webkit/glue/plugins/pepper_event_conversion.h"
+#include "base/i18n/char_iterator.h"
#include "base/logging.h"
#include "base/scoped_ptr.h"
-#include "third_party/ppapi/c/pp_event.h"
+#include "base/string_util.h"
+#include "base/utf_string_conversions.h"
+#include "base/utf_string_conversion_utils.h"
+#include "third_party/ppapi/c/pp_input_event.h"
#include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h"
using WebKit::WebInputEvent;
@@ -15,132 +19,194 @@ using WebKit::WebMouseEvent;
using WebKit::WebMouseWheelEvent;
namespace {
-// Anonymous namespace for functions converting WebInputEvent to PP_Event and
-// back.
-PP_Event_Type ConvertEventTypes(WebInputEvent::Type wetype) {
+
+PP_InputEvent_Type ConvertEventTypes(WebInputEvent::Type wetype) {
switch (wetype) {
case WebInputEvent::MouseDown:
- return PP_EVENT_TYPE_MOUSEDOWN;
+ return PP_INPUTEVENT_TYPE_MOUSEDOWN;
case WebInputEvent::MouseUp:
- return PP_EVENT_TYPE_MOUSEUP;
+ return PP_INPUTEVENT_TYPE_MOUSEUP;
case WebInputEvent::MouseMove:
- return PP_EVENT_TYPE_MOUSEMOVE;
+ return PP_INPUTEVENT_TYPE_MOUSEMOVE;
case WebInputEvent::MouseEnter:
- return PP_EVENT_TYPE_MOUSEENTER;
+ return PP_INPUTEVENT_TYPE_MOUSEENTER;
case WebInputEvent::MouseLeave:
- return PP_EVENT_TYPE_MOUSELEAVE;
+ return PP_INPUTEVENT_TYPE_MOUSELEAVE;
case WebInputEvent::MouseWheel:
- return PP_EVENT_TYPE_MOUSEWHEEL;
+ return PP_INPUTEVENT_TYPE_MOUSEWHEEL;
case WebInputEvent::RawKeyDown:
- return PP_EVENT_TYPE_RAWKEYDOWN;
+ return PP_INPUTEVENT_TYPE_RAWKEYDOWN;
case WebInputEvent::KeyDown:
- return PP_EVENT_TYPE_KEYDOWN;
+ return PP_INPUTEVENT_TYPE_KEYDOWN;
case WebInputEvent::KeyUp:
- return PP_EVENT_TYPE_KEYUP;
+ return PP_INPUTEVENT_TYPE_KEYUP;
case WebInputEvent::Char:
- return PP_EVENT_TYPE_CHAR;
+ return PP_INPUTEVENT_TYPE_CHAR;
case WebInputEvent::Undefined:
default:
- return PP_EVENT_TYPE_UNDEFINED;
+ return PP_INPUTEVENT_TYPE_UNDEFINED;
}
}
-void BuildKeyEvent(const WebInputEvent* event, PP_Event* pp_event) {
- const WebKeyboardEvent* key_event =
- reinterpret_cast<const WebKeyboardEvent*>(event);
- pp_event->u.key.modifier = key_event->modifiers;
- pp_event->u.key.normalizedKeyCode = key_event->windowsKeyCode;
+// Generates a PP_InputEvent with the fields common to all events, as well as
+// the event type from the given web event. Event-specific fields will be zero
+// initialized.
+PP_InputEvent GetPPEventWithCommonFieldsAndType(
+ const WebInputEvent& web_event) {
+ PP_InputEvent result;
+ memset(&result, 0, sizeof(PP_InputEvent));
+ result.type = ConvertEventTypes(web_event.type);
+ result.time_stamp_seconds = web_event.timeStampSeconds;
+ return result;
+}
+
+void AppendKeyEvent(const WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events) {
+ const WebKeyboardEvent& key_event =
+ reinterpret_cast<const WebKeyboardEvent&>(event);
+ PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
+ result.u.key.modifier = key_event.modifiers;
+ result.u.key.key_code = key_event.windowsKeyCode;
+ pp_events->push_back(result);
}
-void BuildCharEvent(const WebInputEvent* event, PP_Event* pp_event) {
- const WebKeyboardEvent* key_event =
- reinterpret_cast<const WebKeyboardEvent*>(event);
- pp_event->u.character.modifier = key_event->modifiers;
- // For consistency, check that the sizes of the texts agree.
- DCHECK(sizeof(pp_event->u.character.text) == sizeof(key_event->text));
- DCHECK(sizeof(pp_event->u.character.unmodifiedText) ==
- sizeof(key_event->unmodifiedText));
- for (size_t i = 0; i < WebKeyboardEvent::textLengthCap; ++i) {
- pp_event->u.character.text[i] = key_event->text[i];
- pp_event->u.character.unmodifiedText[i] = key_event->unmodifiedText[i];
+void AppendCharEvent(const WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events) {
+ const WebKeyboardEvent& key_event =
+ reinterpret_cast<const WebKeyboardEvent&>(event);
+
+ // This is a bit complex, the input event will normally just have one 16-bit
+ // character in it, but may be zero or more than one. The text array is
+ // just padded with 0 values for the unused ones, but is not necessarily
+ // null-terminated.
+ //
+ // Here we see how many UTF-16 characters we have.
+ size_t utf16_char_count = 0;
+ while (utf16_char_count < WebKeyboardEvent::textLengthCap &&
+ key_event.text[utf16_char_count])
+ utf16_char_count++;
+
+ // Make a separate PP_InputEvent for each Unicode character in the input.
+ base::UTF16CharIterator iter(key_event.text, utf16_char_count);
+ while (!iter.end()) {
+ PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
+ result.u.character.modifier = key_event.modifiers;
+
+ std::string utf8_char;
+ base::WriteUnicodeCharacter(iter.get(), &utf8_char);
+ base::strlcpy(result.u.character.text, utf8_char.c_str(),
+ sizeof(result.u.character.text));
+
+ pp_events->push_back(result);
}
}
-void BuildMouseEvent(const WebInputEvent* event, PP_Event* pp_event) {
- const WebMouseEvent* mouse_event =
- reinterpret_cast<const WebMouseEvent*>(event);
- pp_event->u.mouse.modifier = mouse_event->modifiers;
- pp_event->u.mouse.button = mouse_event->button;
- pp_event->u.mouse.x = static_cast<float>(mouse_event->x);
- pp_event->u.mouse.y = static_cast<float>(mouse_event->y);
- pp_event->u.mouse.clickCount = mouse_event->clickCount;
+void AppendMouseEvent(const WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events) {
+ COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) ==
+ static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
+ MouseNone);
+ COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) ==
+ static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT),
+ MouseLeft);
+ COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) ==
+ static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT),
+ MouseRight);
+ COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) ==
+ static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE),
+ MouseMiddle);
+
+ const WebMouseEvent& mouse_event =
+ reinterpret_cast<const WebMouseEvent&>(event);
+ PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
+ result.u.mouse.modifier = mouse_event.modifiers;
+ result.u.mouse.button =
+ static_cast<PP_InputEvent_MouseButton>(mouse_event.button);
+ result.u.mouse.x = static_cast<float>(mouse_event.x);
+ result.u.mouse.y = static_cast<float>(mouse_event.y);
+ result.u.mouse.click_count = mouse_event.clickCount;
+ pp_events->push_back(result);
}
-void BuildMouseWheelEvent(const WebInputEvent* event, PP_Event* pp_event) {
- const WebMouseWheelEvent* mouse_wheel_event =
- reinterpret_cast<const WebMouseWheelEvent*>(event);
- pp_event->u.wheel.modifier = mouse_wheel_event->modifiers;
- pp_event->u.wheel.deltaX = mouse_wheel_event->deltaX;
- pp_event->u.wheel.deltaY = mouse_wheel_event->deltaY;
- pp_event->u.wheel.wheelTicksX = mouse_wheel_event->wheelTicksX;
- pp_event->u.wheel.wheelTicksY = mouse_wheel_event->wheelTicksY;
- pp_event->u.wheel.scrollByPage = mouse_wheel_event->scrollByPage;
+void AppendMouseWheelEvent(const WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events) {
+ const WebMouseWheelEvent& mouse_wheel_event =
+ reinterpret_cast<const WebMouseWheelEvent&>(event);
+ PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
+ result.u.wheel.modifier = mouse_wheel_event.modifiers;
+ result.u.wheel.delta_x = mouse_wheel_event.deltaX;
+ result.u.wheel.delta_y = mouse_wheel_event.deltaY;
+ result.u.wheel.wheel_ticks_x = mouse_wheel_event.wheelTicksX;
+ result.u.wheel.wheel_ticks_y = mouse_wheel_event.wheelTicksY;
+ result.u.wheel.scroll_by_page = !!mouse_wheel_event.scrollByPage;
+ pp_events->push_back(result);
}
-WebKeyboardEvent* BuildKeyEvent(const PP_Event& event) {
+WebKeyboardEvent* BuildKeyEvent(const PP_InputEvent& event) {
WebKeyboardEvent* key_event = new WebKeyboardEvent();
switch (event.type) {
- case PP_EVENT_TYPE_RAWKEYDOWN:
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
key_event->type = WebInputEvent::RawKeyDown;
break;
- case PP_EVENT_TYPE_KEYDOWN:
+ case PP_INPUTEVENT_TYPE_KEYDOWN:
key_event->type = WebInputEvent::KeyDown;
break;
- case PP_EVENT_TYPE_KEYUP:
+ case PP_INPUTEVENT_TYPE_KEYUP:
key_event->type = WebInputEvent::KeyUp;
break;
+ default:
+ NOTREACHED();
}
key_event->timeStampSeconds = event.time_stamp_seconds;
key_event->modifiers = event.u.key.modifier;
- key_event->windowsKeyCode = event.u.key.normalizedKeyCode;
+ key_event->windowsKeyCode = event.u.key.key_code;
return key_event;
}
-WebKeyboardEvent* BuildCharEvent(const PP_Event& event) {
+WebKeyboardEvent* BuildCharEvent(const PP_InputEvent& event) {
WebKeyboardEvent* key_event = new WebKeyboardEvent();
key_event->type = WebInputEvent::Char;
key_event->timeStampSeconds = event.time_stamp_seconds;
key_event->modifiers = event.u.character.modifier;
- // For consistency, check that the sizes of the texts agree.
- DCHECK(sizeof(event.u.character.text) == sizeof(key_event->text));
- DCHECK(sizeof(event.u.character.unmodifiedText) ==
- sizeof(key_event->unmodifiedText));
- for (size_t i = 0; i < WebKeyboardEvent::textLengthCap; ++i) {
- key_event->text[i] = event.u.character.text[i];
- key_event->unmodifiedText[i] = event.u.character.unmodifiedText[i];
- }
+
+ // Make sure to not read beyond the buffer in case some bad code doesn't
+ // NULL-terminate it (this is called from plugins).
+ size_t text_length_cap = WebKeyboardEvent::textLengthCap;
+ size_t text_len = 0;
+ while (text_len < text_length_cap && event.u.character.text[text_len])
+ text_len++;
+ string16 text16 = UTF8ToUTF16(std::string(event.u.character.text, text_len));
+
+ memset(key_event->text, 0, text_length_cap);
+ memset(key_event->unmodifiedText, 0, text_length_cap);
+ for (size_t i = 0;
+ i < std::min(text_length_cap, text16.size());
+ ++i)
+ key_event->text[i] = text16[i];
return key_event;
}
-WebMouseEvent* BuildMouseEvent(const PP_Event& event) {
+WebMouseEvent* BuildMouseEvent(const PP_InputEvent& event) {
WebMouseEvent* mouse_event = new WebMouseEvent();
switch (event.type) {
- case PP_EVENT_TYPE_MOUSEDOWN:
+ case PP_INPUTEVENT_TYPE_MOUSEDOWN:
mouse_event->type = WebInputEvent::MouseDown;
break;
- case PP_EVENT_TYPE_MOUSEUP:
+ case PP_INPUTEVENT_TYPE_MOUSEUP:
mouse_event->type = WebInputEvent::MouseUp;
break;
- case PP_EVENT_TYPE_MOUSEMOVE:
+ case PP_INPUTEVENT_TYPE_MOUSEMOVE:
mouse_event->type = WebInputEvent::MouseMove;
break;
- case PP_EVENT_TYPE_MOUSEENTER:
+ case PP_INPUTEVENT_TYPE_MOUSEENTER:
mouse_event->type = WebInputEvent::MouseEnter;
break;
- case PP_EVENT_TYPE_MOUSELEAVE:
+ case PP_INPUTEVENT_TYPE_MOUSELEAVE:
mouse_event->type = WebInputEvent::MouseLeave;
break;
+ default:
+ NOTREACHED();
}
mouse_event->timeStampSeconds = event.time_stamp_seconds;
mouse_event->modifiers = event.u.mouse.modifier;
@@ -148,20 +214,20 @@ WebMouseEvent* BuildMouseEvent(const PP_Event& event) {
static_cast<WebMouseEvent::Button>(event.u.mouse.button);
mouse_event->x = static_cast<int>(event.u.mouse.x);
mouse_event->y = static_cast<int>(event.u.mouse.y);
- mouse_event->clickCount = event.u.mouse.clickCount;
+ mouse_event->clickCount = event.u.mouse.click_count;
return mouse_event;
}
-WebMouseWheelEvent* BuildMouseWheelEvent(const PP_Event& event) {
+WebMouseWheelEvent* BuildMouseWheelEvent(const PP_InputEvent& event) {
WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent();
mouse_wheel_event->type = WebInputEvent::MouseWheel;
mouse_wheel_event->timeStampSeconds = event.time_stamp_seconds;
mouse_wheel_event->modifiers = event.u.wheel.modifier;
- mouse_wheel_event->deltaX = event.u.wheel.deltaX;
- mouse_wheel_event->deltaY = event.u.wheel.deltaY;
- mouse_wheel_event->wheelTicksX = event.u.wheel.wheelTicksX;
- mouse_wheel_event->wheelTicksY = event.u.wheel.wheelTicksY;
- mouse_wheel_event->scrollByPage = event.u.wheel.scrollByPage;
+ mouse_wheel_event->deltaX = event.u.wheel.delta_x;
+ mouse_wheel_event->deltaY = event.u.wheel.delta_y;
+ mouse_wheel_event->wheelTicksX = event.u.wheel.wheel_ticks_x;
+ mouse_wheel_event->wheelTicksY = event.u.wheel.wheel_ticks_y;
+ mouse_wheel_event->scrollByPage = event.u.wheel.scroll_by_page;
return mouse_wheel_event;
}
@@ -169,64 +235,58 @@ WebMouseWheelEvent* BuildMouseWheelEvent(const PP_Event& event) {
namespace pepper {
-PP_Event* CreatePP_Event(const WebInputEvent& event) {
- scoped_ptr<PP_Event> pp_event(new PP_Event);
+void CreatePPEvent(const WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events) {
+ pp_events->clear();
- pp_event->type = ConvertEventTypes(event.type);
- pp_event->size = sizeof(pp_event);
- pp_event->time_stamp_seconds = event.timeStampSeconds;
- switch (pp_event->type) {
- case PP_EVENT_TYPE_UNDEFINED:
- return NULL;
- case PP_EVENT_TYPE_MOUSEDOWN:
- case PP_EVENT_TYPE_MOUSEUP:
- case PP_EVENT_TYPE_MOUSEMOVE:
- case PP_EVENT_TYPE_MOUSEENTER:
- case PP_EVENT_TYPE_MOUSELEAVE:
- BuildMouseEvent(&event, pp_event.get());
+ switch (event.type) {
+ case WebInputEvent::MouseDown:
+ case WebInputEvent::MouseUp:
+ case WebInputEvent::MouseMove:
+ case WebInputEvent::MouseEnter:
+ case WebInputEvent::MouseLeave:
+ AppendMouseEvent(event, pp_events);
break;
- case PP_EVENT_TYPE_MOUSEWHEEL:
- BuildMouseWheelEvent(&event, pp_event.get());
+ case WebInputEvent::MouseWheel:
+ AppendMouseWheelEvent(event, pp_events);
break;
- case PP_EVENT_TYPE_RAWKEYDOWN:
- case PP_EVENT_TYPE_KEYDOWN:
- case PP_EVENT_TYPE_KEYUP:
- BuildKeyEvent(&event, pp_event.get());
+ case WebInputEvent::RawKeyDown:
+ case WebInputEvent::KeyDown:
+ case WebInputEvent::KeyUp:
+ AppendKeyEvent(event, pp_events);
break;
- case PP_EVENT_TYPE_CHAR:
- BuildCharEvent(&event, pp_event.get());
+ case WebInputEvent::Char:
+ AppendCharEvent(event, pp_events);
+ break;
+ case WebInputEvent::Undefined:
+ default:
break;
}
-
- return pp_event.release();
}
-WebInputEvent* CreateWebInputEvent(const PP_Event& event) {
+WebInputEvent* CreateWebInputEvent(const PP_InputEvent& event) {
scoped_ptr<WebInputEvent> web_input_event;
switch (event.type) {
- case PP_EVENT_TYPE_UNDEFINED:
+ case PP_INPUTEVENT_TYPE_UNDEFINED:
return NULL;
- case PP_EVENT_TYPE_MOUSEDOWN:
- case PP_EVENT_TYPE_MOUSEUP:
- case PP_EVENT_TYPE_MOUSEMOVE:
- case PP_EVENT_TYPE_MOUSEENTER:
- case PP_EVENT_TYPE_MOUSELEAVE:
+ 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:
web_input_event.reset(BuildMouseEvent(event));
break;
- case PP_EVENT_TYPE_MOUSEWHEEL:
+ case PP_INPUTEVENT_TYPE_MOUSEWHEEL:
web_input_event.reset(BuildMouseWheelEvent(event));
break;
- case PP_EVENT_TYPE_RAWKEYDOWN:
- case PP_EVENT_TYPE_KEYDOWN:
- case PP_EVENT_TYPE_KEYUP:
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
+ case PP_INPUTEVENT_TYPE_KEYDOWN:
+ case PP_INPUTEVENT_TYPE_KEYUP:
web_input_event.reset(BuildKeyEvent(event));
break;
- case PP_EVENT_TYPE_CHAR:
+ case PP_INPUTEVENT_TYPE_CHAR:
web_input_event.reset(BuildCharEvent(event));
break;
- case PP_EVENT_TYPE_FOCUS:
- // NOTIMPLEMENTED();
- return NULL;
}
return web_input_event.release();
diff --git a/webkit/glue/plugins/pepper_event_conversion.h b/webkit/glue/plugins/pepper_event_conversion.h
index 3f3fa68..9eab3e4 100644
--- a/webkit/glue/plugins/pepper_event_conversion.h
+++ b/webkit/glue/plugins/pepper_event_conversion.h
@@ -5,7 +5,9 @@
#ifndef WEBKIT_GLUE_PLUGINS_PEPPER_EVENT_H_
#define WEBKIT_GLUE_PLUGINS_PEPPER_EVENT_H_
-struct PP_Event;
+#include <vector>
+
+struct PP_InputEvent;
namespace WebKit {
class WebInputEvent;
@@ -13,13 +15,15 @@ class WebInputEvent;
namespace pepper {
-// Creates a PP_Event from the given WebInputEvent. If it fails, returns NULL.
-// The caller owns the created object on success.
-PP_Event* CreatePP_Event(const WebKit::WebInputEvent& event);
+// Converts the given WebKit event to one or possibly multiple PP_InputEvents.
+// The generated events will be filled into the given vector. On failure, no
+// events will ge generated and the vector will be empty.
+void CreatePPEvent(const WebKit::WebInputEvent& event,
+ std::vector<PP_InputEvent>* pp_events);
-// Creates a WebInputEvent from the given PP_Event. If it fails, returns NULL.
-// The caller owns the created object on success.
-WebKit::WebInputEvent* CreateWebInputEvent(const PP_Event& event);
+// Creates a WebInputEvent from the given PP_InputEvent. If it fails, returns
+// NULL. The caller owns the created object on success.
+WebKit::WebInputEvent* CreateWebInputEvent(const PP_InputEvent& event);
} // namespace pepper
diff --git a/webkit/glue/plugins/pepper_plugin_instance.cc b/webkit/glue/plugins/pepper_plugin_instance.cc
index 1a1290e..b246872 100644
--- a/webkit/glue/plugins/pepper_plugin_instance.cc
+++ b/webkit/glue/plugins/pepper_plugin_instance.cc
@@ -26,7 +26,7 @@
#include "third_party/ppapi/c/dev/ppb_fullscreen_dev.h"
#include "third_party/ppapi/c/dev/ppp_find_dev.h"
#include "third_party/ppapi/c/dev/ppp_zoom_dev.h"
-#include "third_party/ppapi/c/pp_event.h"
+#include "third_party/ppapi/c/pp_input_event.h"
#include "third_party/ppapi/c/pp_instance.h"
#include "third_party/ppapi/c/pp_rect.h"
#include "third_party/ppapi/c/pp_resource.h"
@@ -450,16 +450,23 @@ bool PluginInstance::HandleDocumentLoad(URLLoader* loader) {
bool PluginInstance::HandleInputEvent(const WebKit::WebInputEvent& event,
WebCursorInfo* cursor_info) {
- scoped_ptr<PP_Event> pp_event(CreatePP_Event(event));
- if (!pp_event.get())
- return false;
+ std::vector<PP_InputEvent> pp_events;
+ CreatePPEvent(event, &pp_events);
+
+ // Each input event may generate more than one PP_InputEvent.
+ bool rv = false;
+ for (size_t i = 0; i < pp_events.size(); i++)
+ rv |= instance_interface_->HandleInputEvent(GetPPInstance(), &pp_events[i]);
- bool rv = instance_interface_->HandleEvent(GetPPInstance(), pp_event.get());
if (cursor_.get())
*cursor_info = *cursor_;
return rv;
}
+void PluginInstance::FocusChanged(bool has_focus) {
+ instance_interface_->FocusChanged(GetPPInstance(), has_focus);
+}
+
PP_Var PluginInstance::GetInstanceObject() {
return instance_interface_->GetInstanceObject(GetPPInstance());
}
diff --git a/webkit/glue/plugins/pepper_plugin_instance.h b/webkit/glue/plugins/pepper_plugin_instance.h
index bf8f027..0ed6ee6 100644
--- a/webkit/glue/plugins/pepper_plugin_instance.h
+++ b/webkit/glue/plugins/pepper_plugin_instance.h
@@ -107,6 +107,7 @@ class PluginInstance : public base::RefCounted<PluginInstance> {
bool HandleDocumentLoad(URLLoader* loader);
bool HandleInputEvent(const WebKit::WebInputEvent& event,
WebKit::WebCursorInfo* cursor_info);
+ void FocusChanged(bool has_focus);
PP_Var GetInstanceObject();
void ViewChanged(const gfx::Rect& position, const gfx::Rect& clip);
diff --git a/webkit/glue/plugins/pepper_scrollbar.cc b/webkit/glue/plugins/pepper_scrollbar.cc
index c704112..a8943d2 100644
--- a/webkit/glue/plugins/pepper_scrollbar.cc
+++ b/webkit/glue/plugins/pepper_scrollbar.cc
@@ -173,7 +173,7 @@ bool Scrollbar::Paint(const PP_Rect* rect, ImageData* image) {
return true;
}
-bool Scrollbar::HandleEvent(const PP_Event* event) {
+bool Scrollbar::HandleEvent(const PP_InputEvent* event) {
scoped_ptr<WebInputEvent> web_input_event(CreateWebInputEvent(*event));
if (!web_input_event.get())
return false;
diff --git a/webkit/glue/plugins/pepper_scrollbar.h b/webkit/glue/plugins/pepper_scrollbar.h
index 4b1e478..e8ac480 100644
--- a/webkit/glue/plugins/pepper_scrollbar.h
+++ b/webkit/glue/plugins/pepper_scrollbar.h
@@ -38,7 +38,7 @@ class Scrollbar : public Widget, public WebKit::WebScrollbarClient {
// PPB_Widget implementation.
virtual bool Paint(const PP_Rect* rect, ImageData* image);
- virtual bool HandleEvent(const PP_Event* event);
+ virtual bool HandleEvent(const PP_InputEvent* event);
virtual void SetLocationInternal(const PP_Rect* location);
private:
diff --git a/webkit/glue/plugins/pepper_webplugin_impl.cc b/webkit/glue/plugins/pepper_webplugin_impl.cc
index b7fc7b4..e92efac 100644
--- a/webkit/glue/plugins/pepper_webplugin_impl.cc
+++ b/webkit/glue/plugins/pepper_webplugin_impl.cc
@@ -96,6 +96,7 @@ void WebPluginImpl::updateGeometry(
}
void WebPluginImpl::updateFocus(bool focused) {
+ instance_->FocusChanged(focused);
}
void WebPluginImpl::updateVisibility(bool visible) {
diff --git a/webkit/glue/plugins/pepper_widget.cc b/webkit/glue/plugins/pepper_widget.cc
index af1bb59..1ba5280 100644
--- a/webkit/glue/plugins/pepper_widget.cc
+++ b/webkit/glue/plugins/pepper_widget.cc
@@ -33,7 +33,7 @@ bool Paint(PP_Resource resource, const PP_Rect* rect, PP_Resource image_id) {
return widget->Paint(rect, image);
}
-bool HandleEvent(PP_Resource resource, const PP_Event* event) {
+bool HandleEvent(PP_Resource resource, const PP_InputEvent* event) {
scoped_refptr<Widget> widget(Resource::GetAs<Widget>(resource));
return widget && widget->HandleEvent(event);
}
diff --git a/webkit/glue/plugins/pepper_widget.h b/webkit/glue/plugins/pepper_widget.h
index e2726e2..47826e3 100644
--- a/webkit/glue/plugins/pepper_widget.h
+++ b/webkit/glue/plugins/pepper_widget.h
@@ -10,7 +10,7 @@
#include "webkit/glue/plugins/pepper_resource.h"
struct PPB_Widget_Dev;
-struct PP_Event;
+struct PP_InputEvent;
namespace pepper {
@@ -31,7 +31,7 @@ class Widget : public Resource {
// PPB_Widget implementation.
virtual bool Paint(const PP_Rect* rect, ImageData* image) = 0;
- virtual bool HandleEvent(const PP_Event* event) = 0;
+ virtual bool HandleEvent(const PP_InputEvent* event) = 0;
bool GetLocation(PP_Rect* location);
void SetLocation(const PP_Rect* location);