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..05ebc45a747109cd147ee60dc4e734f5880c884c 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" |
+using testing::_; |
+ |
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 +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_ = nullptr; } |
// 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 |