OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "content/browser/renderer_host/input/gesture_event_filter.h" | 12 #include "content/browser/renderer_host/input/base_gesture_event_filter.h" |
13 #include "content/browser/renderer_host/input/mock_web_input_event_builders.h" | 13 #include "content/browser/renderer_host/input/mock_web_input_event_builders.h" |
14 #include "content/browser/renderer_host/input/touchpad_tap_suppression_controlle
r.h" | |
15 #include "content/port/common/input_event_ack_state.h" | 14 #include "content/port/common/input_event_ack_state.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "third_party/WebKit/public/web/WebInputEvent.h" | 16 #include "third_party/WebKit/public/web/WebInputEvent.h" |
18 | 17 |
19 using base::TimeDelta; | 18 using base::TimeDelta; |
20 using WebKit::WebGestureEvent; | 19 using WebKit::WebGestureEvent; |
21 using WebKit::WebInputEvent; | 20 using WebKit::WebInputEvent; |
22 | 21 |
23 namespace content { | 22 namespace content { |
24 | 23 |
25 class GestureEventFilterTest : public testing::Test, | 24 class GestureEventFilterTest : public testing::Test, |
26 public GestureEventFilterClient, | 25 public GestureEventFilterClient { |
27 public TouchpadTapSuppressionControllerClient { | |
28 public: | 26 public: |
29 GestureEventFilterTest() | 27 GestureEventFilterTest() |
30 : acked_gesture_event_count_(0), | 28 : acked_gesture_event_count_(0), |
31 sent_gesture_event_count_(0) {} | 29 sent_gesture_event_count_(0) {} |
32 | 30 |
33 virtual ~GestureEventFilterTest() {} | 31 virtual ~GestureEventFilterTest() {} |
34 | 32 |
35 // testing::Test | 33 // testing::Test |
36 virtual void SetUp() OVERRIDE { | 34 virtual void SetUp() OVERRIDE { |
37 filter_.reset(new GestureEventFilter(this, this)); | 35 filter_.reset(new BaseGestureEventFilter(this)); |
38 } | 36 } |
39 | 37 |
40 virtual void TearDown() OVERRIDE { | 38 virtual void TearDown() OVERRIDE { |
41 // Process all pending tasks to avoid leaks. | 39 // Process all pending tasks to avoid leaks. |
42 RunUntilIdle(); | 40 RunUntilIdle(); |
43 filter_.reset(); | 41 filter_.reset(); |
44 } | 42 } |
45 | 43 |
46 // GestureEventFilterClient | 44 // GestureEventFilterClient |
47 virtual void SendGestureEventImmediately( | 45 virtual void SendGestureEventImmediately( |
48 const GestureEventWithLatencyInfo& event) OVERRIDE { | 46 const GestureEventWithLatencyInfo& event) OVERRIDE { |
49 ++sent_gesture_event_count_; | 47 ++sent_gesture_event_count_; |
50 last_immediately_sent_gesture_event_ = event.event; | 48 last_immediately_sent_gesture_event_ = event.event; |
51 } | 49 } |
52 | 50 |
53 virtual void OnGestureEventAck( | 51 virtual void OnGestureEventAck( |
54 const GestureEventWithLatencyInfo& event, | 52 const GestureEventWithLatencyInfo& event, |
55 InputEventAckState ack_result) OVERRIDE { | 53 InputEventAckState ack_result) OVERRIDE { |
56 ++acked_gesture_event_count_; | 54 ++acked_gesture_event_count_; |
57 } | 55 } |
58 | 56 |
59 // TouchpadTapSuppressionControllerClient | |
60 virtual void SendMouseEventImmediately( | |
61 const MouseEventWithLatencyInfo& event) OVERRIDE { | |
62 } | |
63 | |
64 protected: | 57 protected: |
65 | 58 |
66 // Returns the result of |GestureEventFilter::ShouldForward()|. | 59 // Returns the result of |GestureEventFilter::ShouldForward()|. |
67 bool SimulateGestureEvent(const WebGestureEvent& gesture) { | 60 bool SimulateGestureEvent(const WebGestureEvent& gesture) { |
68 GestureEventWithLatencyInfo gesture_with_latency(gesture, | 61 GestureEventWithLatencyInfo gesture_with_latency(gesture, |
69 ui::LatencyInfo()); | 62 ui::LatencyInfo()); |
70 if (filter()->ShouldForward(gesture_with_latency)) { | 63 if (filter()->ShouldForward(gesture_with_latency)) { |
71 ++sent_gesture_event_count_; | 64 ++sent_gesture_event_count_; |
72 return true; | 65 return true; |
73 } | 66 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 } | 145 } |
153 | 146 |
154 WebGestureEvent GestureEventQueueEventAt(int i) { | 147 WebGestureEvent GestureEventQueueEventAt(int i) { |
155 return filter()->coalesced_gesture_events_.at(i).event; | 148 return filter()->coalesced_gesture_events_.at(i).event; |
156 } | 149 } |
157 | 150 |
158 bool ScrollingInProgress() { | 151 bool ScrollingInProgress() { |
159 return filter()->scrolling_in_progress_; | 152 return filter()->scrolling_in_progress_; |
160 } | 153 } |
161 | 154 |
162 bool FlingInProgress() { | |
163 return filter()->fling_in_progress_; | |
164 } | |
165 | |
166 bool WillIgnoreNextACK() { | 155 bool WillIgnoreNextACK() { |
167 return filter()->ignore_next_ack_; | 156 return filter()->ignore_next_ack_; |
168 } | 157 } |
169 | 158 |
170 GestureEventFilter* filter() const { | 159 BaseGestureEventFilter* filter() const { |
171 return filter_.get(); | 160 return filter_.get(); |
172 } | 161 } |
173 | 162 |
174 private: | 163 private: |
175 scoped_ptr<GestureEventFilter> filter_; | 164 scoped_ptr<BaseGestureEventFilter> filter_; |
176 size_t acked_gesture_event_count_; | 165 size_t acked_gesture_event_count_; |
177 size_t sent_gesture_event_count_; | 166 size_t sent_gesture_event_count_; |
178 WebGestureEvent last_immediately_sent_gesture_event_; | 167 WebGestureEvent last_immediately_sent_gesture_event_; |
179 base::MessageLoopForUI message_loop_; | 168 base::MessageLoopForUI message_loop_; |
180 }; | 169 }; |
181 | 170 |
182 #if GTEST_HAS_PARAM_TEST | 171 #if GTEST_HAS_PARAM_TEST |
183 // This is for tests that are to be run for all source devices. | 172 // This is for tests that are to be run for all source devices. |
184 class GestureEventFilterWithSourceTest | 173 class GestureEventFilterWithSourceTest |
185 : public GestureEventFilterTest, | 174 : public GestureEventFilterTest, |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 | 456 |
468 // Check that the queue is empty after ACK and no events get sent. | 457 // Check that the queue is empty after ACK and no events get sent. |
469 SendInputEventACK(WebInputEvent::GestureScrollUpdate, | 458 SendInputEventACK(WebInputEvent::GestureScrollUpdate, |
470 INPUT_EVENT_ACK_STATE_CONSUMED); | 459 INPUT_EVENT_ACK_STATE_CONSUMED); |
471 RunUntilIdle(); | 460 RunUntilIdle(); |
472 EXPECT_EQ(0U, GetAndResetSentGestureEventCount()); | 461 EXPECT_EQ(0U, GetAndResetSentGestureEventCount()); |
473 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | 462 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); |
474 } | 463 } |
475 | 464 |
476 #if GTEST_HAS_PARAM_TEST | 465 #if GTEST_HAS_PARAM_TEST |
477 TEST_P(GestureEventFilterWithSourceTest, GestureFlingCancelsFiltered) { | |
478 WebGestureEvent::SourceDevice source_device = GetParam(); | |
479 | |
480 // Turn off debounce handling for test isolation. | |
481 set_debounce_interval_time_ms(0); | |
482 // GFC without previous GFS is dropped. | |
483 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
484 EXPECT_EQ(0U, GetAndResetSentGestureEventCount()); | |
485 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | |
486 | |
487 // GFC after previous GFS is dispatched and acked. | |
488 SimulateGestureFlingStartEvent(0, -10, source_device); | |
489 EXPECT_TRUE(FlingInProgress()); | |
490 SendInputEventACK(WebInputEvent::GestureFlingStart, | |
491 INPUT_EVENT_ACK_STATE_CONSUMED); | |
492 RunUntilIdle(); | |
493 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount()); | |
494 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
495 EXPECT_FALSE(FlingInProgress()); | |
496 EXPECT_EQ(2U, GetAndResetSentGestureEventCount()); | |
497 SendInputEventACK(WebInputEvent::GestureFlingCancel, | |
498 INPUT_EVENT_ACK_STATE_CONSUMED); | |
499 RunUntilIdle(); | |
500 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount()); | |
501 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | |
502 | |
503 // GFC before previous GFS is acked. | |
504 SimulateGestureFlingStartEvent(0, -10, source_device); | |
505 EXPECT_TRUE(FlingInProgress()); | |
506 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
507 EXPECT_FALSE(FlingInProgress()); | |
508 EXPECT_EQ(1U, GetAndResetSentGestureEventCount()); | |
509 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | |
510 | |
511 // Advance state realistically. | |
512 SendInputEventACK(WebInputEvent::GestureFlingStart, | |
513 INPUT_EVENT_ACK_STATE_CONSUMED); | |
514 RunUntilIdle(); | |
515 EXPECT_EQ(1U, GetAndResetSentGestureEventCount()); | |
516 SendInputEventACK(WebInputEvent::GestureFlingCancel, | |
517 INPUT_EVENT_ACK_STATE_CONSUMED); | |
518 RunUntilIdle(); | |
519 EXPECT_EQ(2U, GetAndResetAckedGestureEventCount()); | |
520 EXPECT_EQ(0U, GetAndResetSentGestureEventCount()); | |
521 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | |
522 | |
523 // GFS is added to the queue if another event is pending | |
524 SimulateGestureScrollUpdateEvent(8, -7, 0); | |
525 SimulateGestureFlingStartEvent(0, -10, source_device); | |
526 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | |
527 EXPECT_EQ(1U, GetAndResetSentGestureEventCount()); | |
528 WebGestureEvent merged_event = GestureEventLastQueueEvent(); | |
529 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type); | |
530 EXPECT_TRUE(FlingInProgress()); | |
531 EXPECT_EQ(2U, GestureEventLastQueueEventSize()); | |
532 | |
533 // GFS in queue means that a GFC is added to the queue | |
534 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
535 merged_event =GestureEventLastQueueEvent(); | |
536 EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type); | |
537 EXPECT_FALSE(FlingInProgress()); | |
538 EXPECT_EQ(3U, GestureEventLastQueueEventSize()); | |
539 | |
540 // Adding a second GFC is dropped. | |
541 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
542 EXPECT_FALSE(FlingInProgress()); | |
543 EXPECT_EQ(3U, GestureEventLastQueueEventSize()); | |
544 | |
545 // Adding another GFS will add it to the queue. | |
546 SimulateGestureFlingStartEvent(0, -10, source_device); | |
547 merged_event = GestureEventLastQueueEvent(); | |
548 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type); | |
549 EXPECT_TRUE(FlingInProgress()); | |
550 EXPECT_EQ(4U, GestureEventLastQueueEventSize()); | |
551 | |
552 // GFS in queue means that a GFC is added to the queue | |
553 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
554 merged_event = GestureEventLastQueueEvent(); | |
555 EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type); | |
556 EXPECT_FALSE(FlingInProgress()); | |
557 EXPECT_EQ(5U, GestureEventLastQueueEventSize()); | |
558 | |
559 // Adding another GFC with a GFC already there is dropped. | |
560 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device); | |
561 merged_event = GestureEventLastQueueEvent(); | |
562 EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type); | |
563 EXPECT_FALSE(FlingInProgress()); | |
564 EXPECT_EQ(5U, GestureEventLastQueueEventSize()); | |
565 } | |
566 | |
567 INSTANTIATE_TEST_CASE_P(AllSources, | 466 INSTANTIATE_TEST_CASE_P(AllSources, |
568 GestureEventFilterWithSourceTest, | 467 GestureEventFilterWithSourceTest, |
569 testing::Values(WebGestureEvent::Touchscreen, | 468 testing::Values(WebGestureEvent::Touchscreen, |
570 WebGestureEvent::Touchpad)); | 469 WebGestureEvent::Touchpad)); |
571 #endif // GTEST_HAS_PARAM_TEST | 470 #endif // GTEST_HAS_PARAM_TEST |
572 | 471 |
573 // Test that GestureShowPress events don't wait for ACKs. | 472 // Test that GestureShowPress events don't wait for ACKs. |
574 TEST_F(GestureEventFilterTest, GestureShowPressIsAsync) { | 473 TEST_F(GestureEventFilterTest, GestureShowPressIsAsync) { |
575 SimulateGestureEvent(WebInputEvent::GestureShowPress, | 474 SimulateGestureEvent(WebInputEvent::GestureShowPress, |
576 WebGestureEvent::Touchscreen); | 475 WebGestureEvent::Touchscreen); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 WebInputEvent::GestureScrollUpdate, | 620 WebInputEvent::GestureScrollUpdate, |
722 WebInputEvent::GestureScrollUpdate}; | 621 WebInputEvent::GestureScrollUpdate}; |
723 | 622 |
724 for (unsigned i = 0; i < sizeof(expected) / sizeof(WebInputEvent::Type); | 623 for (unsigned i = 0; i < sizeof(expected) / sizeof(WebInputEvent::Type); |
725 i++) { | 624 i++) { |
726 WebGestureEvent merged_event = GestureEventQueueEventAt(i); | 625 WebGestureEvent merged_event = GestureEventQueueEventAt(i); |
727 EXPECT_EQ(expected[i], merged_event.type); | 626 EXPECT_EQ(expected[i], merged_event.type); |
728 } | 627 } |
729 } | 628 } |
730 | 629 |
731 TEST_F(GestureEventFilterTest, DropZeroVelocityFlings) { | |
732 WebGestureEvent gesture_event; | |
733 gesture_event.type = WebInputEvent::GestureFlingStart; | |
734 gesture_event.sourceDevice = WebGestureEvent::Touchpad; | |
735 gesture_event.data.flingStart.velocityX = 0.f; | |
736 gesture_event.data.flingStart.velocityY = 0.f; | |
737 ASSERT_EQ(0U, GetAndResetSentGestureEventCount()); | |
738 ASSERT_EQ(0U, GestureEventLastQueueEventSize()); | |
739 EXPECT_FALSE(SimulateGestureEvent(gesture_event)); | |
740 EXPECT_EQ(0U, GetAndResetSentGestureEventCount()); | |
741 EXPECT_EQ(0U, GestureEventLastQueueEventSize()); | |
742 } | |
743 | |
744 } // namespace content | 630 } // namespace content |
OLD | NEW |