summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/renderer_host/input/touch_emulator_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/renderer_host/input/touch_emulator_unittest.cc')
-rw-r--r--chromium/content/browser/renderer_host/input/touch_emulator_unittest.cc349
1 files changed, 349 insertions, 0 deletions
diff --git a/chromium/content/browser/renderer_host/input/touch_emulator_unittest.cc b/chromium/content/browser/renderer_host/input/touch_emulator_unittest.cc
new file mode 100644
index 00000000000..8fdfd54cce2
--- /dev/null
+++ b/chromium/content/browser/renderer_host/input/touch_emulator_unittest.cc
@@ -0,0 +1,349 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/time/time.h"
+#include "content/browser/renderer_host/input/touch_emulator.h"
+#include "content/browser/renderer_host/input/touch_emulator_client.h"
+#include "content/common/input/web_input_event_traits.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/gesture_detection/gesture_config_helper.h"
+
+#if defined(USE_AURA)
+#include "ui/aura/env.h"
+#include "ui/aura/test/test_screen.h"
+#endif
+
+using blink::WebGestureEvent;
+using blink::WebInputEvent;
+using blink::WebKeyboardEvent;
+using blink::WebMouseEvent;
+using blink::WebMouseWheelEvent;
+using blink::WebTouchEvent;
+using blink::WebTouchPoint;
+
+namespace content {
+
+class TouchEmulatorTest : public testing::Test,
+ public TouchEmulatorClient {
+ public:
+ TouchEmulatorTest()
+ : shift_pressed_(false),
+ mouse_pressed_(false),
+ last_mouse_x_(-1),
+ last_mouse_y_(-1) {
+ last_event_time_seconds_ =
+ (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
+ event_time_delta_seconds_ = 0.1;
+ }
+
+ virtual ~TouchEmulatorTest() {}
+
+ // testing::Test
+ virtual void SetUp() OVERRIDE {
+#if defined(USE_AURA)
+ aura::Env::CreateInstance(true);
+ screen_.reset(aura::TestScreen::Create(gfx::Size()));
+ gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_.get());
+#endif
+
+ emulator_.reset(new TouchEmulator(this));
+ emulator_->Enable(true /* allow_pinch */);
+ }
+
+ virtual void TearDown() OVERRIDE {
+ emulator_->Disable();
+ EXPECT_EQ("", ExpectedEvents());
+
+#if defined(USE_AURA)
+ aura::Env::DeleteInstance();
+ screen_.reset();
+#endif
+ }
+
+ virtual void ForwardGestureEvent(
+ const blink::WebGestureEvent& event) OVERRIDE {
+ forwarded_events_.push_back(event.type);
+ }
+
+ virtual void ForwardTouchEvent(
+ const blink::WebTouchEvent& event) OVERRIDE {
+ forwarded_events_.push_back(event.type);
+ EXPECT_EQ(1U, event.touchesLength);
+ EXPECT_EQ(last_mouse_x_, event.touches[0].position.x);
+ EXPECT_EQ(last_mouse_y_, event.touches[0].position.y);
+ int expectedCancelable = event.type != WebInputEvent::TouchCancel;
+ EXPECT_EQ(expectedCancelable, event.cancelable);
+ emulator()->HandleTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
+ }
+
+ virtual void SetCursor(const WebCursor& cursor) OVERRIDE {}
+
+ protected:
+ TouchEmulator* emulator() const {
+ return emulator_.get();
+ }
+
+ int modifiers() const {
+ return shift_pressed_ ? WebInputEvent::ShiftKey : 0;
+ }
+
+ std::string ExpectedEvents() {
+ std::string result;
+ for (size_t i = 0; i < forwarded_events_.size(); ++i) {
+ if (i != 0)
+ result += " ";
+ result += WebInputEventTraits::GetName(forwarded_events_[i]);
+ }
+ forwarded_events_.clear();
+ return result;
+ }
+
+ double GetNextEventTimeSeconds() {
+ last_event_time_seconds_ += event_time_delta_seconds_;
+ return last_event_time_seconds_;
+ }
+
+ void set_event_time_delta_seconds_(double delta) {
+ event_time_delta_seconds_ = delta;
+ }
+
+ void SendKeyboardEvent(WebInputEvent::Type type) {
+ WebKeyboardEvent event;
+ event.timeStampSeconds = GetNextEventTimeSeconds();
+ event.type = type;
+ event.modifiers = modifiers();
+ emulator()->HandleKeyboardEvent(event);
+ }
+
+ void PressShift() {
+ DCHECK(!shift_pressed_);
+ shift_pressed_ = true;
+ SendKeyboardEvent(WebInputEvent::KeyDown);
+ }
+
+ void ReleaseShift() {
+ DCHECK(shift_pressed_);
+ shift_pressed_ = false;
+ SendKeyboardEvent(WebInputEvent::KeyUp);
+ }
+
+ void SendMouseEvent(WebInputEvent::Type type, int x, int y) {
+ WebMouseEvent event;
+ event.timeStampSeconds = GetNextEventTimeSeconds();
+ event.type = type;
+ event.button = mouse_pressed_ ? WebMouseEvent::ButtonLeft :
+ WebMouseEvent::ButtonNone;
+ event.modifiers = modifiers();
+ last_mouse_x_ = x;
+ last_mouse_y_ = y;
+ event.x = event.windowX = event.globalX = x;
+ event.y = event.windowY = event.globalY = y;
+ emulator()->HandleMouseEvent(event);
+ }
+
+ bool SendMouseWheelEvent() {
+ WebMouseWheelEvent event;
+ event.type = WebInputEvent::MouseWheel;
+ event.timeStampSeconds = GetNextEventTimeSeconds();
+ // Return whether mouse wheel is forwarded.
+ return !emulator()->HandleMouseWheelEvent(event);
+ }
+
+ void MouseDown(int x, int y) {
+ DCHECK(!mouse_pressed_);
+ if (x != last_mouse_x_ || y != last_mouse_y_)
+ SendMouseEvent(WebInputEvent::MouseMove, x, y);
+ mouse_pressed_ = true;
+ SendMouseEvent(WebInputEvent::MouseDown, x, y);
+ }
+
+ void MouseDrag(int x, int y) {
+ DCHECK(mouse_pressed_);
+ SendMouseEvent(WebInputEvent::MouseMove, x, y);
+ }
+
+ void MouseMove(int x, int y) {
+ DCHECK(!mouse_pressed_);
+ SendMouseEvent(WebInputEvent::MouseMove, x, y);
+ }
+
+ void MouseUp(int x, int y) {
+ DCHECK(mouse_pressed_);
+ if (x != last_mouse_x_ || y != last_mouse_y_)
+ SendMouseEvent(WebInputEvent::MouseMove, x, y);
+ SendMouseEvent(WebInputEvent::MouseUp, x, y);
+ mouse_pressed_ = false;
+ }
+
+ private:
+ scoped_ptr<TouchEmulator> emulator_;
+ std::vector<WebInputEvent::Type> forwarded_events_;
+#if defined(USE_AURA)
+ scoped_ptr<gfx::Screen> screen_;
+#endif
+ double last_event_time_seconds_;
+ double event_time_delta_seconds_;
+ bool shift_pressed_;
+ bool mouse_pressed_;
+ int last_mouse_x_;
+ int last_mouse_y_;
+ base::MessageLoopForUI message_loop_;
+};
+
+
+TEST_F(TouchEmulatorTest, NoTouches) {
+ MouseMove(100, 200);
+ MouseMove(300, 300);
+ EXPECT_EQ("", ExpectedEvents());
+}
+
+TEST_F(TouchEmulatorTest, Touch) {
+ MouseMove(100, 200);
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDown(100, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ MouseUp(200, 200);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
+ " TouchEnd GestureScrollEnd",
+ ExpectedEvents());
+}
+
+TEST_F(TouchEmulatorTest, MultipleTouches) {
+ MouseMove(100, 200);
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDown(100, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ MouseUp(200, 200);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate"
+ " TouchEnd GestureScrollEnd",
+ ExpectedEvents());
+ MouseMove(300, 200);
+ MouseMove(200, 200);
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDown(300, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ MouseDrag(300, 300);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
+ ExpectedEvents());
+ MouseDrag(300, 400);
+ EXPECT_EQ("TouchMove GestureScrollUpdate", ExpectedEvents());
+ MouseUp(300, 500);
+ EXPECT_EQ(
+ "TouchMove GestureScrollUpdate TouchEnd GestureScrollEnd",
+ ExpectedEvents());
+}
+
+TEST_F(TouchEmulatorTest, Pinch) {
+ MouseDown(100, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ MouseDrag(200, 200);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
+ ExpectedEvents());
+ PressShift();
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDrag(300, 200);
+ EXPECT_EQ("TouchMove GesturePinchBegin", ExpectedEvents());
+ ReleaseShift();
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDrag(400, 200);
+ EXPECT_EQ(
+ "TouchMove GesturePinchEnd GestureScrollUpdate",
+ ExpectedEvents());
+ MouseUp(400, 200);
+ EXPECT_EQ("TouchEnd GestureScrollEnd", ExpectedEvents());
+}
+
+TEST_F(TouchEmulatorTest, DisableAndReenable) {
+ MouseDown(100, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ MouseDrag(200, 200);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
+ ExpectedEvents());
+ PressShift();
+ MouseDrag(300, 200);
+ EXPECT_EQ("TouchMove GesturePinchBegin", ExpectedEvents());
+
+ // Disable while pinch is in progress.
+ emulator()->Disable();
+ EXPECT_EQ("TouchCancel GesturePinchEnd GestureScrollEnd", ExpectedEvents());
+ MouseUp(300, 200);
+ ReleaseShift();
+ MouseMove(300, 300);
+ EXPECT_EQ("", ExpectedEvents());
+
+ emulator()->Enable(true /* allow_pinch */);
+ MouseDown(300, 300);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ MouseDrag(300, 400);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
+ ExpectedEvents());
+
+ // Disable while scroll is in progress.
+ emulator()->Disable();
+ EXPECT_EQ("TouchCancel GestureScrollEnd", ExpectedEvents());
+}
+
+TEST_F(TouchEmulatorTest, MouseMovesDropped) {
+ MouseMove(100, 200);
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDown(100, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+
+ // Mouse move after mouse down is never dropped.
+ set_event_time_delta_seconds_(0.001);
+ MouseDrag(200, 200);
+ EXPECT_EQ(
+ "TouchMove GestureTapCancel GestureScrollBegin GestureScrollUpdate",
+ ExpectedEvents());
+
+ // The following mouse moves are dropped.
+ MouseDrag(300, 200);
+ EXPECT_EQ("", ExpectedEvents());
+ MouseDrag(350, 200);
+ EXPECT_EQ("", ExpectedEvents());
+
+ // Dispatching again.
+ set_event_time_delta_seconds_(0.1);
+ MouseDrag(400, 200);
+ EXPECT_EQ(
+ "TouchMove GestureScrollUpdate",
+ ExpectedEvents());
+ MouseUp(400, 200);
+ EXPECT_EQ(
+ "TouchEnd GestureScrollEnd",
+ ExpectedEvents());
+}
+
+TEST_F(TouchEmulatorTest, MouseWheel) {
+ MouseMove(100, 200);
+ EXPECT_EQ("", ExpectedEvents());
+ EXPECT_TRUE(SendMouseWheelEvent());
+ MouseDown(100, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ EXPECT_FALSE(SendMouseWheelEvent());
+ MouseUp(100, 200);
+ EXPECT_EQ("TouchEnd GestureShowPress GestureTap", ExpectedEvents());
+ EXPECT_TRUE(SendMouseWheelEvent());
+ MouseDown(300, 200);
+ EXPECT_EQ("TouchStart GestureTapDown", ExpectedEvents());
+ EXPECT_FALSE(SendMouseWheelEvent());
+ emulator()->Disable();
+ EXPECT_EQ("TouchCancel GestureTapCancel", ExpectedEvents());
+ EXPECT_TRUE(SendMouseWheelEvent());
+ emulator()->Enable(true /* allow_pinch */);
+ EXPECT_TRUE(SendMouseWheelEvent());
+}
+
+} // namespace content