diff options
author | mfomitchev <mfomitchev@chromium.org> | 2014-11-24 13:50:06 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-24 21:50:22 +0000 |
commit | 3ad5e0f15b3bc40b2f45aa10dfce1cb7402ef9a5 (patch) | |
tree | 0378d89ae396c6ab5c5acc8b3847e6a44f4c22f2 /ash/drag_drop | |
parent | ac639a14d4fe60d4b995f97540b303f4acd33864 (diff) | |
download | chromium_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.cc | 2 | ||||
-rw-r--r-- | ash/drag_drop/drag_drop_controller_unittest.cc | 48 |
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 |