| 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..f0d9f8ac60cdc77db54d54c5475f0739c8c64f91 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,37 @@
|
| #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
|
| +
|
| +using testing::_;
|
| +
|
| class InteractiveRenderWidget : public RenderWidget {
|
| public:
|
| explicit InteractiveRenderWidget(CompositorDependencies* compositor_deps)
|
| @@ -30,6 +56,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 +79,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 +120,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 +136,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 +154,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) {
|
| SyntheticWebTouchEvent touch;
|
| touch.PressPoint(10, 10);
|
|
|
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(_))
|
| + .WillRepeatedly(
|
| + ::testing::Return(blink::WebInputEventResult::NotHandled));
|
| +
|
| widget()->SendInputEvent(touch);
|
| ASSERT_EQ(1u, widget()->sink()->message_count());
|
|
|
| @@ -137,6 +176,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestSinglePoint) {
|
| rects.push_back(gfx::Rect(25, 0, 10, 10));
|
| widget()->SetTouchRegion(rects);
|
|
|
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(_))
|
| + .WillRepeatedly(
|
| + ::testing::Return(blink::WebInputEventResult::NotHandled));
|
| +
|
| widget()->SendInputEvent(touch);
|
| ASSERT_EQ(1u, widget()->sink()->message_count());
|
| message = widget()->sink()->GetMessageAt(0);
|
| @@ -156,6 +199,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) {
|
| SyntheticWebTouchEvent touch;
|
| touch.PressPoint(25, 25);
|
|
|
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(_))
|
| + .WillRepeatedly(
|
| + ::testing::Return(blink::WebInputEventResult::NotHandled));
|
| +
|
| widget()->SendInputEvent(touch);
|
| ASSERT_EQ(1u, widget()->sink()->message_count());
|
|
|
| @@ -184,6 +231,10 @@ TEST_F(RenderWidgetUnittest, TouchHitTestMultiplePoints) {
|
| TEST_F(RenderWidgetUnittest, EventOverscroll) {
|
| widget()->set_always_overscroll(true);
|
|
|
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(_))
|
| + .WillRepeatedly(
|
| + ::testing::Return(blink::WebInputEventResult::NotHandled));
|
| +
|
| blink::WebGestureEvent scroll;
|
| scroll.type = blink::WebInputEvent::GestureScrollUpdate;
|
| scroll.x = -10;
|
| @@ -226,4 +277,54 @@ TEST_F(RenderWidgetUnittest, FlingOverscroll) {
|
| widget()->sink()->ClearMessages();
|
| }
|
|
|
| +TEST_F(RenderWidgetUnittest, RenderWidgetInputEventUmaMetrics) {
|
| + SyntheticWebTouchEvent touch;
|
| + touch.PressPoint(10, 10);
|
| +
|
| + EXPECT_CALL(widget()->mock_webwidget(), handleInputEvent(_))
|
| + .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(_))
|
| + .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(_))
|
| + .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
|
|
|