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