Index: content/test/render_view_test.cc |
diff --git a/content/test/render_view_test.cc b/content/test/render_view_test.cc |
index 5d60fc5a737076367dd88554afbf56288475f627..154dd4c5f59636f4b807580a7a3712a542373deb 100644 |
--- a/content/test/render_view_test.cc |
+++ b/content/test/render_view_test.cc |
@@ -24,6 +24,19 @@ |
#include "ui/base/gtk/event_synthesis_gtk.h" |
#endif |
+#if defined(USE_AURA) |
+#include "ui/aura/event.h" |
+#endif |
+ |
+#if defined(USE_AURA) && defined(USE_X11) |
+#include <X11/Xlib.h> |
+#include <X11/keysym.h> |
+#include "ui/base/events.h" |
+#include "ui/base/keycodes/keyboard_code_conversion.h" |
+#include "ui/base/keycodes/keyboard_code_conversion_x.h" |
+#include "ui/base/x/x11_util.h" |
+#endif |
+ |
using WebKit::WebFrame; |
using WebKit::WebInputEvent; |
using WebKit::WebMouseEvent; |
@@ -35,6 +48,89 @@ using WebKit::WebURLRequest; |
namespace { |
const int32 kOpenerId = 7; |
const int32 kRouteId = 5; |
+ |
+#if defined(USE_AURA) && defined(USE_X11) |
+// Converts ui::EventType to XKeyEvent state. |
+unsigned int XKeyEventState(int flags) { |
+ return |
+ ((flags & ui::EF_SHIFT_DOWN) ? ShiftMask : 0) | |
+ ((flags & ui::EF_CONTROL_DOWN) ? ControlMask : 0) | |
+ ((flags & ui::EF_CAPS_LOCK_DOWN) ? LockMask : 0); |
+} |
+ |
+// Converts ui::EventType to XKeyEvent type. |
+int XKeyEventType(ui::EventType type) { |
+ switch (type) { |
+ case ui::ET_KEY_PRESSED: |
+ return KeyPress; |
+ case ui::ET_KEY_RELEASED: |
+ return KeyRelease; |
+ default: |
+ return 0; |
+ } |
+} |
+ |
+// Converts ui::KeyboardCode to XKeyEvent keycode. |
+unsigned int XKeyEventKeyCode(ui::KeyboardCode key_code, |
+ int flags, |
+ Display* display) { |
+ const int keysym = ui::XKeysymForWindowsKeyCode(key_code, |
+ flags & ui::EF_SHIFT_DOWN); |
+ // The test assumes the keycode for XK_less is equal to the one of XK_comma, |
+ // but XKeysymToKeycode returns 94 for XK_less while it returns 59 for |
+ // XK_comma. Here we convert the value for XK_less to the value for XK_comma. |
+ return (keysym == XK_less) ? 59 : XKeysymToKeycode(display, keysym); |
+} |
+ |
+// Creates a fake XEvent for testing. |
+XEvent* CreateFakeXEvent(ui::EventType type, |
+ ui::KeyboardCode key_code, |
+ int flags) { |
+ Display* display = ui::GetXDisplay(); |
+ XKeyEvent key_event; |
+ key_event.type = XKeyEventType(type); |
+ key_event.serial = 0; |
+ key_event.send_event = 0; |
+ key_event.display = display; |
+ key_event.time = 0; |
+ key_event.window = 0; |
+ key_event.root = 0; |
+ key_event.subwindow = 0; |
+ key_event.x = 0; |
+ key_event.y = 0; |
+ key_event.x_root = 0; |
+ key_event.y_root = 0; |
+ key_event.state = XKeyEventState(flags); |
+ key_event.keycode = XKeyEventKeyCode(key_code, flags, display); |
+ key_event.same_screen = 1; |
+ XEvent* event = new XEvent; |
+ event->type = key_event.type; |
+ event->xkey = key_event; |
+ return event; |
+} |
+ |
+// Converts MockKeyboard::Modifiers to ui::EventFlags. |
+int ConvertMockKeyboardModifier(MockKeyboard::Modifiers modifiers) { |
+ static struct ModifierMap { |
+ MockKeyboard::Modifiers src; |
+ int dst; |
+ } kModifierMap[] = { |
+ { MockKeyboard::LEFT_SHIFT, ui::EF_SHIFT_DOWN }, |
+ { MockKeyboard::RIGHT_SHIFT, ui::EF_SHIFT_DOWN }, |
+ { MockKeyboard::LEFT_CONTROL, ui::EF_CONTROL_DOWN }, |
+ { MockKeyboard::RIGHT_CONTROL, ui::EF_CONTROL_DOWN }, |
+ { MockKeyboard::LEFT_ALT, ui::EF_ALT_DOWN }, |
+ { MockKeyboard::RIGHT_ALT, ui::EF_ALT_DOWN }, |
+ }; |
+ int flags = 0; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kModifierMap); ++i) { |
+ if (kModifierMap[i].src & modifiers) { |
+ flags |= kModifierMap[i].dst; |
+ } |
+ } |
+ return flags; |
+} |
+#endif |
} // namespace |
namespace content { |
@@ -157,11 +253,8 @@ void RenderViewTest::TearDown() { |
int RenderViewTest::SendKeyEvent(MockKeyboard::Layout layout, |
int key_code, |
MockKeyboard::Modifiers modifiers, |
- std::wstring* output) { |
-#if defined(USE_AURA) |
- NOTIMPLEMENTED(); |
- return L'\0'; |
-#elif defined(OS_WIN) |
+ string16* output) { |
+#if defined(OS_WIN) |
// Retrieve the Unicode character for the given tuple (keyboard-layout, |
// key-code, and modifiers). |
// Exit when a keyboard-layout driver cannot assign a Unicode character to |
@@ -180,18 +273,67 @@ int RenderViewTest::SendKeyEvent(MockKeyboard::Layout layout, |
// WM_KEYDOWN and WM_KEYUP sends virtual-key codes. On the other hand, |
// WM_CHAR sends a composed Unicode character. |
MSG msg1 = { NULL, WM_KEYDOWN, key_code, 0 }; |
+#if defined(USE_AURA) |
+ aura::KeyEvent evt1(msg1, false); |
+ NativeWebKeyboardEvent keydown_event(&evt1); |
+#else |
NativeWebKeyboardEvent keydown_event(msg1); |
+#endif |
SendNativeKeyEvent(keydown_event); |
MSG msg2 = { NULL, WM_CHAR, (*output)[0], 0 }; |
+#if defined(USE_AURA) |
+ aura::KeyEvent evt2(msg2, true); |
+ NativeWebKeyboardEvent char_event(&evt2); |
+#else |
NativeWebKeyboardEvent char_event(msg2); |
+#endif |
SendNativeKeyEvent(char_event); |
MSG msg3 = { NULL, WM_KEYUP, key_code, 0 }; |
+#if defined(USE_AURA) |
+ aura::KeyEvent evt3(msg3, false); |
+ NativeWebKeyboardEvent keyup_event(&evt3); |
+#else |
NativeWebKeyboardEvent keyup_event(msg3); |
+#endif |
SendNativeKeyEvent(keyup_event); |
return length; |
+#elif defined(USE_AURA) && defined(USE_X11) |
+ // We ignore |layout|, which means we are only testing the layout of the |
+ // current locale. TODO(mazda): fix this to respect |layout|. |
+ CHECK(output); |
+ const int flags = ConvertMockKeyboardModifier(modifiers); |
+ |
+ scoped_ptr<XEvent> xevent1(CreateFakeXEvent( |
+ ui::ET_KEY_PRESSED, |
+ static_cast<ui::KeyboardCode>(key_code), |
+ flags)); |
+ aura::KeyEvent event1(xevent1.get(), false); |
+ NativeWebKeyboardEvent keydown_event(&event1); |
+ SendNativeKeyEvent(keydown_event); |
+ |
+ scoped_ptr<XEvent> xevent2(CreateFakeXEvent( |
+ ui::ET_KEY_PRESSED, |
+ static_cast<ui::KeyboardCode>(key_code), |
+ flags)); |
+ aura::KeyEvent event2(xevent2.get(), true); |
+ NativeWebKeyboardEvent char_event(&event2); |
+ SendNativeKeyEvent(char_event); |
+ |
+ scoped_ptr<XEvent> xevent3(CreateFakeXEvent( |
+ ui::ET_KEY_RELEASED, |
+ static_cast<ui::KeyboardCode>(key_code), |
+ flags)); |
+ aura::KeyEvent event3(xevent3.get(), false); |
+ NativeWebKeyboardEvent keyup_event(&event3); |
+ SendNativeKeyEvent(keyup_event); |
+ |
+ long c = GetCharacterFromKeyCode(static_cast<ui::KeyboardCode>(key_code), |
+ flags); |
+ output->assign(1, static_cast<char16>(c)); |
+ return 1; |
#elif defined(OS_LINUX) |
// We ignore |layout|, which means we are only testing the layout of the |
// current locale. TODO(estade): fix this to respect |layout|. |
@@ -223,7 +365,7 @@ int RenderViewTest::SendKeyEvent(MockKeyboard::Layout layout, |
gdk_event_free(events[i]); |
} |
- *output = std::wstring(1, unicode_key); |
+ output->assign(1, static_cast<char16>(unicode_key)); |
return 1; |
#else |
NOTIMPLEMENTED(); |