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

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

Issue 10377158: Move keyboard related methods from RenderViewHostDelegate to a new RenderWidgetHostDelegate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove crbug link Created 8 years, 7 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 | Annotate | Revision Log
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/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
7 #include "base/shared_memory.h" 7 #include "base/shared_memory.h"
8 #include "base/timer.h" 8 #include "base/timer.h"
9 #include "content/browser/browser_thread_impl.h" 9 #include "content/browser/browser_thread_impl.h"
10 #include "content/browser/renderer_host/backing_store.h" 10 #include "content/browser/renderer_host/backing_store.h"
11 #include "content/browser/renderer_host/render_widget_host_delegate.h"
11 #include "content/browser/renderer_host/test_render_view_host.h" 12 #include "content/browser/renderer_host/test_render_view_host.h"
12 #include "content/common/view_messages.h" 13 #include "content/common/view_messages.h"
13 #include "content/port/browser/render_widget_host_view_port.h" 14 #include "content/port/browser/render_widget_host_view_port.h"
14 #include "content/public/browser/notification_details.h" 15 #include "content/public/browser/notification_details.h"
15 #include "content/public/browser/notification_observer.h" 16 #include "content/public/browser/notification_observer.h"
16 #include "content/public/browser/notification_registrar.h" 17 #include "content/public/browser/notification_registrar.h"
17 #include "content/public/browser/notification_source.h" 18 #include "content/public/browser/notification_source.h"
18 #include "content/public/browser/notification_types.h" 19 #include "content/public/browser/notification_types.h"
19 #include "content/test/mock_render_process_host.h" 20 #include "content/test/mock_render_process_host.h"
20 #include "content/test/test_browser_context.h" 21 #include "content/test/test_browser_context.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 virtual gfx::Rect GetViewCocoaBounds() const { 141 virtual gfx::Rect GetViewCocoaBounds() const {
141 return bounds_; 142 return bounds_;
142 } 143 }
143 #endif 144 #endif
144 145
145 protected: 146 protected:
146 gfx::Rect bounds_; 147 gfx::Rect bounds_;
147 DISALLOW_COPY_AND_ASSIGN(TestView); 148 DISALLOW_COPY_AND_ASSIGN(TestView);
148 }; 149 };
149 150
150 // MockRenderWidgetHost ---------------------------------------------------- 151 // MockRenderWidgetHostDelegate --------------------------------------------
151 152
152 class MockRenderWidgetHost : public RenderWidgetHostImpl { 153 class MockRenderWidgetHostDelegate : public content::RenderWidgetHostDelegate {
153 public: 154 public:
154 MockRenderWidgetHost(content::RenderProcessHost* process, int routing_id) 155 MockRenderWidgetHostDelegate()
155 : RenderWidgetHostImpl(process, routing_id), 156 : prehandle_keyboard_event_(false),
156 prehandle_keyboard_event_(false),
157 prehandle_keyboard_event_called_(false), 157 prehandle_keyboard_event_called_(false),
158 prehandle_keyboard_event_type_(WebInputEvent::Undefined), 158 prehandle_keyboard_event_type_(WebInputEvent::Undefined),
159 unhandled_keyboard_event_called_(false), 159 unhandled_keyboard_event_called_(false),
160 unhandled_keyboard_event_type_(WebInputEvent::Undefined), 160 unhandled_keyboard_event_type_(WebInputEvent::Undefined) {
161 unresponsive_timer_fired_(false) {
162 } 161 }
163 162 virtual ~MockRenderWidgetHostDelegate() {}
164 // Allow poking at a few private members.
165 using RenderWidgetHostImpl::OnMsgPaintAtSizeAck;
166 using RenderWidgetHostImpl::OnMsgUpdateRect;
167 using RenderWidgetHostImpl::RendererExited;
168 using RenderWidgetHostImpl::in_flight_size_;
169 using RenderWidgetHostImpl::is_hidden_;
170 using RenderWidgetHostImpl::resize_ack_pending_;
171 163
172 // Tests that make sure we ignore keyboard event acknowledgments to events we 164 // Tests that make sure we ignore keyboard event acknowledgments to events we
173 // didn't send work by making sure we didn't call UnhandledKeyboardEvent(). 165 // didn't send work by making sure we didn't call UnhandledKeyboardEvent().
174 bool unhandled_keyboard_event_called() const { 166 bool unhandled_keyboard_event_called() const {
175 return unhandled_keyboard_event_called_; 167 return unhandled_keyboard_event_called_;
176 } 168 }
177 169
178 WebInputEvent::Type unhandled_keyboard_event_type() const { 170 WebInputEvent::Type unhandled_keyboard_event_type() const {
179 return unhandled_keyboard_event_type_; 171 return unhandled_keyboard_event_type_;
180 } 172 }
181 173
182 bool prehandle_keyboard_event_called() const { 174 bool prehandle_keyboard_event_called() const {
183 return prehandle_keyboard_event_called_; 175 return prehandle_keyboard_event_called_;
184 } 176 }
185 177
186 WebInputEvent::Type prehandle_keyboard_event_type() const { 178 WebInputEvent::Type prehandle_keyboard_event_type() const {
187 return prehandle_keyboard_event_type_; 179 return prehandle_keyboard_event_type_;
188 } 180 }
189 181
190 void set_prehandle_keyboard_event(bool handle) { 182 void set_prehandle_keyboard_event(bool handle) {
191 prehandle_keyboard_event_ = handle; 183 prehandle_keyboard_event_ = handle;
192 } 184 }
193 185
194 bool unresponsive_timer_fired() const {
195 return unresponsive_timer_fired_;
196 }
197
198 void set_hung_renderer_delay_ms(int delay_ms) {
199 hung_renderer_delay_ms_ = delay_ms;
200 }
201
202 protected: 186 protected:
203 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, 187 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
204 bool* is_keyboard_shortcut) { 188 bool* is_keyboard_shortcut) OVERRIDE {
205 prehandle_keyboard_event_type_ = event.type; 189 prehandle_keyboard_event_type_ = event.type;
206 prehandle_keyboard_event_called_ = true; 190 prehandle_keyboard_event_called_ = true;
207 return prehandle_keyboard_event_; 191 return prehandle_keyboard_event_;
208 } 192 }
209 193
210 virtual void UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event) { 194 virtual void HandleKeyboardEvent(
195 const NativeWebKeyboardEvent& event) OVERRIDE {
211 unhandled_keyboard_event_type_ = event.type; 196 unhandled_keyboard_event_type_ = event.type;
212 unhandled_keyboard_event_called_ = true; 197 unhandled_keyboard_event_called_ = true;
213 } 198 }
214 199
215 virtual void NotifyRendererUnresponsive() {
216 unresponsive_timer_fired_ = true;
217 }
218
219 private: 200 private:
220 bool prehandle_keyboard_event_; 201 bool prehandle_keyboard_event_;
221 bool prehandle_keyboard_event_called_; 202 bool prehandle_keyboard_event_called_;
222 WebInputEvent::Type prehandle_keyboard_event_type_; 203 WebInputEvent::Type prehandle_keyboard_event_type_;
223 204
224 bool unhandled_keyboard_event_called_; 205 bool unhandled_keyboard_event_called_;
225 WebInputEvent::Type unhandled_keyboard_event_type_; 206 WebInputEvent::Type unhandled_keyboard_event_type_;
207 };
226 208
209 // MockRenderWidgetHost ----------------------------------------------------
210
211 class MockRenderWidgetHost : public RenderWidgetHostImpl {
212 public:
213 MockRenderWidgetHost(
214 content::RenderWidgetHostDelegate* delegate,
215 content::RenderProcessHost* process,
216 int routing_id)
217 : RenderWidgetHostImpl(delegate, process, routing_id),
218 unresponsive_timer_fired_(false) {
219 }
220
221 // Allow poking at a few private members.
222 using RenderWidgetHostImpl::OnMsgPaintAtSizeAck;
223 using RenderWidgetHostImpl::OnMsgUpdateRect;
224 using RenderWidgetHostImpl::RendererExited;
225 using RenderWidgetHostImpl::in_flight_size_;
226 using RenderWidgetHostImpl::is_hidden_;
227 using RenderWidgetHostImpl::resize_ack_pending_;
228
229 bool unresponsive_timer_fired() const {
230 return unresponsive_timer_fired_;
231 }
232
233 void set_hung_renderer_delay_ms(int delay_ms) {
234 hung_renderer_delay_ms_ = delay_ms;
235 }
236
237 protected:
238 virtual void NotifyRendererUnresponsive() OVERRIDE {
239 unresponsive_timer_fired_ = true;
240 }
241
242 private:
227 bool unresponsive_timer_fired_; 243 bool unresponsive_timer_fired_;
228 }; 244 };
229 245
230 // MockPaintingObserver -------------------------------------------------------- 246 // MockPaintingObserver --------------------------------------------------------
231 247
232 class MockPaintingObserver : public content::NotificationObserver { 248 class MockPaintingObserver : public content::NotificationObserver {
233 public: 249 public:
234 void WidgetDidReceivePaintAtSizeAck(RenderWidgetHostImpl* host, 250 void WidgetDidReceivePaintAtSizeAck(RenderWidgetHostImpl* host,
235 int tag, 251 int tag,
236 const gfx::Size& size) { 252 const gfx::Size& size) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 public: 287 public:
272 RenderWidgetHostTest() : process_(NULL) { 288 RenderWidgetHostTest() : process_(NULL) {
273 } 289 }
274 ~RenderWidgetHostTest() { 290 ~RenderWidgetHostTest() {
275 } 291 }
276 292
277 protected: 293 protected:
278 // testing::Test 294 // testing::Test
279 void SetUp() { 295 void SetUp() {
280 browser_context_.reset(new TestBrowserContext()); 296 browser_context_.reset(new TestBrowserContext());
297 delegate_.reset(new MockRenderWidgetHostDelegate());
281 process_ = new RenderWidgetHostProcess(browser_context_.get()); 298 process_ = new RenderWidgetHostProcess(browser_context_.get());
282 host_.reset(new MockRenderWidgetHost(process_, MSG_ROUTING_NONE)); 299 host_.reset(
300 new MockRenderWidgetHost(delegate_.get(), process_, MSG_ROUTING_NONE));
283 view_.reset(new TestView(host_.get())); 301 view_.reset(new TestView(host_.get()));
284 host_->SetView(view_.get()); 302 host_->SetView(view_.get());
285 host_->Init(); 303 host_->Init();
286 } 304 }
287 void TearDown() { 305 void TearDown() {
288 view_.reset(); 306 view_.reset();
289 host_.reset(); 307 host_.reset();
308 delegate_.reset();
290 process_ = NULL; 309 process_ = NULL;
291 browser_context_.reset(); 310 browser_context_.reset();
292 311
293 // Process all pending tasks to avoid leaks. 312 // Process all pending tasks to avoid leaks.
294 MessageLoop::current()->RunAllPending(); 313 MessageLoop::current()->RunAllPending();
295 } 314 }
296 315
297 void SendInputEventACK(WebInputEvent::Type type, bool processed) { 316 void SendInputEventACK(WebInputEvent::Type type, bool processed) {
298 scoped_ptr<IPC::Message> response( 317 scoped_ptr<IPC::Message> response(
299 new ViewHostMsg_HandleInputEvent_ACK(0, type, processed)); 318 new ViewHostMsg_HandleInputEvent_ACK(0, type, processed));
(...skipping 13 matching lines...) Expand all
313 wheel_event.deltaX = dX; 332 wheel_event.deltaX = dX;
314 wheel_event.deltaY = dY; 333 wheel_event.deltaY = dY;
315 wheel_event.modifiers = modifiers; 334 wheel_event.modifiers = modifiers;
316 host_->ForwardWheelEvent(wheel_event); 335 host_->ForwardWheelEvent(wheel_event);
317 } 336 }
318 337
319 MessageLoopForUI message_loop_; 338 MessageLoopForUI message_loop_;
320 339
321 scoped_ptr<TestBrowserContext> browser_context_; 340 scoped_ptr<TestBrowserContext> browser_context_;
322 RenderWidgetHostProcess* process_; // Deleted automatically by the widget. 341 RenderWidgetHostProcess* process_; // Deleted automatically by the widget.
342 scoped_ptr<MockRenderWidgetHostDelegate> delegate_;
323 scoped_ptr<MockRenderWidgetHost> host_; 343 scoped_ptr<MockRenderWidgetHost> host_;
324 scoped_ptr<TestView> view_; 344 scoped_ptr<TestView> view_;
325 345
326 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostTest); 346 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostTest);
327 }; 347 };
328 348
329 // ----------------------------------------------------------------------------- 349 // -----------------------------------------------------------------------------
330 350
331 TEST_F(RenderWidgetHostTest, Resize) { 351 TEST_F(RenderWidgetHostTest, Resize) {
332 // The initial bounds is the empty rect, so setting it to the same thing 352 // The initial bounds is the empty rect, so setting it to the same thing
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); 654 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
635 655
636 // Make sure we sent the input event to the renderer. 656 // Make sure we sent the input event to the renderer.
637 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 657 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
638 ViewMsg_HandleInputEvent::ID)); 658 ViewMsg_HandleInputEvent::ID));
639 process_->sink().ClearMessages(); 659 process_->sink().ClearMessages();
640 660
641 // Send the simulated response from the renderer back. 661 // Send the simulated response from the renderer back.
642 SendInputEventACK(WebInputEvent::RawKeyDown, false); 662 SendInputEventACK(WebInputEvent::RawKeyDown, false);
643 663
644 EXPECT_TRUE(host_->unhandled_keyboard_event_called()); 664 EXPECT_TRUE(delegate_->unhandled_keyboard_event_called());
645 EXPECT_EQ(WebInputEvent::RawKeyDown, host_->unhandled_keyboard_event_type()); 665 EXPECT_EQ(WebInputEvent::RawKeyDown,
666 delegate_->unhandled_keyboard_event_type());
646 } 667 }
647 668
648 TEST_F(RenderWidgetHostTest, IgnoreKeyEventsWeDidntSend) { 669 TEST_F(RenderWidgetHostTest, IgnoreKeyEventsWeDidntSend) {
649 // Send a simulated, unrequested key response. We should ignore this. 670 // Send a simulated, unrequested key response. We should ignore this.
650 SendInputEventACK(WebInputEvent::RawKeyDown, false); 671 SendInputEventACK(WebInputEvent::RawKeyDown, false);
651 672
652 EXPECT_FALSE(host_->unhandled_keyboard_event_called()); 673 EXPECT_FALSE(delegate_->unhandled_keyboard_event_called());
653 } 674 }
654 675
655 TEST_F(RenderWidgetHostTest, IgnoreKeyEventsHandledByRenderer) { 676 TEST_F(RenderWidgetHostTest, IgnoreKeyEventsHandledByRenderer) {
656 // Simulate a keyboard event. 677 // Simulate a keyboard event.
657 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); 678 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
658 679
659 // Make sure we sent the input event to the renderer. 680 // Make sure we sent the input event to the renderer.
660 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching( 681 EXPECT_TRUE(process_->sink().GetUniqueMessageMatching(
661 ViewMsg_HandleInputEvent::ID)); 682 ViewMsg_HandleInputEvent::ID));
662 process_->sink().ClearMessages(); 683 process_->sink().ClearMessages();
663 684
664 // Send the simulated response from the renderer back. 685 // Send the simulated response from the renderer back.
665 SendInputEventACK(WebInputEvent::RawKeyDown, true); 686 SendInputEventACK(WebInputEvent::RawKeyDown, true);
666 EXPECT_FALSE(host_->unhandled_keyboard_event_called()); 687 EXPECT_FALSE(delegate_->unhandled_keyboard_event_called());
667 } 688 }
668 689
669 TEST_F(RenderWidgetHostTest, PreHandleRawKeyDownEvent) { 690 TEST_F(RenderWidgetHostTest, PreHandleRawKeyDownEvent) {
670 // Simluate the situation that the browser handled the key down event during 691 // Simluate the situation that the browser handled the key down event during
671 // pre-handle phrase. 692 // pre-handle phrase.
672 host_->set_prehandle_keyboard_event(true); 693 delegate_->set_prehandle_keyboard_event(true);
673 process_->sink().ClearMessages(); 694 process_->sink().ClearMessages();
674 695
675 // Simulate a keyboard event. 696 // Simulate a keyboard event.
676 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); 697 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
677 698
678 EXPECT_TRUE(host_->prehandle_keyboard_event_called()); 699 EXPECT_TRUE(delegate_->prehandle_keyboard_event_called());
679 EXPECT_EQ(WebInputEvent::RawKeyDown, host_->prehandle_keyboard_event_type()); 700 EXPECT_EQ(WebInputEvent::RawKeyDown,
701 delegate_->prehandle_keyboard_event_type());
680 702
681 // Make sure the RawKeyDown event is not sent to the renderer. 703 // Make sure the RawKeyDown event is not sent to the renderer.
682 EXPECT_EQ(0U, process_->sink().message_count()); 704 EXPECT_EQ(0U, process_->sink().message_count());
683 705
684 // The browser won't pre-handle a Char event. 706 // The browser won't pre-handle a Char event.
685 host_->set_prehandle_keyboard_event(false); 707 delegate_->set_prehandle_keyboard_event(false);
686 708
687 // Forward the Char event. 709 // Forward the Char event.
688 SimulateKeyboardEvent(WebInputEvent::Char); 710 SimulateKeyboardEvent(WebInputEvent::Char);
689 711
690 // Make sure the Char event is suppressed. 712 // Make sure the Char event is suppressed.
691 EXPECT_EQ(0U, process_->sink().message_count()); 713 EXPECT_EQ(0U, process_->sink().message_count());
692 714
693 // Forward the KeyUp event. 715 // Forward the KeyUp event.
694 SimulateKeyboardEvent(WebInputEvent::KeyUp); 716 SimulateKeyboardEvent(WebInputEvent::KeyUp);
695 717
696 // Make sure only KeyUp was sent to the renderer. 718 // Make sure only KeyUp was sent to the renderer.
697 EXPECT_EQ(1U, process_->sink().message_count()); 719 EXPECT_EQ(1U, process_->sink().message_count());
698 EXPECT_EQ(ViewMsg_HandleInputEvent::ID, 720 EXPECT_EQ(ViewMsg_HandleInputEvent::ID,
699 process_->sink().GetMessageAt(0)->type()); 721 process_->sink().GetMessageAt(0)->type());
700 process_->sink().ClearMessages(); 722 process_->sink().ClearMessages();
701 723
702 // Send the simulated response from the renderer back. 724 // Send the simulated response from the renderer back.
703 SendInputEventACK(WebInputEvent::KeyUp, false); 725 SendInputEventACK(WebInputEvent::KeyUp, false);
704 726
705 EXPECT_TRUE(host_->unhandled_keyboard_event_called()); 727 EXPECT_TRUE(delegate_->unhandled_keyboard_event_called());
706 EXPECT_EQ(WebInputEvent::KeyUp, host_->unhandled_keyboard_event_type()); 728 EXPECT_EQ(WebInputEvent::KeyUp, delegate_->unhandled_keyboard_event_type());
707 } 729 }
708 730
709 TEST_F(RenderWidgetHostTest, CoalescesWheelEvents) { 731 TEST_F(RenderWidgetHostTest, CoalescesWheelEvents) {
710 process_->sink().ClearMessages(); 732 process_->sink().ClearMessages();
711 733
712 // Simulate wheel events. 734 // Simulate wheel events.
713 SimulateWheelEvent(0, -5, 0); // sent directly 735 SimulateWheelEvent(0, -5, 0); // sent directly
714 SimulateWheelEvent(0, -10, 0); // enqueued 736 SimulateWheelEvent(0, -10, 0); // enqueued
715 SimulateWheelEvent(8, -6, 0); // coalesced into previous event 737 SimulateWheelEvent(8, -6, 0); // coalesced into previous event
716 SimulateWheelEvent(9, -7, 1); // enqueued, different modifiers 738 SimulateWheelEvent(9, -7, 1); // enqueued, different modifiers
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); 815 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
794 SimulateKeyboardEvent(WebInputEvent::RawKeyDown); 816 SimulateKeyboardEvent(WebInputEvent::RawKeyDown);
795 SendInputEventACK(WebInputEvent::RawKeyDown, true); 817 SendInputEventACK(WebInputEvent::RawKeyDown, true);
796 818
797 // Wait long enough for first timeout and see if it fired. 819 // Wait long enough for first timeout and see if it fired.
798 MessageLoop::current()->PostDelayedTask( 820 MessageLoop::current()->PostDelayedTask(
799 FROM_HERE, MessageLoop::QuitClosure(), TimeDelta::FromMilliseconds(40)); 821 FROM_HERE, MessageLoop::QuitClosure(), TimeDelta::FromMilliseconds(40));
800 MessageLoop::current()->Run(); 822 MessageLoop::current()->Run();
801 EXPECT_TRUE(host_->unresponsive_timer_fired()); 823 EXPECT_TRUE(host_->unresponsive_timer_fired());
802 } 824 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698