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