1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/message_loop/message_loop.h" 6#include "base/strings/utf_string_conversions.h" 7#include "chrome/test/base/interactive_test_utils.h" 8#include "chrome/test/base/ui_test_utils.h" 9#include "chrome/test/base/view_event_test_base.h" 10#include "ui/base/models/simple_menu_model.h" 11#include "ui/base/test/ui_controls.h" 12#include "ui/views/controls/button/button_dropdown.h" 13 14class ButtonDropDownDragTest : public ViewEventTestBase, 15 ui::SimpleMenuModel::Delegate { 16 public: 17 ButtonDropDownDragTest() 18 : button_(NULL), 19 menu_shown_(false), 20 menu_closed_(false) { 21 } 22 23 virtual ~ButtonDropDownDragTest() { 24 } 25 26 // ViewEventTestBase implementation. 27 virtual void SetUp() OVERRIDE { 28 button_ = new views::ButtonDropDown(NULL, new ui::SimpleMenuModel(this)); 29 30 ViewEventTestBase::SetUp(); 31 } 32 33 virtual void TearDown() OVERRIDE { 34 ViewEventTestBase::TearDown(); 35 } 36 37 virtual views::View* CreateContentsView() OVERRIDE { 38 return button_; 39 } 40 41 virtual gfx::Size GetPreferredSize() OVERRIDE { 42 return button_->GetPreferredSize(); 43 } 44 45 // ui::SimpleMenuModel::Delegate implementation. 46 virtual bool IsCommandIdChecked(int id) const OVERRIDE { 47 return false; 48 } 49 50 virtual bool IsCommandIdEnabled(int id) const OVERRIDE { 51 return true; 52 } 53 54 virtual bool GetAcceleratorForCommandId( 55 int id, 56 ui::Accelerator* accelerator) OVERRIDE { 57 return false; 58 } 59 60 virtual void ExecuteCommand(int id, int event_flags) OVERRIDE { 61 } 62 63 virtual void MenuWillShow(ui::SimpleMenuModel* /*source*/) OVERRIDE { 64 menu_shown_ = true; 65 } 66 67 virtual void MenuClosed(ui::SimpleMenuModel* /*source*/) OVERRIDE { 68 menu_closed_ = true; 69 } 70 71 // ViewEventTestBase implementation. 72 virtual void DoTestOnMessageLoop() OVERRIDE { 73 // Click on the ButtonDropDown. 74 ui_test_utils::MoveMouseToCenterAndPress( 75 button_, 76 ui_controls::LEFT, 77 ui_controls::DOWN, 78 CreateEventTask(this, &ButtonDropDownDragTest::Step1)); 79 } 80 81 void Step1() { 82 // Drag to invoke the menu. 83 gfx::Point view_center; 84 views::View::ConvertPointToScreen(button_, &view_center); 85 // The 50 is a bit arbitrary. We just need a value greater than the drag 86 // threshold. 87 ui_controls::SendMouseMoveNotifyWhenDone( 88 view_center.x(), view_center.y() + 50, 89 CreateEventTask(this, &ButtonDropDownDragTest::Step2)); 90 } 91 92 void Step2() { 93 ASSERT_TRUE(menu_shown_); 94 95 // Release. 96 ui_controls::SendMouseEventsNotifyWhenDone( 97 ui_controls::LEFT, 98 ui_controls::UP, 99 CreateEventTask(this, &ButtonDropDownDragTest::Step3)); 100 } 101 102 void Step3() { 103 // Click mouse to dismiss menu. The views menu does not dismiss the 104 // menu on click-drag-release unless an item is selected. 105 ui_test_utils::MoveMouseToCenterAndPress( 106 button_, 107 ui_controls::LEFT, 108 ui_controls::DOWN | ui_controls::UP, 109 CreateEventTask(this, &ButtonDropDownDragTest::Step4)); 110 } 111 112 void Step4() { 113 // One more hop is required because ui::SimpleMenuModel calls 114 // ui::SimpleMenuModel::Delegate::MenuClosed() via a posted 115 // task. 116 base::MessageLoopForUI::current()->PostTask( 117 FROM_HERE, CreateEventTask(this, &ButtonDropDownDragTest::Step5)); 118 } 119 120 void Step5() { 121 ASSERT_TRUE(menu_closed_); 122 Done(); 123 } 124 125 private: 126 views::ButtonDropDown* button_; 127 bool menu_shown_; 128 bool menu_closed_; 129}; 130 131#if defined(OS_WIN) 132#define MAYBE_DragActivation DISABLED_DragActivation 133#else 134#define MAYBE_DragActivation DragActivation 135#endif 136VIEW_TEST(ButtonDropDownDragTest, MAYBE_DragActivation) 137