Index: chrome/browser/renderer_host/render_widget_host_unittest.cc |
=================================================================== |
--- chrome/browser/renderer_host/render_widget_host_unittest.cc (revision 10502) |
+++ chrome/browser/renderer_host/render_widget_host_unittest.cc (working copy) |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "base/basictypes.h" |
+#include "base/keyboard_codes.h" |
#include "base/scoped_ptr.h" |
#include "base/shared_memory.h" |
#include "build/build_config.h" |
@@ -119,6 +120,30 @@ |
DISALLOW_COPY_AND_ASSIGN(TestView); |
}; |
+// MockRenderWidgetHostTest ---------------------------------------------------- |
+ |
+class MockRenderWidgetHost : public RenderWidgetHost { |
+ public: |
+ MockRenderWidgetHost(RenderProcessHost* process, int routing_id) |
+ : RenderWidgetHost(process, routing_id), |
+ unhandled_keyboard_event_called_(false) { |
+ } |
+ |
+ // Tests that make sure we ignore keyboard event acknowledgments to events we |
+ // didn't send work by making sure we didn't call UnhandledKeyboardEvent(). |
+ bool unhandled_keyboard_event_called() const { |
+ return unhandled_keyboard_event_called_; |
+ } |
+ |
+ protected: |
+ virtual void UnhandledKeyboardEvent(const WebKeyboardEvent& event) { |
+ unhandled_keyboard_event_called_ = true; |
+ } |
+ |
+ private: |
+ bool unhandled_keyboard_event_called_; |
+}; |
+ |
// RenderWidgetHostTest -------------------------------------------------------- |
class RenderWidgetHostTest : public testing::Test { |
@@ -133,7 +158,7 @@ |
void SetUp() { |
profile_.reset(new TestingProfile()); |
process_ = new RenderWidgetHostProcess(profile_.get()); |
- host_.reset(new RenderWidgetHost(process_, 1)); |
+ host_.reset(new MockRenderWidgetHost(process_, 1)); |
view_.reset(new TestView); |
host_->set_view(view_.get()); |
} |
@@ -151,7 +176,7 @@ |
scoped_ptr<TestingProfile> profile_; |
RenderWidgetHostProcess* process_; // Deleted automatically by the widget. |
- scoped_ptr<RenderWidgetHost> host_; |
+ scoped_ptr<MockRenderWidgetHost> host_; |
scoped_ptr<TestView> view_; |
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostTest); |
@@ -304,3 +329,38 @@ |
ViewMsg_WasRestored::Read(restored, &needs_repaint); |
EXPECT_TRUE(needs_repaint); |
} |
+ |
+TEST_F(RenderWidgetHostTest, HandleKeyEventsWeSent) { |
+ WebKeyboardEvent key_event; |
+ key_event.type = WebInputEvent::KEY_DOWN; |
+ key_event.modifiers = WebInputEvent::CTRL_KEY; |
+ key_event.key_code = base::VKEY_L; // non-null made up value. |
+ |
+ host_->ForwardKeyboardEvent(key_event); |
+ |
+ // Make sure we sent the input event to the renderer. |
+ EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( |
+ ViewMsg_HandleInputEvent::ID)); |
+ process_->sink().ClearMessages(); |
+ |
+ // Send the simulated response from the renderer back. |
+ scoped_ptr<IPC::Message> response( |
+ new ViewHostMsg_HandleInputEvent_ACK(0)); |
+ response->WriteInt(key_event.type); |
+ response->WriteBool(false); |
+ host_->OnMessageReceived(*response); |
+ |
+ EXPECT_TRUE(host_->unhandled_keyboard_event_called()); |
+} |
+ |
+TEST_F(RenderWidgetHostTest, IgnoreKeyEventsWeDidntSend) { |
+ // Send a simulated, unrequested key response. We should ignore this. |
+ scoped_ptr<IPC::Message> response( |
+ new ViewHostMsg_HandleInputEvent_ACK(0)); |
+ response->WriteInt(WebInputEvent::KEY_DOWN); |
+ response->WriteBool(false); |
+ host_->OnMessageReceived(*response); |
+ |
+ EXPECT_FALSE(host_->unhandled_keyboard_event_called()); |
+} |
+ |