summaryrefslogtreecommitdiffstats
path: root/ash/drag_drop
diff options
context:
space:
mode:
authormfomitchev <mfomitchev@chromium.org>2014-11-24 13:50:06 -0800
committerCommit bot <commit-bot@chromium.org>2014-11-24 21:50:22 +0000
commit3ad5e0f15b3bc40b2f45aa10dfce1cb7402ef9a5 (patch)
tree0378d89ae396c6ab5c5acc8b3847e6a44f4c22f2 /ash/drag_drop
parentac639a14d4fe60d4b995f97540b303f4acd33864 (diff)
downloadchromium_src-3ad5e0f15b3bc40b2f45aa10dfce1cb7402ef9a5.zip
chromium_src-3ad5e0f15b3bc40b2f45aa10dfce1cb7402ef9a5.tar.gz
chromium_src-3ad5e0f15b3bc40b2f45aa10dfce1cb7402ef9a5.tar.bz2
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}
Diffstat (limited to 'ash/drag_drop')
-rw-r--r--ash/drag_drop/drag_drop_controller.cc2
-rw-r--r--ash/drag_drop/drag_drop_controller_unittest.cc48
2 files changed, 49 insertions, 1 deletions
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<views::Widget> 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