1 // Copyright 2014 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/strings/utf_string_conversions.h" 6 #include "chrome/browser/ui/views/menu_test_base.h" 7 #include "chrome/test/base/interactive_test_utils.h" 8 #include "chrome/test/base/ui_test_utils.h" 9 #include "ui/base/test/ui_controls.h" 10 #include "ui/views/controls/button/menu_button.h" 11 #include "ui/views/controls/menu/menu_item_view.h" 12 #include "ui/views/controls/menu/menu_runner.h" 13 14 MenuTestBase::MenuTestBase() 15 : ViewEventTestBase(), 16 button_(NULL), 17 menu_(NULL), 18 last_command_(0) { 19 } 20 21 MenuTestBase::~MenuTestBase() { 22 } 23 24 void MenuTestBase::Click(views::View* view, const base::Closure& next) { 25 ui_test_utils::MoveMouseToCenterAndPress( 26 view, 27 ui_controls::LEFT, 28 ui_controls::DOWN | ui_controls::UP, 29 next); 30 } 31 32 void MenuTestBase::KeyPress(ui::KeyboardCode keycode, 33 const base::Closure& next) { 34 ui_controls::SendKeyPressNotifyWhenDone( 35 GetWidget()->GetNativeWindow(), keycode, false, false, 36 false, false, next); 37 } 38 39 int MenuTestBase::GetMenuRunnerFlags() { 40 return views::MenuRunner::HAS_MNEMONICS; 41 } 42 43 void MenuTestBase::SetUp() { 44 button_ = new views::MenuButton( 45 NULL, base::ASCIIToUTF16("Menu Test"), this, true); 46 menu_ = new views::MenuItemView(this); 47 BuildMenu(menu_); 48 menu_runner_.reset(new views::MenuRunner(menu_, GetMenuRunnerFlags())); 49 50 ViewEventTestBase::SetUp(); 51 } 52 53 void MenuTestBase::TearDown() { 54 // We cancel the menu first because certain operations (like a menu opened 55 // with views::MenuRunner::FOR_DROP) don't take kindly to simply pulling the 56 // runner out from under them. 57 menu_runner_->Cancel(); 58 59 menu_runner_.reset(); 60 menu_ = NULL; 61 ViewEventTestBase::TearDown(); 62 } 63 64 views::View* MenuTestBase::CreateContentsView() { 65 return button_; 66 } 67 68 void MenuTestBase::DoTestOnMessageLoop() { 69 Click(button_, CreateEventTask(this, &MenuTestBase::DoTestWithMenuOpen)); 70 } 71 72 gfx::Size MenuTestBase::GetPreferredSize() const { 73 return button_->GetPreferredSize(); 74 } 75 76 void MenuTestBase::OnMenuButtonClicked(views::View* source, 77 const gfx::Point& point) { 78 gfx::Point screen_location; 79 views::View::ConvertPointToScreen(source, &screen_location); 80 gfx::Rect bounds(screen_location, source->size()); 81 ignore_result(menu_runner_->RunMenuAt(source->GetWidget(), 82 button_, 83 bounds, 84 views::MENU_ANCHOR_TOPLEFT, 85 ui::MENU_SOURCE_NONE)); 86 } 87 88 void MenuTestBase::ExecuteCommand(int id) { 89 last_command_ = id; 90 } 91