Index: ppapi/native_client/tests/ppapi_browser/ppp_input_event/ppapi_ppp_input_event.cc |
=================================================================== |
--- ppapi/native_client/tests/ppapi_browser/ppp_input_event/ppapi_ppp_input_event.cc (revision 0) |
+++ ppapi/native_client/tests/ppapi_browser/ppp_input_event/ppapi_ppp_input_event.cc (revision 0) |
@@ -0,0 +1,214 @@ |
+// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <string.h> |
+ |
+#include <vector> |
+ |
+#include "native_client/src/include/nacl/nacl_inttypes.h" |
+#include "native_client/src/include/nacl_macros.h" |
+#include "native_client/src/shared/platform/nacl_check.h" |
+#include "native_client/tests/ppapi_test_lib/get_browser_interface.h" |
+#include "native_client/tests/ppapi_test_lib/test_interface.h" |
+ |
+#include "ppapi/c/pp_bool.h" |
+#include "ppapi/c/pp_errors.h" |
+#include "ppapi/c/pp_input_event.h" |
+#include "ppapi/c/ppb_input_event.h" |
+#include "ppapi/c/ppp_input_event.h" |
+ |
+namespace { |
+ |
+// These define whether we want an input event to bubble up to the browser |
+static enum { |
+ BUBBLE_UNDEFINED, |
+ BUBBLE_YES, |
+ BUBBLE_NO |
+} bubbleInputEvent; |
+ |
+PP_TimeTicks last_time_tick; |
+ |
+std::string InputEventTypeToString(PP_InputEvent_Type type) { |
+ switch (type) { |
+ case PP_INPUTEVENT_TYPE_UNDEFINED: |
+ return "PP_INPUTEVENT_TYPE_UNDEFINED"; |
+ case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
+ return "PP_INPUTEVENT_TYPE_MOUSEDOWN"; |
+ case PP_INPUTEVENT_TYPE_MOUSEUP: |
+ return "PP_INPUTEVENT_TYPE_MOUSEUP"; |
+ case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
+ return "PP_INPUTEVENT_TYPE_MOUSEMOVE"; |
+ case PP_INPUTEVENT_TYPE_MOUSEENTER: |
+ return "PP_INPUTEVENT_TYPE_MOUSEENTER"; |
+ case PP_INPUTEVENT_TYPE_MOUSELEAVE: |
+ return "PP_INPUTEVENT_TYPE_MOUSELEAVE"; |
+ case PP_INPUTEVENT_TYPE_WHEEL: |
+ return "PP_INPUTEVENT_TYPE_WHEEL"; |
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN: |
+ return "PP_INPUTEVENT_TYPE_RAWKEYDOWN"; |
+ case PP_INPUTEVENT_TYPE_KEYDOWN: |
+ return "PP_INPUTEVENT_TYPE_KEYDOWN"; |
+ case PP_INPUTEVENT_TYPE_KEYUP: |
+ return "PP_INPUTEVENT_TYPE_KEYUP"; |
+ case PP_INPUTEVENT_TYPE_CHAR: |
+ return "PP_INPUTEVENT_TYPE_CHAR"; |
+ case PP_INPUTEVENT_TYPE_CONTEXTMENU: |
+ return "PP_INPUTEVENT_TYPE_CONTEXTMENU"; |
+ default: |
+ std::ostringstream stream; |
+ stream << "Unknown Input Event: " << type; |
+ return stream.str(); |
+ } |
+} |
+ |
+std::string InputEventModifierToString(uint32_t modifier) { |
+ struct ModifierStringMap { |
+ PP_InputEvent_Modifier modifier; |
+ const char* name; |
+ }; |
+ static const ModifierStringMap table[] = { |
+ { PP_INPUTEVENT_MODIFIER_SHIFTKEY, "PP_INPUTEVENT_MODIFIER_SHIFTKEY" }, |
+ { PP_INPUTEVENT_MODIFIER_CONTROLKEY, "PP_INPUTEVENT_MODIFIER_CONTROLKEY" }, |
+ { PP_INPUTEVENT_MODIFIER_ALTKEY, "PP_INPUTEVENT_MODIFIER_ALTKEY" }, |
+ { PP_INPUTEVENT_MODIFIER_METAKEY, "PP_INPUTEVENT_MODIFIER_METAKEY" }, |
+ { PP_INPUTEVENT_MODIFIER_ISKEYPAD, "PP_INPUTEVENT_MODIFIER_ISKEYPAD" }, |
+ { PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT, |
+ "PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT" }, |
+ { PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN, |
+ "PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN" }, |
+ { PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN, |
+ "PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN" }, |
+ { PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN, |
+ "PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN" }, |
+ { PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY, |
+ "PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY" }, |
+ { PP_INPUTEVENT_MODIFIER_NUMLOCKKEY, "PP_INPUTEVENT_MODIFIER_NUMLOCKKEY" }, |
+ }; |
+ |
+ std::ostringstream stream; |
+ for (int i = 0; i < int(sizeof(table) / sizeof(*table)); ++i) { |
+ if (table[i].modifier & modifier) { |
+ if (stream.str().size() != 0) { |
+ stream << ","; |
+ } |
+ stream << table[i].name; |
+ modifier &= ~table[i].modifier; |
+ } |
+ } |
+ |
+ if (modifier != 0) { |
+ if (stream.str().size() != 0) { |
+ stream << ","; |
+ } |
+ stream << "Unknown Modifier Bits:" << modifier; |
+ } |
+ return stream.str(); |
+} |
+ |
+std::string MouseButtonToString(PP_InputEvent_MouseButton button) { |
+ switch (button) { |
+ case PP_INPUTEVENT_MOUSEBUTTON_NONE: |
+ return "PP_INPUTEVENT_MOUSEBUTTON_NONE"; |
+ case PP_INPUTEVENT_MOUSEBUTTON_LEFT: |
+ return "PP_INPUTEVENT_MOUSEBUTTON_LEFT"; |
+ case PP_INPUTEVENT_MOUSEBUTTON_MIDDLE: |
+ return "PP_INPUTEVENT_MOUSEBUTTON_MIDDLE"; |
+ case PP_INPUTEVENT_MOUSEBUTTON_RIGHT: |
+ return "PP_INPUTEVENT_MOUSEBUTTON_RIGHT"; |
+ default: |
+ std::ostringstream stream; |
+ stream << "Unrecognized (" |
+ << static_cast<int32_t>(button) |
+ << ")"; |
+ return stream.str(); |
+ } |
+} |
+ |
+PP_Bool HandleInputEvent(PP_Instance instance, PP_Resource event) { |
+ EXPECT(instance == pp_instance()); |
+ EXPECT(PPBInputEvent()->IsInputEvent(event)); |
+ PP_InputEvent_Type type = PPBInputEvent()->GetType(event); |
+ PP_TimeTicks ticks = PPBInputEvent()->GetTimeStamp(event); |
+ EXPECT(ticks >= last_time_tick); |
+ last_time_tick = ticks; |
+ uint32_t modifiers = PPBInputEvent()->GetModifiers(event); |
+ printf("--- PPP_InputEvent::HandleInputEvent " |
+ "type=%d, ticks=%f, modifiers=%"NACL_PRIu32"\n", |
+ static_cast<int>(type), ticks, modifiers); |
+ std::ostringstream message; |
+ message << InputEventTypeToString(type) << ":" << |
+ InputEventModifierToString(modifiers); |
+ if (PPBMouseInputEvent()->IsMouseInputEvent(event)) { |
+ PP_Point point = PPBMouseInputEvent()->GetPosition(event); |
+ message << ":" << MouseButtonToString( |
+ PPBMouseInputEvent()->GetButton(event)); |
+ message << ":Position=" << point.x << "," << point.y; |
+ message << ":ClickCount=" << PPBMouseInputEvent()->GetClickCount(event); |
+ } |
+ // Here's a example of what a complete response would look like for a mouse |
+ // click (broken into multiple lines for readability): |
+ // HandleInputEvent:PP_INPUTEVENT_TYPE_MOUSEDOWN |
+ // :PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN |
+ // :PP_INPUTEVENT_MOUSEBUTTON_LEFT |
+ // :Position=0,0:ClickCount=1 |
+ // TODO(mball) Add output for WheelInputEvent and KeyboardInputEvent |
+ |
+ PostTestMessage("HandleInputEvent", message.str()); |
+ EXPECT(bubbleInputEvent == BUBBLE_YES || bubbleInputEvent == BUBBLE_NO); |
+ return (bubbleInputEvent == BUBBLE_NO) ? PP_TRUE : PP_FALSE; |
+} |
+ |
+void TestUnfilteredMouseEvents() { |
+ EXPECT(PPBInputEvent()->RequestInputEvents( |
+ pp_instance(), |
+ PP_INPUTEVENT_CLASS_MOUSE) == PP_OK); |
+ bubbleInputEvent = BUBBLE_NO; |
+ TEST_PASSED; |
+} |
+ |
+void TestBubbledMouseEvents() { |
+ EXPECT(PPBInputEvent()->RequestFilteringInputEvents( |
+ pp_instance(), |
+ PP_INPUTEVENT_CLASS_MOUSE) == PP_OK); |
+ bubbleInputEvent = BUBBLE_YES; |
+ TEST_PASSED; |
+} |
+ |
+void TestUnbubbledMouseEvents() { |
+ EXPECT(PPBInputEvent()->RequestFilteringInputEvents( |
+ pp_instance(), |
+ PP_INPUTEVENT_CLASS_MOUSE) == PP_OK); |
+ bubbleInputEvent = BUBBLE_NO; |
+ TEST_PASSED; |
+} |
+ |
+void Cleanup() { |
+ PPBInputEvent()->ClearInputEventRequest( |
+ pp_instance(), |
+ PP_INPUTEVENT_CLASS_MOUSE | |
+ PP_INPUTEVENT_CLASS_WHEEL | |
+ PP_INPUTEVENT_CLASS_KEYBOARD); |
+ bubbleInputEvent = BUBBLE_UNDEFINED; |
+ TEST_PASSED; |
+} |
+ |
+const PPP_InputEvent ppp_input_event_interface = { |
+ &HandleInputEvent |
+}; |
+ |
+} // namespace |
+ |
+void SetupTests() { |
+ bubbleInputEvent = BUBBLE_UNDEFINED; |
+ last_time_tick = 0.0; |
+ RegisterTest("TestUnfilteredMouseEvents", TestUnfilteredMouseEvents); |
+ RegisterTest("TestBubbledMouseEvents", TestBubbledMouseEvents); |
+ RegisterTest("TestUnbubbledMouseEvents", TestUnbubbledMouseEvents); |
+ RegisterTest("Cleanup", Cleanup); |
+} |
+ |
+void SetupPluginInterfaces() { |
+ RegisterPluginInterface(PPP_INPUT_EVENT_INTERFACE, |
+ &ppp_input_event_interface); |
+} |