Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: content/browser/renderer_host/render_widget_host_unittest.cc

Issue 1391843006: Embed keyboard shortcut bit in WebKeyboardEvent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix mac test compile Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 using blink::WebGestureEvent; 48 using blink::WebGestureEvent;
49 using blink::WebInputEvent; 49 using blink::WebInputEvent;
50 using blink::WebKeyboardEvent; 50 using blink::WebKeyboardEvent;
51 using blink::WebMouseEvent; 51 using blink::WebMouseEvent;
52 using blink::WebMouseWheelEvent; 52 using blink::WebMouseWheelEvent;
53 using blink::WebTouchEvent; 53 using blink::WebTouchEvent;
54 using blink::WebTouchPoint; 54 using blink::WebTouchPoint;
55 55
56 namespace content { 56 namespace content {
57 57
58 std::string GetInputMessageTypes(MockRenderProcessHost* process) {
59 std::string result;
60 for (size_t i = 0; i < process->sink().message_count(); ++i) {
61 const IPC::Message* message = process->sink().GetMessageAt(i);
62 EXPECT_EQ(InputMsg_HandleInputEvent::ID, message->type());
63 InputMsg_HandleInputEvent::Param params;
64 EXPECT_TRUE(InputMsg_HandleInputEvent::Read(message, &params));
65 const WebInputEvent* event = base::get<0>(params);
66 if (i != 0)
67 result += " ";
68 result += WebInputEventTraits::GetName(event->type);
69 }
70 process->sink().ClearMessages();
71 return result;
72 }
73
58 // MockInputRouter ------------------------------------------------------------- 74 // MockInputRouter -------------------------------------------------------------
59 75
60 class MockInputRouter : public InputRouter { 76 class MockInputRouter : public InputRouter {
61 public: 77 public:
62 explicit MockInputRouter(InputRouterClient* client) 78 explicit MockInputRouter(InputRouterClient* client)
63 : send_event_called_(false), 79 : send_event_called_(false),
64 sent_mouse_event_(false), 80 sent_mouse_event_(false),
65 sent_wheel_event_(false), 81 sent_wheel_event_(false),
66 sent_keyboard_event_(false), 82 sent_keyboard_event_(false),
67 sent_gesture_event_(false), 83 sent_gesture_event_(false),
68 send_touch_event_not_cancelled_(false), 84 send_touch_event_not_cancelled_(false),
69 message_received_(false), 85 message_received_(false),
70 client_(client) { 86 client_(client) {
71 } 87 }
72 ~MockInputRouter() override {} 88 ~MockInputRouter() override {}
73 89
74 // InputRouter 90 // InputRouter
75 bool SendInput(scoped_ptr<IPC::Message> message) override { 91 bool SendInput(scoped_ptr<IPC::Message> message) override {
76 send_event_called_ = true; 92 send_event_called_ = true;
77 return true; 93 return true;
78 } 94 }
79 void SendMouseEvent(const MouseEventWithLatencyInfo& mouse_event) override { 95 void SendMouseEvent(const MouseEventWithLatencyInfo& mouse_event) override {
80 sent_mouse_event_ = true; 96 sent_mouse_event_ = true;
81 } 97 }
82 void SendWheelEvent( 98 void SendWheelEvent(
83 const MouseWheelEventWithLatencyInfo& wheel_event) override { 99 const MouseWheelEventWithLatencyInfo& wheel_event) override {
84 sent_wheel_event_ = true; 100 sent_wheel_event_ = true;
85 } 101 }
86 void SendKeyboardEvent(const NativeWebKeyboardEventWithLatencyInfo& key_event, 102 void SendKeyboardEvent(
87 bool is_shortcut) override { 103 const NativeWebKeyboardEventWithLatencyInfo& key_event) override {
88 sent_keyboard_event_ = true; 104 sent_keyboard_event_ = true;
89 } 105 }
90 void SendGestureEvent( 106 void SendGestureEvent(
91 const GestureEventWithLatencyInfo& gesture_event) override { 107 const GestureEventWithLatencyInfo& gesture_event) override {
92 sent_gesture_event_ = true; 108 sent_gesture_event_ = true;
93 } 109 }
94 void SendTouchEvent(const TouchEventWithLatencyInfo& touch_event) override { 110 void SendTouchEvent(const TouchEventWithLatencyInfo& touch_event) override {
95 send_touch_event_not_cancelled_ = 111 send_touch_event_not_cancelled_ =
96 client_->FilterInputEvent(touch_event.event, touch_event.latency) == 112 client_->FilterInputEvent(touch_event.event, touch_event.latency) ==
97 INPUT_EVENT_ACK_STATE_NOT_CONSUMED; 113 INPUT_EVENT_ACK_STATE_NOT_CONSUMED;
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 private: 336 private:
321 DISALLOW_COPY_AND_ASSIGN(TestView); 337 DISALLOW_COPY_AND_ASSIGN(TestView);
322 }; 338 };
323 339
324 // MockRenderWidgetHostDelegate -------------------------------------------- 340 // MockRenderWidgetHostDelegate --------------------------------------------
325 341
326 class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate { 342 class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
327 public: 343 public:
328 MockRenderWidgetHostDelegate() 344 MockRenderWidgetHostDelegate()
329 : prehandle_keyboard_event_(false), 345 : prehandle_keyboard_event_(false),
346 prehandle_keyboard_event_is_shortcut_(false),
330 prehandle_keyboard_event_called_(false), 347 prehandle_keyboard_event_called_(false),
331 prehandle_keyboard_event_type_(WebInputEvent::Undefined), 348 prehandle_keyboard_event_type_(WebInputEvent::Undefined),
332 unhandled_keyboard_event_called_(false), 349 unhandled_keyboard_event_called_(false),
333 unhandled_keyboard_event_type_(WebInputEvent::Undefined), 350 unhandled_keyboard_event_type_(WebInputEvent::Undefined),
334 handle_wheel_event_(false), 351 handle_wheel_event_(false),
335 handle_wheel_event_called_(false) { 352 handle_wheel_event_called_(false) {}
336 }
337 ~MockRenderWidgetHostDelegate() override {} 353 ~MockRenderWidgetHostDelegate() override {}
338 354
339 // Tests that make sure we ignore keyboard event acknowledgments to events we 355 // Tests that make sure we ignore keyboard event acknowledgments to events we
340 // didn't send work by making sure we didn't call UnhandledKeyboardEvent(). 356 // didn't send work by making sure we didn't call UnhandledKeyboardEvent().
341 bool unhandled_keyboard_event_called() const { 357 bool unhandled_keyboard_event_called() const {
342 return unhandled_keyboard_event_called_; 358 return unhandled_keyboard_event_called_;
343 } 359 }
344 360
345 WebInputEvent::Type unhandled_keyboard_event_type() const { 361 WebInputEvent::Type unhandled_keyboard_event_type() const {
346 return unhandled_keyboard_event_type_; 362 return unhandled_keyboard_event_type_;
347 } 363 }
348 364
349 bool prehandle_keyboard_event_called() const { 365 bool prehandle_keyboard_event_called() const {
350 return prehandle_keyboard_event_called_; 366 return prehandle_keyboard_event_called_;
351 } 367 }
352 368
353 WebInputEvent::Type prehandle_keyboard_event_type() const { 369 WebInputEvent::Type prehandle_keyboard_event_type() const {
354 return prehandle_keyboard_event_type_; 370 return prehandle_keyboard_event_type_;
355 } 371 }
356 372
357 void set_prehandle_keyboard_event(bool handle) { 373 void set_prehandle_keyboard_event(bool handle) {
358 prehandle_keyboard_event_ = handle; 374 prehandle_keyboard_event_ = handle;
359 } 375 }
360 376
361 void set_handle_wheel_event(bool handle) { 377 void set_handle_wheel_event(bool handle) {
362 handle_wheel_event_ = handle; 378 handle_wheel_event_ = handle;
363 } 379 }
364 380
365 bool handle_wheel_event_called() { 381 void set_prehandle_keyboard_event_is_shortcut(bool is_shortcut) {
366 return handle_wheel_event_called_; 382 prehandle_keyboard_event_is_shortcut_ = is_shortcut;
367 } 383 }
368 384
385 bool handle_wheel_event_called() const { return handle_wheel_event_called_; }
386
369 protected: 387 protected:
370 bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, 388 bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
371 bool* is_keyboard_shortcut) override { 389 bool* is_keyboard_shortcut) override {
372 prehandle_keyboard_event_type_ = event.type; 390 prehandle_keyboard_event_type_ = event.type;
373 prehandle_keyboard_event_called_ = true; 391 prehandle_keyboard_event_called_ = true;
392 *is_keyboard_shortcut = prehandle_keyboard_event_is_shortcut_;
374 return prehandle_keyboard_event_; 393 return prehandle_keyboard_event_;
375 } 394 }
376 395
377 void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) override { 396 void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) override {
378 unhandled_keyboard_event_type_ = event.type; 397 unhandled_keyboard_event_type_ = event.type;
379 unhandled_keyboard_event_called_ = true; 398 unhandled_keyboard_event_called_ = true;
380 } 399 }
381 400
382 bool HandleWheelEvent(const blink::WebMouseWheelEvent& event) override { 401 bool HandleWheelEvent(const blink::WebMouseWheelEvent& event) override {
383 handle_wheel_event_called_ = true; 402 handle_wheel_event_called_ = true;
384 return handle_wheel_event_; 403 return handle_wheel_event_;
385 } 404 }
386 405
387 void Cut() override {} 406 void Cut() override {}
388 void Copy() override {} 407 void Copy() override {}
389 void Paste() override {} 408 void Paste() override {}
390 void SelectAll() override {} 409 void SelectAll() override {}
391 410
392 private: 411 private:
393 bool prehandle_keyboard_event_; 412 bool prehandle_keyboard_event_;
413 bool prehandle_keyboard_event_is_shortcut_;
394 bool prehandle_keyboard_event_called_; 414 bool prehandle_keyboard_event_called_;
395 WebInputEvent::Type prehandle_keyboard_event_type_; 415 WebInputEvent::Type prehandle_keyboard_event_type_;
396 416
397 bool unhandled_keyboard_event_called_; 417 bool unhandled_keyboard_event_called_;
398 WebInputEvent::Type unhandled_keyboard_event_type_; 418 WebInputEvent::Type unhandled_keyboard_event_type_;
399 419
400 bool handle_wheel_event_; 420 bool handle_wheel_event_;
401 bool handle_wheel_event_called_; 421 bool handle_wheel_event_called_;
402 }; 422 };
403 423
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 InputMsg_HandleInputEvent::ID)); 904 InputMsg_HandleInputEvent::ID));
885 process_->sink().ClearMessages(); 905 process_->sink().ClearMessages();
886 906
887 // Send the simulated response from the renderer back. 907 // Send the simulated response from the renderer back.
888 SendInputEventACK(WebInputEvent::RawKeyDown, 908 SendInputEventACK(WebInputEvent::RawKeyDown,
889 INPUT_EVENT_ACK_STATE_CONSUMED); 909 INPUT_EVENT_ACK_STATE_CONSUMED);
890 EXPECT_FALSE(delegate_->unhandled_keyboard_event_called()); 910 EXPECT_FALSE(delegate_->unhandled_keyboard_event_called());
891 } 911 }
892 912
893 TEST_F(RenderWidgetHostTest, PreHandleRawKeyDownEvent) { 913 TEST_F(RenderWidgetHostTest, PreHandleRawKeyDownEvent) {
894 // Simluate the situation that the browser handled the key down event during 914 // Simulate the situation that the browser handled the key down event during
895 // pre-handle phrase. 915 // pre-handle phrase.
896 delegate_->set_prehandle_keyboard_event(true); 916 delegate_->set_prehandle_keyboard_event(true);
897 process_->sink().ClearMessages(); 917 process_->sink().ClearMessages();
898 918
899 // Simulate a keyboard event. 919 // Simulate a keyboard event.
900 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); 920 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
901 921
902 EXPECT_TRUE(delegate_->prehandle_keyboard_event_called()); 922 EXPECT_TRUE(delegate_->prehandle_keyboard_event_called());
903 EXPECT_EQ(WebInputEvent::RawKeyDown, 923 EXPECT_EQ(WebInputEvent::RawKeyDown,
904 delegate_->prehandle_keyboard_event_type()); 924 delegate_->prehandle_keyboard_event_type());
(...skipping 20 matching lines...) Expand all
925 process_->sink().ClearMessages(); 945 process_->sink().ClearMessages();
926 946
927 // Send the simulated response from the renderer back. 947 // Send the simulated response from the renderer back.
928 SendInputEventACK(WebInputEvent::KeyUp, 948 SendInputEventACK(WebInputEvent::KeyUp,
929 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 949 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
930 950
931 EXPECT_TRUE(delegate_->unhandled_keyboard_event_called()); 951 EXPECT_TRUE(delegate_->unhandled_keyboard_event_called());
932 EXPECT_EQ(WebInputEvent::KeyUp, delegate_->unhandled_keyboard_event_type()); 952 EXPECT_EQ(WebInputEvent::KeyUp, delegate_->unhandled_keyboard_event_type());
933 } 953 }
934 954
955 TEST_F(RenderWidgetHostTest, RawKeyDownShortcutEvent) {
956 // Simulate the situation that the browser marks the key down as a keyboard
957 // shortcut, but doesn't consume it in the pre-handle phase.
958 delegate_->set_prehandle_keyboard_event_is_shortcut(true);
959 process_->sink().ClearMessages();
960
961 // Simulate a keyboard event.
962 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
963
964 EXPECT_TRUE(delegate_->prehandle_keyboard_event_called());
965 EXPECT_EQ(WebInputEvent::RawKeyDown,
966 delegate_->prehandle_keyboard_event_type());
967
968 // Make sure the RawKeyDown event is sent to the renderer.
969 EXPECT_EQ(1U, process_->sink().message_count());
970 EXPECT_EQ("RawKeyDown", GetInputMessageTypes(process_));
971 process_->sink().ClearMessages();
972
973 // Send the simulated response from the renderer back.
974 SendInputEventACK(WebInputEvent::RawKeyDown,
975 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
976 EXPECT_EQ(WebInputEvent::RawKeyDown,
977 delegate_->unhandled_keyboard_event_type());
978
979 // The browser won't pre-handle a Char event.
980 delegate_->set_prehandle_keyboard_event_is_shortcut(false);
981
982 // Forward the Char event.
983 SimulateKeyboardEvent(WebInputEvent::Char);
984
985 // The Char event is not suppressed; the renderer will ignore it
986 // if the preceding RawKeyDown shortcut goes unhandled.
987 EXPECT_EQ(1U, process_->sink().message_count());
988 EXPECT_EQ("Char", GetInputMessageTypes(process_));
989 process_->sink().ClearMessages();
990
991 // Send the simulated response from the renderer back.
992 SendInputEventACK(WebInputEvent::Char, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
993 EXPECT_EQ(WebInputEvent::Char, delegate_->unhandled_keyboard_event_type());
994
995 // Forward the KeyUp event.
996 SimulateKeyboardEvent(WebInputEvent::KeyUp);
997
998 // Make sure only KeyUp was sent to the renderer.
999 EXPECT_EQ(1U, process_->sink().message_count());
1000 EXPECT_EQ("KeyUp", GetInputMessageTypes(process_));
1001 process_->sink().ClearMessages();
1002
1003 // Send the simulated response from the renderer back.
1004 SendInputEventACK(WebInputEvent::KeyUp, INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1005 EXPECT_EQ(WebInputEvent::KeyUp, delegate_->unhandled_keyboard_event_type());
1006 }
1007
935 TEST_F(RenderWidgetHostTest, UnhandledWheelEvent) { 1008 TEST_F(RenderWidgetHostTest, UnhandledWheelEvent) {
936 SimulateWheelEvent(-5, 0, 0, true); 1009 SimulateWheelEvent(-5, 0, 0, true);
937 1010
938 // Make sure we sent the input event to the renderer. 1011 // Make sure we sent the input event to the renderer.
939 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 1012 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
940 InputMsg_HandleInputEvent::ID)); 1013 InputMsg_HandleInputEvent::ID));
941 process_->sink().ClearMessages(); 1014 process_->sink().ClearMessages();
942 1015
943 // Send the simulated response from the renderer back. 1016 // Send the simulated response from the renderer back.
944 SendInputEventACK(WebInputEvent::MouseWheel, 1017 SendInputEventACK(WebInputEvent::MouseWheel,
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 1200
1128 // Test with a long delay to ensure that it does fire this time. 1201 // Test with a long delay to ensure that it does fire this time.
1129 host_->StartNewContentRenderingTimeout(); 1202 host_->StartNewContentRenderingTimeout();
1130 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 1203 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
1131 FROM_HERE, base::MessageLoop::QuitClosure(), 1204 FROM_HERE, base::MessageLoop::QuitClosure(),
1132 TimeDelta::FromMicroseconds(20)); 1205 TimeDelta::FromMicroseconds(20));
1133 base::MessageLoop::current()->Run(); 1206 base::MessageLoop::current()->Run();
1134 EXPECT_TRUE(host_->new_content_rendering_timeout_fired()); 1207 EXPECT_TRUE(host_->new_content_rendering_timeout_fired());
1135 } 1208 }
1136 1209
1137 std::string GetInputMessageTypes(RenderWidgetHostProcess* process) {
1138 std::string result;
1139 for (size_t i = 0; i < process->sink().message_count(); ++i) {
1140 const IPC::Message *message = process->sink().GetMessageAt(i);
1141 EXPECT_EQ(InputMsg_HandleInputEvent::ID, message->type());
1142 InputMsg_HandleInputEvent::Param params;
1143 EXPECT_TRUE(InputMsg_HandleInputEvent::Read(message, &params));
1144 const WebInputEvent* event = base::get<0>(params);
1145 if (i != 0)
1146 result += " ";
1147 result += WebInputEventTraits::GetName(event->type);
1148 }
1149 process->sink().ClearMessages();
1150 return result;
1151 }
1152
1153 TEST_F(RenderWidgetHostTest, TouchEmulator) { 1210 TEST_F(RenderWidgetHostTest, TouchEmulator) {
1154 simulated_event_time_delta_seconds_ = 0.1; 1211 simulated_event_time_delta_seconds_ = 0.1;
1155 // Immediately ack all touches instead of sending them to the renderer. 1212 // Immediately ack all touches instead of sending them to the renderer.
1156 host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false)); 1213 host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false));
1157 host_->SetTouchEventEmulationEnabled( 1214 host_->SetTouchEventEmulationEnabled(
1158 true, ui::GestureProviderConfigType::GENERIC_MOBILE); 1215 true, ui::GestureProviderConfigType::GENERIC_MOBILE);
1159 process_->sink().ClearMessages(); 1216 process_->sink().ClearMessages();
1160 view_->set_bounds(gfx::Rect(0, 0, 400, 200)); 1217 view_->set_bounds(gfx::Rect(0, 0, 400, 200));
1161 view_->Show(); 1218 view_->Show();
1162 1219
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 // Having an initial size set means that the size information had been sent 1647 // Having an initial size set means that the size information had been sent
1591 // with the reqiest to new up the RenderView and so subsequent WasResized 1648 // with the reqiest to new up the RenderView and so subsequent WasResized
1592 // calls should not result in new IPC (unless the size has actually changed). 1649 // calls should not result in new IPC (unless the size has actually changed).
1593 host_->WasResized(); 1650 host_->WasResized();
1594 EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID)); 1651 EXPECT_FALSE(process_->sink().GetUniqueMessageMatching(ViewMsg_Resize::ID));
1595 EXPECT_EQ(initial_size_, host_->old_resize_params_->new_size); 1652 EXPECT_EQ(initial_size_, host_->old_resize_params_->new_size);
1596 EXPECT_TRUE(host_->resize_ack_pending_); 1653 EXPECT_TRUE(host_->resize_ack_pending_);
1597 } 1654 }
1598 1655
1599 } // namespace content 1656 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698