Chromium Code Reviews| Index: content/renderer/render_widget_unittest.cc |
| diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc |
| index 1e587f4aabfa93ba5c02dd0ffc18e64f556703b0..2cc6575e68e7ad039e44379409b47f3f224dd36d 100644 |
| --- a/content/renderer/render_widget_unittest.cc |
| +++ b/content/renderer/render_widget_unittest.cc |
| @@ -7,6 +7,7 @@ |
| #include <vector> |
| #include "base/macros.h" |
| +#include "base/test/histogram_tester.h" |
| #include "content/common/input/synthetic_web_input_event_builders.h" |
| #include "content/common/input/web_input_event_traits.h" |
| #include "content/common/input_messages.h" |
| @@ -14,12 +15,35 @@ |
| #include "content/test/fake_compositor_dependencies.h" |
| #include "content/test/mock_render_process.h" |
| #include "ipc/ipc_test_sink.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/WebKit/public/web/WebInputEvent.h" |
| #include "ui/gfx/geometry/rect.h" |
| namespace content { |
| +namespace { |
| + |
| +const char* EVENT_LISTENER_RESULT_HISTOGRAM = "Event.PassiveListeners"; |
| + |
| +enum { |
| + PASSIVE_LISTENER_UMA_ENUM_PASSIVE, |
| + PASSIVE_LISTENER_UMA_ENUM_UNCANCELABLE, |
| + PASSIVE_LISTENER_UMA_ENUM_SUPPRESSED, |
| + PASSIVE_LISTENER_UMA_ENUM_CANCELABLE, |
| + PASSIVE_LISTENER_UMA_ENUM_CANCELABLE_AND_CANCELED, |
| + PASSIVE_LISTENER_UMA_ENUM_FORCED_NON_BLOCKING, |
| + PASSIVE_LISTENER_UMA_ENUM_COUNT |
| +}; |
| + |
| +class MockWebWidget : public blink::WebWidget { |
| + public: |
| + MOCK_METHOD1(handleInputEvent, |
| + blink::WebInputEventResult(const blink::WebInputEvent&)); |
| +}; |
| + |
| +} // namespace |
| + |
| class InteractiveRenderWidget : public RenderWidget { |
| public: |
| explicit InteractiveRenderWidget(CompositorDependencies* compositor_deps) |
| @@ -30,6 +54,7 @@ class InteractiveRenderWidget : public RenderWidget { |
| false, |
| false), |
| always_overscroll_(false) { |
| + webwidget_ = &mock_webwidget_; |
| // A RenderWidget is not fully initialized until it has a routing ID. |
| SetRoutingID(++next_routing_id_); |
| } |
| @@ -52,8 +77,10 @@ class InteractiveRenderWidget : public RenderWidget { |
| IPC::TestSink* sink() { return &sink_; } |
| + MockWebWidget& mock_webwidget() { return mock_webwidget_; } |
| + |
| protected: |
| - ~InteractiveRenderWidget() override {} |
| + ~InteractiveRenderWidget() override { webwidget_ = NULL; } |
| // Overridden from RenderWidget: |
| bool HasTouchEventHandlersAt(const gfx::Point& point) const override { |
| @@ -91,6 +118,7 @@ class InteractiveRenderWidget : public RenderWidget { |
| std::vector<gfx::Rect> rects_; |
| IPC::TestSink sink_; |
| bool always_overscroll_; |
| + MockWebWidget mock_webwidget_; |
| static int next_routing_id_; |
| DISALLOW_COPY_AND_ASSIGN(InteractiveRenderWidget); |
| @@ -106,11 +134,16 @@ class RenderWidgetUnittest : public testing::Test { |
| InteractiveRenderWidget* widget() const { return widget_.get(); } |
| + const base::HistogramTester& histogram_tester() const { |
| + return histogram_tester_; |
| + } |
| + |
| private: |
| MockRenderProcess render_process_; |
| MockRenderThread render_thread_; |
| FakeCompositorDependencies compositor_deps_; |
| scoped_refptr<InteractiveRenderWidget> widget_; |
| + base::HistogramTester histogram_tester_; |
| DISALLOW_COPY_AND_ASSIGN(RenderWidgetUnittest); |
| }; |
| @@ -119,6 +152,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) { |
| SyntheticWebTouchEvent touch; |
| touch.PressPoint(10, 10); |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
|
tdresser
2016/04/18 19:40:45
Feel free to "using testing::_".
dtapuska
2016/04/18 20:09:09
Done.
|
| + .WillRepeatedly( |
| + ::testing::Return(blink::WebInputEventResult::NotHandled)); |
| + |
| widget()->SendInputEvent(touch); |
| ASSERT_EQ(1u, widget()->sink()->message_count()); |
| @@ -137,6 +174,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) { |
| rects.push_back(gfx::Rect(25, 0, 10, 10)); |
| widget()->SetTouchRegion(rects); |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
| + .WillRepeatedly( |
| + ::testing::Return(blink::WebInputEventResult::NotHandled)); |
| + |
| widget()->SendInputEvent(touch); |
| ASSERT_EQ(1u, widget()->sink()->message_count()); |
| message = widget()->sink()->GetMessageAt(0); |
| @@ -156,6 +197,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { |
| SyntheticWebTouchEvent touch; |
| touch.PressPoint(25, 25); |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
| + .WillRepeatedly( |
| + ::testing::Return(blink::WebInputEventResult::NotHandled)); |
| + |
| widget()->SendInputEvent(touch); |
| ASSERT_EQ(1u, widget()->sink()->message_count()); |
| @@ -184,6 +229,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) { |
| TEST_F(RenderWidgetUnittest, EventOverscroll) { |
| widget()->set_always_overscroll(true); |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
| + .WillRepeatedly( |
| + ::testing::Return(blink::WebInputEventResult::NotHandled)); |
| + |
| blink::WebGestureEvent scroll; |
| scroll.type = blink::WebInputEvent::GestureScrollUpdate; |
| scroll.x = -10; |
| @@ -226,4 +275,54 @@ TEST_F(RenderWidgetUnittest, FlingOverscroll) { |
| widget()->sink()->ClearMessages(); |
| } |
| +TEST_F(RenderWidgetUnittest, RenderWidgetInputEventUmaMetrics) { |
|
tdresser
2016/04/18 19:40:45
Thanks for the test - this is great.
dtapuska
2016/04/18 20:09:09
Acknowledged.
|
| + SyntheticWebTouchEvent touch; |
| + touch.PressPoint(10, 10); |
| + |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
| + .Times(4) |
| + .WillRepeatedly( |
| + ::testing::Return(blink::WebInputEventResult::NotHandled)); |
| + |
| + widget()->SendInputEvent(touch); |
| + histogram_tester().ExpectBucketCount(EVENT_LISTENER_RESULT_HISTOGRAM, |
| + PASSIVE_LISTENER_UMA_ENUM_CANCELABLE, 1); |
| + |
| + touch.dispatchType = blink::WebInputEvent::DispatchType::EventNonBlocking; |
| + widget()->SendInputEvent(touch); |
| + histogram_tester().ExpectBucketCount(EVENT_LISTENER_RESULT_HISTOGRAM, |
| + PASSIVE_LISTENER_UMA_ENUM_UNCANCELABLE, |
| + 1); |
| + |
| + touch.dispatchType = |
| + blink::WebInputEvent::DispatchType::ListenersNonBlockingPassive; |
| + widget()->SendInputEvent(touch); |
| + histogram_tester().ExpectBucketCount(EVENT_LISTENER_RESULT_HISTOGRAM, |
| + PASSIVE_LISTENER_UMA_ENUM_PASSIVE, 1); |
| + |
| + touch.dispatchType = |
| + blink::WebInputEvent::DispatchType::ListenersForcedNonBlockingPassive; |
| + widget()->SendInputEvent(touch); |
| + histogram_tester().ExpectBucketCount( |
| + EVENT_LISTENER_RESULT_HISTOGRAM, |
| + PASSIVE_LISTENER_UMA_ENUM_FORCED_NON_BLOCKING, 1); |
| + |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
| + .WillOnce( |
| + ::testing::Return(blink::WebInputEventResult::HandledSuppressed)); |
| + touch.dispatchType = blink::WebInputEvent::DispatchType::Blocking; |
| + widget()->SendInputEvent(touch); |
| + histogram_tester().ExpectBucketCount(EVENT_LISTENER_RESULT_HISTOGRAM, |
| + PASSIVE_LISTENER_UMA_ENUM_SUPPRESSED, 1); |
| + |
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(::testing::_)) |
| + .WillOnce( |
| + ::testing::Return(blink::WebInputEventResult::HandledApplication)); |
| + touch.dispatchType = blink::WebInputEvent::DispatchType::Blocking; |
| + widget()->SendInputEvent(touch); |
| + histogram_tester().ExpectBucketCount( |
| + EVENT_LISTENER_RESULT_HISTOGRAM, |
| + PASSIVE_LISTENER_UMA_ENUM_CANCELABLE_AND_CANCELED, 1); |
| +} |
| + |
| } // namespace content |