Index: chrome/test/render_view_test.cc |
=================================================================== |
--- chrome/test/render_view_test.cc (revision 15745) |
+++ chrome/test/render_view_test.cc (working copy) |
@@ -4,12 +4,14 @@ |
#include "chrome/test/render_view_test.h" |
+#include "chrome/common/native_web_keyboard_event.h" |
#include "chrome/common/render_messages.h" |
#include "chrome/browser/extensions/extension_function_dispatcher.h" |
#include "chrome/renderer/extensions/event_bindings.h" |
#include "chrome/renderer/extensions/extension_process_bindings.h" |
#include "chrome/renderer/extensions/renderer_extension_bindings.h" |
#include "chrome/renderer/js_only_v8_extensions.h" |
+#include "WebKit/api/public/WebInputEvent.h" |
#include "webkit/api/public/WebKit.h" |
#include "webkit/api/public/WebScriptSource.h" |
#include "webkit/glue/weburlrequest.h" |
@@ -74,6 +76,9 @@ |
view_ = RenderView::Create(&render_thread_, NULL, NULL, kOpenerId, |
WebPreferences(), |
new SharedRenderViewCounter(0), kRouteId); |
+ |
+ // Attach a pseudo keyboard device to this object. |
+ mock_keyboard_.reset(new MockKeyboard()); |
} |
void RenderViewTest::TearDown() { |
render_thread_.SendCloseMessage(); |
@@ -89,4 +94,53 @@ |
WebKit::shutdown(); |
msg_loop_.RunAllPending(); |
+ |
+ mock_keyboard_.reset(); |
} |
+ |
+int RenderViewTest::SendKeyEvent(MockKeyboard::Layout layout, |
+ int key_code, |
+ MockKeyboard::Modifiers modifiers, |
+ std::wstring* 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 |
+ // the tuple to prevent sending an invalid key code to the RenderView object. |
+ CHECK(mock_keyboard_.get()); |
+ CHECK(output); |
+ int length = mock_keyboard_->GetCharacters(layout, key_code, modifiers, |
+ output); |
+ if (length != 1) |
+ return -1; |
+ |
+ // Create IPC messages from Windows messages and send them to our |
+ // back-end. |
+ // A keyboard event of Windows consists of three Windows messages: |
+ // WM_KEYDOWN, WM_CHAR, and WM_KEYUP. |
+ // WM_KEYDOWN and WM_KEYUP sends virtual-key codes. On the other hand, |
+ // WM_CHAR sends a composed Unicode character. |
+ NativeWebKeyboardEvent keydown_event(NULL, WM_KEYDOWN, key_code, 0); |
+ scoped_ptr<IPC::Message> keydown_message(new ViewMsg_HandleInputEvent(0)); |
+ keydown_message->WriteData(reinterpret_cast<const char*>(&keydown_event), |
+ sizeof(WebKit::WebKeyboardEvent)); |
+ view_->OnHandleInputEvent(*keydown_message); |
+ |
+ NativeWebKeyboardEvent char_event(NULL, WM_CHAR, (*output)[0], 0); |
+ scoped_ptr<IPC::Message> char_message(new ViewMsg_HandleInputEvent(0)); |
+ char_message->WriteData(reinterpret_cast<const char*>(&char_event), |
+ sizeof(WebKit::WebKeyboardEvent)); |
+ view_->OnHandleInputEvent(*char_message); |
+ |
+ NativeWebKeyboardEvent keyup_event(NULL, WM_KEYUP, key_code, 0); |
+ scoped_ptr<IPC::Message> keyup_message(new ViewMsg_HandleInputEvent(0)); |
+ keyup_message->WriteData(reinterpret_cast<const char*>(&keyup_event), |
+ sizeof(WebKit::WebKeyboardEvent)); |
+ view_->OnHandleInputEvent(*keyup_message); |
+ |
+ return length; |
+#else |
+ NOTIMPLEMENTED(); |
+ return L'\0'; |
+#endif |
+} |