From 3ad5e0f15b3bc40b2f45aa10dfce1cb7402ef9a5 Mon Sep 17 00:00:00 2001 From: mfomitchev Date: Mon, 24 Nov 2014 13:50:06 -0800 Subject: Fixing drag-and-drop for the case when the scroll ends with a fling. BUG=414382 Review URL: https://codereview.chromium.org/750703002 Cr-Commit-Position: refs/heads/master@{#305500} --- ash/drag_drop/drag_drop_controller.cc | 2 +- ash/drag_drop/drag_drop_controller_unittest.cc | 48 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) (limited to 'ash/drag_drop') diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index 5ce5cd5..1c7b819 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc @@ -432,9 +432,9 @@ void DragDropController::OnGestureEvent(ui::GestureEvent* event) { DragUpdate(translated_target, *translated_event.get()); break; case ui::ET_GESTURE_SCROLL_END: + case ui::ET_SCROLL_FLING_START: Drop(translated_target, *translated_event.get()); break; - case ui::ET_SCROLL_FLING_START: case ui::ET_GESTURE_LONG_TAP: // Ideally we would want to just forward this long tap event to the // |drag_source_window_|. However, webkit does not accept events while a diff --git a/ash/drag_drop/drag_drop_controller_unittest.cc b/ash/drag_drop/drag_drop_controller_unittest.cc index 2fa520c..537b452 100644 --- a/ash/drag_drop/drag_drop_controller_unittest.cc +++ b/ash/drag_drop/drag_drop_controller_unittest.cc @@ -22,6 +22,7 @@ #include "ui/base/ui_base_switches.h" #include "ui/events/event.h" #include "ui/events/event_utils.h" +#include "ui/events/gesture_detection/gesture_configuration.h" #include "ui/events/gestures/gesture_types.h" #include "ui/events/test/event_generator.h" #include "ui/events/test/events_test_utils.h" @@ -1069,5 +1070,52 @@ TEST_F(DragDropControllerTest, DragCancelAcrossDisplays) { } } +TEST_F(DragDropControllerTest, TouchDragDropCompletesOnFling) { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableTouchDragDrop); + ui::GestureConfiguration::GetInstance() + ->set_max_touch_move_in_pixels_for_click(1); + scoped_ptr widget(CreateNewWidget()); + DragTestView* drag_view = new DragTestView; + AddViewToWidgetAndResize(widget.get(), drag_view); + ui::OSExchangeData data; + data.SetString(base::UTF8ToUTF16("I am being dragged")); + ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), + widget->GetNativeView()); + + gfx::Point start = gfx::Rect(drag_view->bounds()).CenterPoint(); + gfx::Point mid = start + gfx::Vector2d(drag_view->bounds().width() / 6, 0); + gfx::Point end = start + gfx::Vector2d(drag_view->bounds().width() / 3, 0); + + base::TimeDelta timestamp = ui::EventTimeForNow(); + ui::TouchEvent press(ui::ET_TOUCH_PRESSED, start, 0, timestamp); + generator.Dispatch(&press); + + DispatchGesture(ui::ET_GESTURE_LONG_PRESS, start); + UpdateDragData(&data); + timestamp += base::TimeDelta::FromMilliseconds(10); + ui::TouchEvent move1(ui::ET_TOUCH_MOVED, mid, 0, timestamp); + generator.Dispatch(&move1); + // Doing two moves instead of one will guarantee to generate a fling at the + // end. + timestamp += base::TimeDelta::FromMilliseconds(10); + ui::TouchEvent move2(ui::ET_TOUCH_MOVED, end, 0, timestamp); + generator.Dispatch(&move2); + ui::TouchEvent release(ui::ET_TOUCH_RELEASED, end, 0, timestamp); + generator.Dispatch(&release); + + EXPECT_TRUE(drag_drop_controller_->drag_start_received_); + EXPECT_FALSE(drag_drop_controller_->drag_canceled_); + EXPECT_EQ(2, drag_drop_controller_->num_drag_updates_); + EXPECT_TRUE(drag_drop_controller_->drop_received_); + EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), + drag_drop_controller_->drag_string_); + EXPECT_EQ(1, drag_view->num_drag_enters_); + EXPECT_EQ(2, drag_view->num_drag_updates_); + EXPECT_EQ(1, drag_view->num_drops_); + EXPECT_EQ(0, drag_view->num_drag_exits_); + EXPECT_TRUE(drag_view->drag_done_received_); +} + } // namespace test } // namespace aura -- cgit v1.1