Index: remoting/tools/javascript_key_tester/pnacl/remoting_key_tester.cc |
diff --git a/remoting/tools/javascript_key_tester/pnacl/remoting_key_tester.cc b/remoting/tools/javascript_key_tester/pnacl/remoting_key_tester.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ef3b4ec6a39bc5378090468cc45181668d432f33 |
--- /dev/null |
+++ b/remoting/tools/javascript_key_tester/pnacl/remoting_key_tester.cc |
@@ -0,0 +1,185 @@ |
+// Copyright (c) 2015 The Chromium 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 <sstream> |
+ |
+#include "ppapi/cpp/input_event.h" |
+#include "ppapi/cpp/instance.h" |
+#include "ppapi/cpp/module.h" |
+#include "ppapi/cpp/var.h" |
+ |
+namespace remoting { |
+ |
+class KeyTesterInstance : public pp::Instance { |
+ public: |
+ explicit KeyTesterInstance(PP_Instance instance) : pp::Instance(instance) { |
+ RequestInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD | |
+ PP_INPUTEVENT_CLASS_MOUSE); |
+ } |
+ |
+ virtual ~KeyTesterInstance() {} |
+ |
+ virtual bool HandleInputEvent(const pp::InputEvent& event) { |
+ switch (event.GetType()) { |
+ case PP_INPUTEVENT_TYPE_KEYDOWN: |
+ case PP_INPUTEVENT_TYPE_KEYUP: |
+ case PP_INPUTEVENT_TYPE_CHAR: { |
+ HandleKeyboardEvent(pp::KeyboardInputEvent(event)); |
+ break; |
+ } |
+ default: |
+ break; |
+ } |
+ return true; |
+ } |
+ |
+ private: |
+ void HandleKeyboardEvent(const pp::KeyboardInputEvent& event) { |
+ std::ostringstream out; |
+ |
+ out << EventTypeToString(event.GetType()) << " : "; |
+ out << ModifiersToString(event.GetModifiers()) << " : "; |
+ out << "0x" << std::hex << event.GetKeyCode() << " : "; |
+ out << VarToString(event.GetCharacterText()) << " : "; |
+ out << VarToString(event.GetCode()); |
+ |
+ PostMessage(out.str()); |
Jamie
2015/01/28 22:31:27
I think this should be passed as a dictionary (or
Łukasz Anforowicz
2015/01/29 00:26:37
I wrote code that works and passes the following o
|
+ } |
+ |
+ std::string VarToString(const pp::Var& var) { |
+ if (var.is_undefined()) { |
+ return "[undefined]"; |
+ } |
+ if (var.is_null()) { |
+ return "[null]"; |
+ } |
+ if (!var.is_string()) { |
+ return "[non-string]"; |
+ } |
+ return var.AsString(); |
+ } |
+ |
+ std::string EventTypeToString(PP_InputEvent_Type t) { |
+ switch (t) { |
+ case PP_INPUTEVENT_TYPE_UNDEFINED: |
+ return "UNDEFINED"; |
+ case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
+ return "MOUSEDOWN"; |
+ case PP_INPUTEVENT_TYPE_MOUSEUP: |
+ return "MOUSEUP"; |
+ case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
+ return "MOUSEMOVE"; |
+ case PP_INPUTEVENT_TYPE_MOUSEENTER: |
+ return "MOUSEENTER"; |
+ case PP_INPUTEVENT_TYPE_MOUSELEAVE: |
+ return "MOUSELEAVE"; |
+ case PP_INPUTEVENT_TYPE_WHEEL: |
+ return "WHEEL"; |
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN: |
+ return "RAWKEYDOWN"; |
+ case PP_INPUTEVENT_TYPE_KEYDOWN: |
+ return "KEYDOWN"; |
+ case PP_INPUTEVENT_TYPE_KEYUP: |
+ return "KEYUP"; |
+ case PP_INPUTEVENT_TYPE_CHAR: |
+ return "CHAR"; |
+ case PP_INPUTEVENT_TYPE_CONTEXTMENU: |
+ return "CONTEXTMENU"; |
+ case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: |
+ return "IME_COMPOSITION_START"; |
+ case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: |
+ return "IME_COMPOSITION_UPDATE"; |
+ case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END: |
+ return "IME_COMPOSITION_END"; |
+ case PP_INPUTEVENT_TYPE_IME_TEXT: |
+ return "IME_TEXT"; |
+ case PP_INPUTEVENT_TYPE_TOUCHSTART: |
+ return "TOUCHSTART"; |
+ case PP_INPUTEVENT_TYPE_TOUCHMOVE: |
+ return "TOUCHMOVE"; |
+ case PP_INPUTEVENT_TYPE_TOUCHEND: |
+ return "TOUCHEND"; |
+ case PP_INPUTEVENT_TYPE_TOUCHCANCEL: |
+ return "TOUCHCANCEL"; |
+ default: |
+ return "[UNRECOGNIZED]"; |
+ } |
+ } |
+ |
+ void Append(std::ostringstream& out, |
+ const std::string& str, |
+ const std::string& separator) { |
+ if (!out.str().empty()) { |
+ out << separator; |
+ } |
+ out << str; |
+ } |
+ |
+ std::string ModifiersToString(uint32_t modifiers) { |
+ std::ostringstream out; |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_SHIFTKEY) { |
+ Append(out, "SHIFTKEY", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_CONTROLKEY) { |
+ Append(out, "CONTROLKEY", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_ALTKEY) { |
+ Append(out, "ALTKEY", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_METAKEY) { |
+ Append(out, "METAKEY", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_ISKEYPAD) { |
+ Append(out, "ISKEYPAD", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) { |
+ Append(out, "ISAUTOREPEAT", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) { |
+ Append(out, "LEFTBUTTONDOWN", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) { |
+ Append(out, "MIDDLEBUTTONDOWN", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) { |
+ Append(out, "RIGHTBUTTONDOWN", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) { |
+ Append(out, "CAPSLOCKKEY", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) { |
+ Append(out, "NUMLOCKKEY", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_ISLEFT) { |
+ Append(out, "ISLEFT", "+"); |
+ } |
+ if (modifiers & PP_INPUTEVENT_MODIFIER_ISRIGHT) { |
+ Append(out, "ISRIGHT", "+"); |
+ } |
+ if (out.str().empty()) { |
+ return "[NO MODIFIERS]"; |
+ } |
+ return out.str(); |
+ } |
+}; |
+ |
+class KeyTesterModule : public pp::Module { |
+ public: |
+ KeyTesterModule() : pp::Module() {} |
+ virtual ~KeyTesterModule() {} |
+ |
+ virtual pp::Instance* CreateInstance(PP_Instance instance) { |
+ return new KeyTesterInstance(instance); |
+ } |
+}; |
+ |
+} // namespace remoting |
+ |
+namespace pp { |
+ |
+Module* CreateModule() { |
+ return new remoting::KeyTesterModule(); |
+} |
+ |
+} // namespace pp |