15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/drag_drop/drag_drop_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/drag_drop/drag_drop_tracker.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/drag_drop/drag_image_view.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/ash_test_base.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/capture_client.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/ui_base_switches.h" 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_types.h" 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/event_generator.h" 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/events/test/events_test_utils.h" 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/linear_animation.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia_rep.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_delegate.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple view that makes sure RunShellDrag is invoked on mouse drag. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DragTestView : public views::View { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView() : views::View() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_enters_ = 0; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_exits_ = 0; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_updates_ = 0; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drops_ = 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_done_received_ = false; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long_tap_received_ = false; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int VerticalDragThreshold() { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return views::View::GetVerticalDragThreshold(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int HorizontalDragThreshold() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return views::View::GetHorizontalDragThreshold(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drag_enters_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drag_exits_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drag_updates_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drops_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool drag_done_received_; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool long_tap_received_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // View overrides: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GetDragOperations(const gfx::Point& press_pt) OVERRIDE { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DragDropTypes::DRAG_COPY; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WriteDragData(const gfx::Point& p, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OSExchangeData* data) OVERRIDE { 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data->SetString(base::UTF8ToUTF16("I am being dragged")); 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::ImageSkiaRep image_rep(gfx::Size(10, 20), 1.0f); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia image_skia(image_rep); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drag_utils::SetDragImageOnDataObject(image_skia, gfx::Vector2d(), data); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event->type() == ui::ET_GESTURE_LONG_TAP) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long_tap_received_ = true; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetDropFormats( 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* formats, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *formats = ui::OSExchangeData::STRING; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanDrop(const OSExchangeData& data) OVERRIDE { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDragEntered(const ui::DropTargetEvent& event) OVERRIDE { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_enters_++; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int OnDragUpdated(const ui::DropTargetEvent& event) OVERRIDE { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_updates_++; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DragDropTypes::DRAG_COPY; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDragExited() OVERRIDE { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_exits_++; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int OnPerformDrop(const ui::DropTargetEvent& event) OVERRIDE { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drops_++; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DragDropTypes::DRAG_COPY; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDragDone() OVERRIDE { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_done_received_ = true; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DragTestView); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class CompletableLinearAnimation : public gfx::LinearAnimation { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompletableLinearAnimation(int duration, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int frame_rate, 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::AnimationDelegate* delegate) 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : gfx::LinearAnimation(duration, frame_rate, delegate), 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration_(duration) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Complete() { 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Step(start_time() + base::TimeDelta::FromMilliseconds(duration_)); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int duration_; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass TestDragDropController : public DragDropController { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch TestDragDropController() : DragDropController() { Reset(); } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_start_received_ = false; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_updates_ = 0; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_received_ = false; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_canceled_ = false; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_string_.clear(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int StartDragAndDrop( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::OSExchangeData& data, 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* source_window, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Point& location, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int operation, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DragDropTypes::DragEventSource source) OVERRIDE { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_start_received_ = true; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetString(&drag_string_); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DragDropController::StartDragAndDrop( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data, root_window, source_window, location, operation, source); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DragUpdate(aura::Window* target, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::LocatedEvent& event) OVERRIDE { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragDropController::DragUpdate(target, event); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drag_updates_++; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Drop(aura::Window* target, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::LocatedEvent& event) OVERRIDE { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragDropController::Drop(target, event); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_received_ = true; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DragCancel() OVERRIDE { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragDropController::DragCancel(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_canceled_ = true; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual gfx::LinearAnimation* CreateCancelAnimation( 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int duration, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int frame_rate, 195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::AnimationDelegate* delegate) OVERRIDE { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new CompletableLinearAnimation(duration, frame_rate, delegate); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DoDragCancel(int animation_duration_ms) OVERRIDE { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragDropController::DoDragCancel(animation_duration_ms); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_canceled_ = true; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool drag_start_received_; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_drag_updates_; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool drop_received_; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool drag_canceled_; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 drag_string_; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestDragDropController); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNativeWidgetAura : public views::NativeWidgetAura { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TestNativeWidgetAura(views::internal::NativeWidgetDelegate* delegate) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : NativeWidgetAura(delegate), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check_if_capture_lost_(false) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_check_if_capture_lost(bool value) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check_if_capture_lost_ = value; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCaptureLost() OVERRIDE { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!check_if_capture_lost_); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::NativeWidgetAura::OnCaptureLost(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_if_capture_lost_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestNativeWidgetAura); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sky): this is for debugging, remove when track down failure. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetCheckIfCaptureLost(views::Widget* widget, bool value) { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Windows, the DCHECK triggers when running on bot or locally through RDP, 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but not when logged in locally. 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_WIN) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestNativeWidgetAura*>(widget->native_widget())-> 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_check_if_capture_lost(value); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* CreateNewWidget() { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget = new views::Widget; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams params; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.accept_events = true; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.parent = Shell::GetPrimaryRootWindow(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.child = true; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.native_widget = new TestNativeWidgetAura(widget); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddViewToWidgetAndResize(views::Widget* widget, views::View* view) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget->GetContentsView()) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* contents_view = new views::View; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetContentsView(contents_view); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* contents_view = widget->GetContentsView(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_view->AddChildView(view); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->SetBounds(contents_view->width(), 0, 100, 100); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect contents_view_bounds = contents_view->bounds(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_view_bounds.Union(view->bounds()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_view->SetBoundsRect(contents_view_bounds); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetBounds(contents_view_bounds); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DispatchGesture(ui::EventType gesture_type, gfx::Point location) { 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::GestureEventDetails event_details(gesture_type); 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_details.set_oldest_touch_id(1); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureEvent gesture_event( 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch location.x(), location.y(), 0, ui::EventTimeForNow(), event_details); 280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::EventSource* event_source = 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Shell::GetPrimaryRootWindow()->GetHost()->GetEventSource(); 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::EventSourceTestApi event_source_test(event_source); 283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ui::EventDispatchDetails details = 284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event_source_test.SendEventToProcessor(&gesture_event); 285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK(!details.dispatcher_destroyed); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DragDropControllerTest : public AshTestBase { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragDropControllerTest() : AshTestBase() {} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DragDropControllerTest() {} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() OVERRIDE { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::SetUp(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_.reset(new TestDragDropController); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->set_should_block_during_drag_drop(false); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetDragDropClient(Shell::GetPrimaryRootWindow(), 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_.get()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() OVERRIDE { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetDragDropClient(Shell::GetPrimaryRootWindow(), NULL); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_.reset(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AshTestBase::TearDown(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDragData(ui::OSExchangeData* data) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_data_ = data; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* GetDragWindow() { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return drag_drop_controller_->drag_window_; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* GetDragSourceWindow() { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return drag_drop_controller_->drag_source_window_; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetDragSourceWindow(aura::Window* drag_source_window) { 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->drag_source_window_ = drag_source_window; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_source_window->AddObserver(drag_drop_controller_.get()); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* GetDragImageWindow() { 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return drag_drop_controller_->drag_image_.get() ? 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->drag_image_->GetWidget()->GetNativeWindow() : 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DragDropTracker* drag_drop_tracker() { 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return drag_drop_controller_->drag_drop_tracker_.get(); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteCancelAnimation() { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompletableLinearAnimation* animation = 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<CompletableLinearAnimation*>( 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->cancel_animation_.get()); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation->Complete(); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<TestDragDropController> drag_drop_controller_; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DragDropControllerTest); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(win_aura) http://crbug.com/154081 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragDropInSingleViewTest DISABLED_DragDropInSingleViewTest 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragDropInSingleViewTest DragDropInSingleViewTest 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, MAYBE_DragDropInSingleViewTest) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view = new DragTestView; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = 17; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCheckIfCaptureLost(widget.get(), true); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 7 comes from views::View::GetVerticalDragThreshold()). 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i >= 7) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetCheckIfCaptureLost(widget.get(), false); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_string_); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_enters_); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view->num_drag_updates_); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drops_); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view->num_drag_exits_); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DragDropControllerTest, DragDropWithZeroDragUpdates) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view = new DragTestView; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = drag_view->VerticalDragThreshold() + 1; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold() + 1, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_enters_); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold() + 1, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view->num_drag_updates_); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drops_); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view->num_drag_exits_); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(win_aura) http://crbug.com/154081 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragDropInMultipleViewsSingleWidgetTest DISABLED_DragDropInMultipleViewsSingleWidgetTest 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragDropInMultipleViewsSingleWidgetTest DragDropInMultipleViewsSingleWidgetTest 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, MAYBE_DragDropInMultipleViewsSingleWidgetTest) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view1 = new DragTestView; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view1); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view2 = new DragTestView; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view2); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseRelativeTo(widget->GetNativeView(), 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view1->bounds().CenterPoint()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = drag_view1->width(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(1, 0); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view1->HorizontalDragThreshold(), 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_string_); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view1->num_drag_enters_); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_expected_updates = drag_view1->bounds().width() - 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view1->bounds().CenterPoint().x() - 2; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_expected_updates - drag_view1->HorizontalDragThreshold(), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view1->num_drag_updates_); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view1->num_drops_); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view1->num_drag_exits_); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view1->drag_done_received_); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view2->num_drag_enters_); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_expected_updates = num_drags - num_expected_updates - 1; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_expected_updates, drag_view2->num_drag_updates_); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view2->num_drops_); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view2->num_drag_exits_); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(drag_view2->drag_done_received_); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(win_aura) http://crbug.com/154081 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragDropInMultipleViewsMultipleWidgetsTest DISABLED_DragDropInMultipleViewsMultipleWidgetsTest 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_DragDropInMultipleViewsMultipleWidgetsTest DragDropInMultipleViewsMultipleWidgetsTest 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, MAYBE_DragDropInMultipleViewsMultipleWidgetsTest) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget1(CreateNewWidget()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view1 = new DragTestView; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget1.get(), drag_view1); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget2(CreateNewWidget()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view2 = new DragTestView; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget2.get(), drag_view2); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect widget1_bounds = widget1->GetClientAreaBoundsInScreen(); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect widget2_bounds = widget2->GetClientAreaBoundsInScreen(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget2->SetBounds(gfx::Rect(widget1_bounds.width(), 0, 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget2_bounds.width(), widget2_bounds.height())); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget1->GetNativeView()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = drag_view1->width(); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(1, 0); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view1->HorizontalDragThreshold(), 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_string_); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view1->num_drag_enters_); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_expected_updates = drag_view1->bounds().width() - 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view1->bounds().CenterPoint().x() - 2; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_expected_updates - drag_view1->HorizontalDragThreshold(), 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view1->num_drag_updates_); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view1->num_drops_); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view1->num_drag_exits_); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view1->drag_done_received_); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view2->num_drag_enters_); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_expected_updates = num_drags - num_expected_updates - 1; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_expected_updates, drag_view2->num_drag_updates_); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view2->num_drops_); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view2->num_drag_exits_); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(drag_view2->drag_done_received_); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(win_aura) http://crbug.com/154081 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ViewRemovedWhileInDragDropTest DISABLED_ViewRemovedWhileInDragDropTest 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_ViewRemovedWhileInDragDropTest ViewRemovedWhileInDragDropTest 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, MAYBE_ViewRemovedWhileInDragDropTest) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DragTestView> drag_view(new DragTestView); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view.get()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point = gfx::Rect(drag_view->bounds()).CenterPoint(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseToCenterOf(widget->GetNativeView()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags_1 = 17; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags_1; ++i) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view->parent()->RemoveChildView(drag_view.get()); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // View has been removed. We will not get any of the following drag updates. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags_2 = 23; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags_2; ++i) { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags_1 + num_drags_2 - 1 - drag_view->VerticalDragThreshold(), 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_string_); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_enters_); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags_1 - 1 - drag_view->VerticalDragThreshold(), 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view->num_drag_updates_); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view->num_drops_); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view->num_drag_exits_); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DragDropControllerTest, DragLeavesClipboardAloneTest) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard* cb = ui::Clipboard::GetForCurrentThread(); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string clip_str("I am on the clipboard"); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We first copy some text to the clipboard. 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter scw(ui::CLIPBOARD_TYPE_COPY_PASTE); 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scw.WriteText(base::ASCIIToUTF16(clip_str)); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cb->IsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(), 6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::CLIPBOARD_TYPE_COPY_PASTE)); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view = new DragTestView; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_str("I am being dragged"); 6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::ASCIIToUTF16(data_str)); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, drag_view->VerticalDragThreshold() + 1); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the clipboard contents haven't changed 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(cb->IsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(), 6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::CLIPBOARD_TYPE_COPY_PASTE)); 6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cb->ReadAsciiText(ui::CLIPBOARD_TYPE_COPY_PASTE, &result); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(clip_str, result); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destory the clipboard here because ash doesn't delete it. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crbug.com/158150. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard::DestroyClipboardForCurrentThread(); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DragDropControllerTest, WindowDestroyedDuringDragDrop) { 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view = new DragTestView; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = widget->GetNativeView(); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 6725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 6735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = 17; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > drag_view->VerticalDragThreshold()) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(window, GetDragWindow()); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->CloseNow(); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(GetDragWindow()); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_drags = 23; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not crash here. 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DragDropControllerTest, SyntheticEventsDuringDragDrop) { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view = new DragTestView; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 7165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 7175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = 17; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We send a unexpected mouse move event. Note that we cannot use 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EventGenerator since it implicitly turns these into mouse drag events. 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The DragDropController should simply ignore these events. 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point mouse_move_location = drag_view->bounds().CenterPoint(); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent mouse_move(ui::ET_MOUSE_MOVED, mouse_move_location, 7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mouse_move_location, 0, 0); 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = Shell::GetPrimaryRootWindow()-> 73723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) GetHost()->event_processor()->OnEventFromSource(&mouse_move); 7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.ReleaseLeftButton(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_string_); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_enters_); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view->num_drag_updates_); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drops_); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view->num_drag_exits_); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(win_aura) http://crbug.com/154081 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PressingEscapeCancelsDragDrop DISABLED_PressingEscapeCancelsDragDrop 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CaptureLostCancelsDragDrop DISABLED_CaptureLostCancelsDragDrop 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_PressingEscapeCancelsDragDrop PressingEscapeCancelsDragDrop 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CaptureLostCancelsDragDrop CaptureLostCancelsDragDrop 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, MAYBE_PressingEscapeCancelsDragDrop) { 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTestView* drag_view = new DragTestView; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressLeftButton(); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_drags = 17; 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // drag_data_ to a fake drag data object that we created. 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateDragData(&data); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.MoveMouseBy(0, 1); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunAllPendingInMessageLoop(); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generator.PressKey(ui::VKEY_ESCAPE, 0); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->num_drag_updates_); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(drag_drop_controller_->drop_received_); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_canceled_); 7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_->drag_string_); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_enters_); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_view->num_drag_updates_); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, drag_view->num_drops_); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_exits_); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, MAYBE_CaptureLostCancelsDragDrop) { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragTestView* drag_view = new DragTestView; 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData data; 8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 8155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressLeftButton(); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_drags = 17; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // drag_data_ to a fake drag data object that we created. 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDragData(&data); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.MoveMouseBy(0, 1); 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the capture window won't handle mouse events. 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* capture_window = drag_drop_tracker()->capture_window(); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(!!capture_window); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("0x0", capture_window->bounds().size().ToString()); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capture_window->GetEventHandlerForPoint(gfx::Point())); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) capture_window->GetTopWindowContainingPoint(gfx::Point())); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::GetCaptureClient(widget->GetNativeView()->GetRootWindow())-> 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCapture(NULL); 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->num_drag_updates_); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(drag_drop_controller_->drop_received_); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_canceled_); 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->drag_string_); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_enters_); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_drags - 1 - drag_view->VerticalDragThreshold(), 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_view->num_drag_updates_); 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_view->num_drops_); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, drag_view->num_drag_exits_); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, TouchDragDropInMultipleWindows) { 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableTouchDragDrop); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget1(CreateNewWidget()); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragTestView* drag_view1 = new DragTestView; 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddViewToWidgetAndResize(widget1.get(), drag_view1); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget2(CreateNewWidget()); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragTestView* drag_view2 = new DragTestView; 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddViewToWidgetAndResize(widget2.get(), drag_view2); 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect widget1_bounds = widget1->GetClientAreaBoundsInScreen(); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect widget2_bounds = widget2->GetClientAreaBoundsInScreen(); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget2->SetBounds(gfx::Rect(widget1_bounds.width(), 0, 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget2_bounds.width(), widget2_bounds.height())); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData data; 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 8775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget1->GetNativeView()); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point point = gfx::Rect(drag_view1->bounds()).CenterPoint(); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_LONG_PRESS, point); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because we are not doing a blocking drag and drop, the original 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OSDragExchangeData object is lost as soon as we return from the drag 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initiation in DragDropController::StartDragAndDrop(). Hence we set the 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // drag_data_ to a fake drag data object that we created. 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDragData(&data); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point gesture_location = point; 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_drags = drag_view1->width(); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < num_drags; ++i) { 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gesture_location.Offset(1, 0); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_SCROLL_UPDATE, gesture_location); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Execute any scheduled draws to process deferred mouse events. 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAllPendingInMessageLoop(); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_SCROLL_END, gesture_location); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_drags, drag_drop_controller_->num_drag_updates_); 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drop_received_); 9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->drag_string_); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, drag_view1->num_drag_enters_); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_expected_updates = drag_view1->bounds().width() - 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_view1->bounds().CenterPoint().x() - 1; 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_expected_updates, drag_view1->num_drag_updates_); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_view1->num_drops_); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, drag_view1->num_drag_exits_); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_view1->drag_done_received_); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, drag_view2->num_drag_enters_); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) num_expected_updates = num_drags - num_expected_updates; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_expected_updates, drag_view2->num_drag_updates_); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, drag_view2->num_drops_); 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_view2->num_drag_exits_); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(drag_view2->drag_done_received_); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, TouchDragDropCancelsOnLongTap) { 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableTouchDragDrop); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragTestView* drag_view = new DragTestView; 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 9265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 9275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point point = gfx::Rect(drag_view->bounds()).CenterPoint(); 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_LONG_PRESS, point); 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_LONG_TAP, point); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_start_received_); 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_drop_controller_->drag_canceled_); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_drop_controller_->num_drag_updates_); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(drag_drop_controller_->drop_received_); 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF8ToUTF16("I am being dragged"), 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->drag_string_); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_view->num_drag_enters_); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_view->num_drops_); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, drag_view->num_drag_exits_); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_view->drag_done_received_); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DragDropControllerTest, TouchDragDropLongTapGestureIsForwarded) { 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableTouchDragDrop); 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragTestView* drag_view = new DragTestView; 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddViewToWidgetAndResize(widget.get(), drag_view); 9525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), 9535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) widget->GetNativeView()); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.PressTouch(); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point point = gfx::Rect(drag_view->bounds()).CenterPoint(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_LONG_PRESS, point); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since we are not running inside a nested loop, the |drag_source_window_| 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will get destroyed immediately. Hence we reassign it. 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NULL, GetDragSourceWindow()); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDragSourceWindow(widget->GetNativeView()); 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(drag_view->long_tap_received_); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchGesture(ui::ET_GESTURE_LONG_TAP, point); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteCancelAnimation(); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(drag_view->long_tap_received_); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DragImageWindowObserver : public aura::WindowObserver { 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_location_on_destroying_ = window->GetBoundsInScreen().origin(); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point window_location_on_destroying() const { 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_location_on_destroying_; 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point window_location_on_destroying_; 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies the drag image moves back to the position where drag is started 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// across displays when drag is cancelled. 9897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DragDropControllerTest, DragCancelAcrossDisplays) { 9907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!SupportsMultipleDisplays()) 9917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 9927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateDisplay("400x400,400x400"); 994f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->GetAllRootWindows(); 996f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (aura::Window::Windows::iterator iter = root_windows.begin(); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != root_windows.end(); ++iter) { 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetDragDropClient(*iter, drag_drop_controller_.get()); 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData data; 10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.SetString(base::UTF8ToUTF16("I am being dragged")); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window = widget->GetNativeWindow(); 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->StartDragAndDrop( 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data, 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->GetRootWindow(), 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window, 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(5, 5), 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DragDropTypes::DRAG_MOVE, 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE); 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragImageWindowObserver observer; 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(GetDragImageWindow()); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDragImageWindow()->AddObserver(&observer); 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::MouseEvent e(ui::ET_MOUSE_DRAGGED, 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(200, 0), 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(200, 0), 10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_NONE, 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_NONE); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->DragUpdate(window, e); 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::MouseEvent e(ui::ET_MOUSE_DRAGGED, 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(600, 0), 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(600, 0), 10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_NONE, 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_NONE); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->DragUpdate(window, e); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->DragCancel(); 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteCancelAnimation(); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("5,5", observer.window_location_on_destroying().ToString()); 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<views::Widget> widget(CreateNewWidget()); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window = widget->GetNativeWindow(); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->StartDragAndDrop( 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data, 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->GetRootWindow(), 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window, 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(405, 405), 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DragDropTypes::DRAG_MOVE, 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE); 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DragImageWindowObserver observer; 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(GetDragImageWindow()); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDragImageWindow()->AddObserver(&observer); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::MouseEvent e(ui::ET_MOUSE_DRAGGED, 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(600, 0), 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(600, 0), 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_NONE, 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_NONE); 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->DragUpdate(window, e); 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::MouseEvent e(ui::ET_MOUSE_DRAGGED, 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(200, 0), 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(200, 0), 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_NONE, 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_NONE); 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->DragUpdate(window, e); 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_drop_controller_->DragCancel(); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteCancelAnimation(); 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("405,405", observer.window_location_on_destroying().ToString()); 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (aura::Window::Windows::iterator iter = root_windows.begin(); 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != root_windows.end(); ++iter) { 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetDragDropClient(*iter, NULL); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace aura 1085