1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/views/menu_test_base.h"
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/test/base/interactive_test_utils.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/dragdrop/drag_drop_types.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/dragdrop/os_exchange_data.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/controls/menu/menu_controller.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/menu/menu_item_view.h"
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/views/controls/menu/menu_runner.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/controls/menu/submenu_view.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/view.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Borrowed from chrome/browser/ui/views/bookmarks/bookmark_bar_view_test.cc,
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// since these are also disabled on Linux for drag and drop.
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(erg): Fix DND tests on linux_aura. crbug.com/163931
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_LINUX) && defined(USE_AURA)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE(x) DISABLED_##x
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE(x) x
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestNestedDragData[] = "test_nested_drag_data";
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestTopLevelDragData[] = "test_top_level_drag_data";
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A simple view which can be dragged.
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestDragView : public views::View {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestDragView();
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~TestDragView();
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // views::View:
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int GetDragOperations(const gfx::Point& point) OVERRIDE;
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void WriteDragData(const gfx::Point& point,
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             ui::OSExchangeData* data) OVERRIDE;
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestDragView);
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
45116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTestDragView::TestDragView() {
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTestDragView::~TestDragView() {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint TestDragView::GetDragOperations(const gfx::Point& point) {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DragDropTypes::DRAG_MOVE;
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestDragView::WriteDragData(const gfx::Point& point,
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 ui::OSExchangeData* data) {
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data->SetString(base::ASCIIToUTF16(kTestNestedDragData));
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// A simple view to serve as a drop target.
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestTargetView : public views::View {
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTargetView();
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~TestTargetView();
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Initializes this view to have the same bounds as |parent| and two draggable
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // child views.
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Init(views::View* parent);
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool dragging() const { return dragging_; }
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool dropped() const { return dropped_; }
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // views::View:
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool GetDropFormats(
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      int* formats,
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      std::set<OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool AreDropTypesRequired() OVERRIDE;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool CanDrop(const OSExchangeData& data) OVERRIDE;
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnDragEntered(const ui::DropTargetEvent& event) OVERRIDE;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int OnDragUpdated(const ui::DropTargetEvent& event) OVERRIDE;
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int OnPerformDrop(const ui::DropTargetEvent& event) OVERRIDE;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnDragExited() OVERRIDE;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Whether or not we are currently dragging.
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool dragging_;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Whether or not a drop has been performed on the view.
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool dropped_;
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(TestTargetView);
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
93116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTestTargetView::TestTargetView() : dragging_(false), dropped_(false) {
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestTargetView::Init(views::View* parent) {
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // First, match the parent's size.
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SetSize(parent->size());
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Then add two draggable views, each 10x2.
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* first = new TestDragView();
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddChildView(first);
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  first->SetBounds(2, 2, 10, 2);
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* second = new TestDragView();
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddChildView(second);
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  second->SetBounds(15, 2, 10, 2);
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
110116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTestTargetView::~TestTargetView() {
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool TestTargetView::GetDropFormats(
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int* formats, std::set<OSExchangeData::CustomFormat>* custom_formats) {
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *formats = ui::OSExchangeData::STRING;
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool TestTargetView::AreDropTypesRequired() {
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool TestTargetView::CanDrop(const OSExchangeData& data) {
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 contents;
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return data.GetString(&contents) &&
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         contents == base::ASCIIToUTF16(kTestNestedDragData);
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestTargetView::OnDragEntered(const ui::DropTargetEvent& event) {
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dragging_ = true;
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint TestTargetView::OnDragUpdated(const ui::DropTargetEvent& event) {
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DragDropTypes::DRAG_MOVE;
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint TestTargetView::OnPerformDrop(const ui::DropTargetEvent& event) {
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dragging_ = false;
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dropped_ = true;
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DragDropTypes::DRAG_MOVE;
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TestTargetView::OnDragExited() {
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  dragging_ = false;
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MenuViewDragAndDropTest : public MenuTestBase {
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MenuViewDragAndDropTest();
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~MenuViewDragAndDropTest();
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTargetView* target_view() { return target_view_; }
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool asked_to_close() const { return asked_to_close_; }
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool performed_in_menu_drop() const { return performed_in_menu_drop_; }
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // MenuTestBase:
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE;
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // views::MenuDelegate:
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool GetDropFormats(
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      views::MenuItemView* menu,
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      int* formats,
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool AreDropTypesRequired(views::MenuItemView* menu) OVERRIDE;
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool CanDrop(views::MenuItemView* menu,
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       const ui::OSExchangeData& data) OVERRIDE;
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int GetDropOperation(views::MenuItemView* item,
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               const ui::DropTargetEvent& event,
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                               DropPosition* position) OVERRIDE;
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int OnPerformDrop(views::MenuItemView* menu,
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            DropPosition position,
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            const ui::DropTargetEvent& event) OVERRIDE;
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool CanDrag(views::MenuItemView* menu) OVERRIDE;
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void WriteDragData(views::MenuItemView* sender,
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             ui::OSExchangeData* data) OVERRIDE;
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual int GetDragOperations(views::MenuItemView* sender) OVERRIDE;
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool ShouldCloseOnDragComplete() OVERRIDE;
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The special view in the menu, which supports its own drag and drop.
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTargetView* target_view_;
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Whether or not we have been asked to close on drag complete.
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool asked_to_close_;
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Whether or not a drop was performed in-menu (i.e., not including drops
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // in separate child views).
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool performed_in_menu_drop_;
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(MenuViewDragAndDropTest);
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
196116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMenuViewDragAndDropTest::MenuViewDragAndDropTest()
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : target_view_(NULL),
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      asked_to_close_(false),
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      performed_in_menu_drop_(false) {
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
202116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMenuViewDragAndDropTest::~MenuViewDragAndDropTest() {
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTest::BuildMenu(views::MenuItemView* menu) {
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Build a menu item that has a nested view that supports its own drag and
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // drop...
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::MenuItemView* menu_item_view =
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      menu->AppendMenuItem(1,
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           base::ASCIIToUTF16("item 1"),
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           views::MenuItemView::NORMAL);
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  target_view_ = new TestTargetView();
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  menu_item_view->AddChildView(target_view_);
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ... as well as two other, normal items.
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  menu->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("item 2"));
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  menu->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("item 3"));
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MenuViewDragAndDropTest::GetDropFormats(
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::MenuItemView* menu,
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int* formats,
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::set<ui::OSExchangeData::CustomFormat>* custom_formats) {
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *formats = ui::OSExchangeData::STRING;
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MenuViewDragAndDropTest::AreDropTypesRequired(views::MenuItemView* menu) {
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MenuViewDragAndDropTest::CanDrop(views::MenuItemView* menu,
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      const ui::OSExchangeData& data) {
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::string16 contents;
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return data.GetString(&contents) &&
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         contents == base::ASCIIToUTF16(kTestTopLevelDragData);
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint MenuViewDragAndDropTest::GetDropOperation(views::MenuItemView* item,
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                              const ui::DropTargetEvent& event,
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                              DropPosition* position) {
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DragDropTypes::DRAG_MOVE;
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint MenuViewDragAndDropTest::OnPerformDrop(views::MenuItemView* menu,
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           DropPosition position,
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           const ui::DropTargetEvent& event) {
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  performed_in_menu_drop_ = true;
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DragDropTypes::DRAG_MOVE;
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MenuViewDragAndDropTest::CanDrag(views::MenuItemView* menu) {
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTest::WriteDragData(
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    views::MenuItemView* sender, ui::OSExchangeData* data) {
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  data->SetString(base::ASCIIToUTF16(kTestTopLevelDragData));
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint MenuViewDragAndDropTest::GetDragOperations(views::MenuItemView* sender) {
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return ui::DragDropTypes::DRAG_MOVE;
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool MenuViewDragAndDropTest::ShouldCloseOnDragComplete() {
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  asked_to_close_ = true;
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MenuViewDragAndDropTestTestInMenuDrag : public MenuViewDragAndDropTest {
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MenuViewDragAndDropTestTestInMenuDrag() {}
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~MenuViewDragAndDropTestTestInMenuDrag() {}
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // MenuViewDragAndDropTest:
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DoTestWithMenuOpen() OVERRIDE;
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Step2();
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Step3();
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Step4();
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestTestInMenuDrag::DoTestWithMenuOpen() {
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // A few sanity checks to make sure the menu built correctly.
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::SubmenuView* submenu = menu()->GetSubmenu();
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(submenu);
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(submenu->IsShowing());
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(3, submenu->GetMenuItemCount());
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We do this here (instead of in BuildMenu()) so that the menu is already
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // built and the bounds are correct.
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  target_view()->Init(submenu->GetMenuItemAt(0));
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We're going to drag the second menu element.
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::MenuItemView* drag_view = submenu->GetMenuItemAt(1);
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(drag_view != NULL);
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Move mouse to center of menu and press button.
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_test_utils::MoveMouseToCenterAndPress(
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      drag_view,
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::LEFT,
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::DOWN,
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateEventTask(this, &MenuViewDragAndDropTestTestInMenuDrag::Step2));
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestTestInMenuDrag::Step2() {
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::MenuItemView* drop_target = menu()->GetSubmenu()->GetMenuItemAt(2);
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Point loc(1, drop_target->height() - 1);
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View::ConvertPointToScreen(drop_target, &loc);
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Start a drag.
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_controls::SendMouseMoveNotifyWhenDone(
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      loc.x() + 10,
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      loc.y(),
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateEventTask(this, &MenuViewDragAndDropTestTestInMenuDrag::Step3));
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScheduleMouseMoveInBackground(loc.x(), loc.y());
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestTestInMenuDrag::Step3() {
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Drop the item on the target.
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::MenuItemView* drop_target = menu()->GetSubmenu()->GetMenuItemAt(2);
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Point loc(1, drop_target->height() - 2);
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View::ConvertPointToScreen(drop_target, &loc);
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_controls::SendMouseMove(loc.x(), loc.y());
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_controls::SendMouseEventsNotifyWhenDone(
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::LEFT,
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::UP,
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateEventTask(this, &MenuViewDragAndDropTestTestInMenuDrag::Step4));
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestTestInMenuDrag::Step4() {
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify our state.
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We should have performed an in-menu drop, and the nested view should not
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // have had a drag and drop. Since the drag happened in menu code, the
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // delegate should not have been asked whether or not to close, and the menu
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // should simply be closed.
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(performed_in_menu_drop());
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(target_view()->dropped());
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(asked_to_close());
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(menu()->GetSubmenu()->IsShowing());
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Done();
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that an in-menu (i.e., entirely implemented in the menu code) closes the
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// menu automatically once the drag is complete, and does not ask the delegate
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// to stay open.
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_WIN)  // flaky http://crbug.com/401226
352116680a4aac90f2aa7413d9095a592090648e557Ben MurdochVIEW_TEST(MenuViewDragAndDropTestTestInMenuDrag, MAYBE(TestInMenuDrag))
3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MenuViewDragAndDropTestNestedDrag : public MenuViewDragAndDropTest {
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MenuViewDragAndDropTestNestedDrag() {}
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~MenuViewDragAndDropTestNestedDrag() {}
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // MenuViewDragAndDropTest:
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void DoTestWithMenuOpen() OVERRIDE;
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Step2();
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Step3();
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Step4();
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestNestedDrag::DoTestWithMenuOpen() {
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Sanity checks: We should be showing the menu, it should have three
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // children, and the first of those children should have a nested view of the
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TestTargetView.
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::SubmenuView* submenu = menu()->GetSubmenu();
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(submenu);
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(submenu->IsShowing());
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(3, submenu->GetMenuItemCount());
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* first_view = submenu->GetMenuItemAt(0);
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1, first_view->child_count());
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* child_view = first_view->child_at(0);
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(child_view, target_view());
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // We do this here (instead of in BuildMenu()) so that the menu is already
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // built and the bounds are correct.
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  target_view()->Init(submenu->GetMenuItemAt(0));
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The target view should now have two children.
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(2, target_view()->child_count());
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* drag_view = target_view()->child_at(0);
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(drag_view != NULL);
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Move mouse to center of menu and press button.
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_test_utils::MoveMouseToCenterAndPress(
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      drag_view,
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::LEFT,
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::DOWN,
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateEventTask(this, &MenuViewDragAndDropTestNestedDrag::Step2));
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestNestedDrag::Step2() {
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* drop_target = target_view()->child_at(1);
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Point loc(2, 0);
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View::ConvertPointToScreen(drop_target, &loc);
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Start a drag.
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_controls::SendMouseMoveNotifyWhenDone(
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      loc.x() + 3,
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      loc.y(),
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateEventTask(this, &MenuViewDragAndDropTestNestedDrag::Step3));
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScheduleMouseMoveInBackground(loc.x(), loc.y());
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestNestedDrag::Step3() {
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The view should be dragging now.
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(target_view()->dragging());
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Drop the item so that it's now the second item.
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View* drop_target = target_view()->child_at(1);
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gfx::Point loc(5, 0);
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  views::View::ConvertPointToScreen(drop_target, &loc);
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_controls::SendMouseMove(loc.x(), loc.y());
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ui_controls::SendMouseEventsNotifyWhenDone(
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::LEFT,
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_controls::UP,
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      CreateEventTask(this, &MenuViewDragAndDropTestNestedDrag::Step4));
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MenuViewDragAndDropTestNestedDrag::Step4() {
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check our state.
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The target view should have finished its drag, and should have dropped the
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // view. The main menu should not have done any drag, and the delegate should
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // have been asked if it wanted to close. Since the delegate did not want to
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // close, the menu should still be open.
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(target_view()->dragging());
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(target_view()->dropped());
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(performed_in_menu_drop());
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(asked_to_close());
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(menu()->GetSubmenu()->IsShowing());
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Clean up.
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  menu()->GetSubmenu()->Close();
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Done();
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that a nested drag (i.e. one via a child view, and not entirely
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// implemented in menu code) will consult the delegate before closing the view
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// after the drag.
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_WIN)  // http://crbug.com/401226
452116680a4aac90f2aa7413d9095a592090648e557Ben MurdochVIEW_TEST(MenuViewDragAndDropTestNestedDrag,
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          MAYBE(MenuViewDragAndDropNestedDrag))
4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MenuViewDragAndDropForDropStayOpen : public MenuViewDragAndDropTest {
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MenuViewDragAndDropForDropStayOpen() {}
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MenuViewDragAndDropForDropStayOpen() {}
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // MenuViewDragAndDropTest:
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int GetMenuRunnerFlags() OVERRIDE;
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void DoTestWithMenuOpen() OVERRIDE;
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int MenuViewDragAndDropForDropStayOpen::GetMenuRunnerFlags() {
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return views::MenuRunner::HAS_MNEMONICS |
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         views::MenuRunner::NESTED_DRAG |
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         views::MenuRunner::FOR_DROP;
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MenuViewDragAndDropForDropStayOpen::DoTestWithMenuOpen() {
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::SubmenuView* submenu = menu()->GetSubmenu();
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(submenu);
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(submenu->IsShowing());
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::MenuController* controller = menu()->GetMenuController();
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(controller);
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(controller->IsCancelAllTimerRunningForTest());
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Done();
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that if a menu is opened for a drop which is handled by a child view
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// that the menu does not immediately try to close.
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)VIEW_TEST(MenuViewDragAndDropForDropStayOpen, MenuViewStaysOpenForNestedDrag)
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MenuViewDragAndDropForDropCancel : public MenuViewDragAndDropTest {
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MenuViewDragAndDropForDropCancel() {}
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MenuViewDragAndDropForDropCancel() {}
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // MenuViewDragAndDropTest:
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual int GetMenuRunnerFlags() OVERRIDE;
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void DoTestWithMenuOpen() OVERRIDE;
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int MenuViewDragAndDropForDropCancel::GetMenuRunnerFlags() {
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::FOR_DROP;
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MenuViewDragAndDropForDropCancel::DoTestWithMenuOpen() {
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::SubmenuView* submenu = menu()->GetSubmenu();
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(submenu);
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(submenu->IsShowing());
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::MenuController* controller = menu()->GetMenuController();
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(controller);
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(controller->IsCancelAllTimerRunningForTest());
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Done();
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Test that if a menu is opened for a drop handled entirely by menu code, the
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// menu will try to close if it does not receive any drag updates.
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)VIEW_TEST(MenuViewDragAndDropForDropCancel, MenuViewCancelsForOwnDrag)
519