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

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

Issue 997283002: Coalesce async touch move events until the ack back from render (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ack struct and unittest Created 5 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
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 "content/browser/renderer_host/render_widget_host_view_aura.h" 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/memory/shared_memory.h" 10 #include "base/memory/shared_memory.h"
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 // which uses ObserverListThreadSafe, which furthermore remembers the 436 // which uses ObserverListThreadSafe, which furthermore remembers the
437 // message loop for the thread it was created in. Between tests, the 437 // message loop for the thread it was created in. Between tests, the
438 // RendererFrameManager singleton survives and and the MessageLoop gets 438 // RendererFrameManager singleton survives and and the MessageLoop gets
439 // destroyed. The correct fix would be to have ObserverListThreadSafe look 439 // destroyed. The correct fix would be to have ObserverListThreadSafe look
440 // up the proper message loop every time (see crbug.com/443824.) 440 // up the proper message loop every time (see crbug.com/443824.)
441 RendererFrameManager::GetInstance()->OnMemoryPressure(level); 441 RendererFrameManager::GetInstance()->OnMemoryPressure(level);
442 } 442 }
443 443
444 void SendInputEventACK(WebInputEvent::Type type, 444 void SendInputEventACK(WebInputEvent::Type type,
445 InputEventAckState ack_result) { 445 InputEventAckState ack_result) {
446 InputHostMsg_HandleInputEvent_ACK_Params ack; 446 InputEventAck ack(type, ack_result);
447 ack.type = type; 447 if (WebInputEvent::isTouchEventType(type))
448 ack.state = ack_result; 448 ack.unique_touch_event_id = last_sent_event_id_;
449 InputHostMsg_HandleInputEvent_ACK response(0, ack); 449 InputHostMsg_HandleInputEvent_ACK response(0, ack);
450 widget_host_->OnMessageReceived(response); 450 widget_host_->OnMessageReceived(response);
451 } 451 }
452 452
453 size_t GetSentMessageCountAndResetSink() { 453 size_t GetSentMessageCountAndResetSink() {
454 size_t count = sink_->message_count(); 454 size_t count = sink_->message_count();
455 sink_->ClearMessages(); 455 sink_->ClearMessages();
456 return count; 456 return count;
457 } 457 }
458 458
459 void AckLastSentInputEventIfNecessary(InputEventAckState ack_result) { 459 void AckLastSentInputEventIfNecessary(InputEventAckState ack_result) {
460 if (!sink_->message_count()) 460 if (!sink_->message_count())
461 return; 461 return;
462 462
463 InputMsg_HandleInputEvent::Param params; 463 InputMsg_HandleInputEvent::Param params;
464 if (!InputMsg_HandleInputEvent::Read( 464 if (!InputMsg_HandleInputEvent::Read(
465 sink_->GetMessageAt(sink_->message_count() - 1), &params)) { 465 sink_->GetMessageAt(sink_->message_count() - 1), &params)) {
466 return; 466 return;
467 } 467 }
468 468
469 if (WebInputEventTraits::IgnoresAckDisposition(*get<0>(params))) 469 if (!WebInputEventTraits::WillReceiveAckFromRenderer(*get<0>(params)))
470 return; 470 return;
471 471
472 SetLastSentEventIDFromSentEvent();
472 SendInputEventACK(get<0>(params)->type, ack_result); 473 SendInputEventACK(get<0>(params)->type, ack_result);
473 } 474 }
474 475
476 void SetLastSentEventID(uint32 event_id) { last_sent_event_id_ = event_id; }
jdduke (slow) 2015/05/07 21:11:16 Instead of setting the id and trying to guess it,
477
478 void SetLastSentEventIDFromSentEvent() {
479 size_t count = sink_->message_count();
480 for (size_t i = 0; i < count; ++i) {
481 const WebInputEvent* input_event =
482 GetInputEventFromMessage(*sink_->GetMessageAt(i));
483 last_sent_event_id_ =
484 WebInputEventTraits::GetUniqueTouchEventId(*input_event);
485 }
486 }
487
475 protected: 488 protected:
476 // If true, then calls RWH::Shutdown() instead of deleting RWH. 489 // If true, then calls RWH::Shutdown() instead of deleting RWH.
477 bool widget_host_uses_shutdown_to_destroy_; 490 bool widget_host_uses_shutdown_to_destroy_;
478 491
479 bool is_guest_view_hack_; 492 bool is_guest_view_hack_;
480 493
481 base::MessageLoopForUI message_loop_; 494 base::MessageLoopForUI message_loop_;
482 BrowserThreadImpl browser_thread_for_ui_; 495 BrowserThreadImpl browser_thread_for_ui_;
483 scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_; 496 scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
484 scoped_ptr<BrowserContext> browser_context_; 497 scoped_ptr<BrowserContext> browser_context_;
485 MockRenderWidgetHostDelegate delegate_; 498 MockRenderWidgetHostDelegate delegate_;
486 MockRenderProcessHost* process_host_; 499 MockRenderProcessHost* process_host_;
487 500
488 // Tests should set these to NULL if they've already triggered their 501 // Tests should set these to NULL if they've already triggered their
489 // destruction. 502 // destruction.
490 RenderWidgetHostImpl* parent_host_; 503 RenderWidgetHostImpl* parent_host_;
491 RenderWidgetHostViewAura* parent_view_; 504 RenderWidgetHostViewAura* parent_view_;
492 505
493 // Tests should set these to NULL if they've already triggered their 506 // Tests should set these to NULL if they've already triggered their
494 // destruction. 507 // destruction.
495 RenderWidgetHostImpl* widget_host_; 508 RenderWidgetHostImpl* widget_host_;
496 FakeRenderWidgetHostViewAura* view_; 509 FakeRenderWidgetHostViewAura* view_;
497 510
498 IPC::TestSink* sink_; 511 IPC::TestSink* sink_;
499 512
513 uint32 last_sent_event_id_;
514
500 private: 515 private:
501 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest); 516 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest);
502 }; 517 };
503 518
504 // Helper class to instantiate RenderWidgetHostViewGuest which is backed 519 // Helper class to instantiate RenderWidgetHostViewGuest which is backed
505 // by an aura platform view. 520 // by an aura platform view.
506 class RenderWidgetHostViewGuestAuraTest : public RenderWidgetHostViewAuraTest { 521 class RenderWidgetHostViewGuestAuraTest : public RenderWidgetHostViewAuraTest {
507 public: 522 public:
508 RenderWidgetHostViewGuestAuraTest() { 523 RenderWidgetHostViewGuestAuraTest() {
509 // Use RWH::Shutdown to destroy RWH, instead of deleting. 524 // Use RWH::Shutdown to destroy RWH, instead of deleting.
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 view_->OnTouchEvent(&press); 1110 view_->OnTouchEvent(&press);
1096 EXPECT_TRUE(press.synchronous_handling_disabled()); 1111 EXPECT_TRUE(press.synchronous_handling_disabled());
1097 EXPECT_EQ(blink::WebInputEvent::TouchStart, view_->touch_event_->type); 1112 EXPECT_EQ(blink::WebInputEvent::TouchStart, view_->touch_event_->type);
1098 EXPECT_EQ(1U, view_->touch_event_->touchesLength); 1113 EXPECT_EQ(1U, view_->touch_event_->touchesLength);
1099 EXPECT_EQ(blink::WebTouchPoint::StatePressed, 1114 EXPECT_EQ(blink::WebTouchPoint::StatePressed,
1100 view_->touch_event_->touches[0].state); 1115 view_->touch_event_->touches[0].state);
1101 1116
1102 widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false)); 1117 widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false));
1103 1118
1104 // Ack'ing the outstanding event should flush the pending touch queue. 1119 // Ack'ing the outstanding event should flush the pending touch queue.
1105 InputHostMsg_HandleInputEvent_ACK_Params ack; 1120 InputEventAck ack(blink::WebInputEvent::TouchStart,
1106 ack.type = blink::WebInputEvent::TouchStart; 1121 INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1107 ack.state = INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; 1122 ack.unique_touch_event_id = press.unique_event_id();
1108 widget_host_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack)); 1123 widget_host_->OnMessageReceived(InputHostMsg_HandleInputEvent_ACK(0, ack));
1109 EXPECT_EQ(0U, GetSentMessageCountAndResetSink()); 1124 EXPECT_EQ(0U, GetSentMessageCountAndResetSink());
1110 1125
1111 ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(20, 20), 0, 1126 ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(20, 20), 0,
1112 base::Time::NowFromSystemTime() - base::Time()); 1127 base::Time::NowFromSystemTime() - base::Time());
1113 view_->OnTouchEvent(&move2); 1128 view_->OnTouchEvent(&move2);
1114 EXPECT_TRUE(press.synchronous_handling_disabled()); 1129 EXPECT_TRUE(press.synchronous_handling_disabled());
1115 EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_->type); 1130 EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_->type);
1116 EXPECT_EQ(1U, view_->touch_event_->touchesLength); 1131 EXPECT_EQ(1U, view_->touch_event_->touchesLength);
1117 EXPECT_EQ(blink::WebTouchPoint::StateMoved, 1132 EXPECT_EQ(blink::WebTouchPoint::StateMoved,
(...skipping 1655 matching lines...) Expand 10 before | Expand all | Expand 10 after
2773 2788
2774 // Tests that when touch-events are dispatched to the renderer, the overscroll 2789 // Tests that when touch-events are dispatched to the renderer, the overscroll
2775 // gesture deals with them correctly. 2790 // gesture deals with them correctly.
2776 TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollWithTouchEvents) { 2791 TEST_F(RenderWidgetHostViewAuraOverscrollTest, OverscrollWithTouchEvents) {
2777 SetUpOverscrollEnvironmentWithDebounce(10); 2792 SetUpOverscrollEnvironmentWithDebounce(10);
2778 widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true)); 2793 widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
2779 sink_->ClearMessages(); 2794 sink_->ClearMessages();
2780 2795
2781 // The test sends an intermingled sequence of touch and gesture events. 2796 // The test sends an intermingled sequence of touch and gesture events.
2782 PressTouchPoint(0, 1); 2797 PressTouchPoint(0, 1);
2798 SetLastSentEventIDFromSentEvent();
2783 SendInputEventACK(WebInputEvent::TouchStart, 2799 SendInputEventACK(WebInputEvent::TouchStart,
2784 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2800 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2785 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 2801 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
2786 2802
2787 MoveTouchPoint(0, 20, 5); 2803 MoveTouchPoint(0, 20, 5);
2804 SetLastSentEventIDFromSentEvent();
2788 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 2805 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
2789 SendInputEventACK(WebInputEvent::TouchMove, 2806 SendInputEventACK(WebInputEvent::TouchMove,
2790 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 2807 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2791 2808
2792 EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); 2809 EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
2793 EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode()); 2810 EXPECT_EQ(OVERSCROLL_NONE, overscroll_delegate()->current_mode());
2794 2811
2795 SimulateGestureEvent(WebInputEvent::GestureScrollBegin, 2812 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
2796 blink::WebGestureDeviceTouchscreen); 2813 blink::WebGestureDeviceTouchscreen);
2797 EXPECT_EQ(1U, GetSentMessageCountAndResetSink()); 2814 EXPECT_EQ(1U, GetSentMessageCountAndResetSink());
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
3305 // lose track of the number of acks required. 3322 // lose track of the number of acks required.
3306 TEST_F(RenderWidgetHostViewAuraTest, CorrectNumberOfAcksAreDispatched) { 3323 TEST_F(RenderWidgetHostViewAuraTest, CorrectNumberOfAcksAreDispatched) {
3307 view_->InitAsFullscreen(parent_view_); 3324 view_->InitAsFullscreen(parent_view_);
3308 view_->Show(); 3325 view_->Show();
3309 view_->UseFakeDispatcher(); 3326 view_->UseFakeDispatcher();
3310 3327
3311 ui::TouchEvent press1( 3328 ui::TouchEvent press1(
3312 ui::ET_TOUCH_PRESSED, gfx::Point(30, 30), 0, ui::EventTimeForNow()); 3329 ui::ET_TOUCH_PRESSED, gfx::Point(30, 30), 0, ui::EventTimeForNow());
3313 3330
3314 view_->OnTouchEvent(&press1); 3331 view_->OnTouchEvent(&press1);
3332 SetLastSentEventID(press1.unique_event_id());
3315 SendInputEventACK(blink::WebInputEvent::TouchStart, 3333 SendInputEventACK(blink::WebInputEvent::TouchStart,
3316 INPUT_EVENT_ACK_STATE_CONSUMED); 3334 INPUT_EVENT_ACK_STATE_CONSUMED);
3317 3335
3318 ui::TouchEvent press2( 3336 ui::TouchEvent press2(
3319 ui::ET_TOUCH_PRESSED, gfx::Point(20, 20), 1, ui::EventTimeForNow()); 3337 ui::ET_TOUCH_PRESSED, gfx::Point(20, 20), 1, ui::EventTimeForNow());
3320 view_->OnTouchEvent(&press2); 3338 view_->OnTouchEvent(&press2);
3339 SetLastSentEventID(press2.unique_event_id());
3321 SendInputEventACK(blink::WebInputEvent::TouchStart, 3340 SendInputEventACK(blink::WebInputEvent::TouchStart,
3322 INPUT_EVENT_ACK_STATE_CONSUMED); 3341 INPUT_EVENT_ACK_STATE_CONSUMED);
3323 3342
3324 EXPECT_EQ(2U, view_->dispatcher_->processed_touch_event_count()); 3343 EXPECT_EQ(2U, view_->dispatcher_->processed_touch_event_count());
3325 } 3344 }
3326 3345
3327 // Tests that the scroll deltas stored within the overscroll controller get 3346 // Tests that the scroll deltas stored within the overscroll controller get
3328 // reset at the end of the overscroll gesture even if the overscroll threshold 3347 // reset at the end of the overscroll gesture even if the overscroll threshold
3329 // isn't surpassed and the overscroll mode stays OVERSCROLL_NONE. 3348 // isn't surpassed and the overscroll mode stays OVERSCROLL_NONE.
3330 TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) { 3349 TEST_F(RenderWidgetHostViewAuraOverscrollTest, ScrollDeltasResetOnEnd) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3363 INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 3382 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
3364 EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode()); 3383 EXPECT_EQ(OVERSCROLL_NONE, overscroll_mode());
3365 EXPECT_EQ(15.f, overscroll_delta_x()); 3384 EXPECT_EQ(15.f, overscroll_delta_x());
3366 EXPECT_EQ(-5.f, overscroll_delta_y()); 3385 EXPECT_EQ(-5.f, overscroll_delta_y());
3367 SimulateGestureFlingStartEvent(0.f, 0.1f, blink::WebGestureDeviceTouchpad); 3386 SimulateGestureFlingStartEvent(0.f, 0.1f, blink::WebGestureDeviceTouchpad);
3368 EXPECT_EQ(0.f, overscroll_delta_x()); 3387 EXPECT_EQ(0.f, overscroll_delta_x());
3369 EXPECT_EQ(0.f, overscroll_delta_y()); 3388 EXPECT_EQ(0.f, overscroll_delta_y());
3370 } 3389 }
3371 3390
3372 } // namespace content 3391 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698