menu_test_base.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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
14MenuTestBase::MenuTestBase()
15    : ViewEventTestBase(),
16      button_(NULL),
17      menu_(NULL),
18      last_command_(0) {
19}
20
21MenuTestBase::~MenuTestBase() {
22}
23
24void 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
32void 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
39int MenuTestBase::GetMenuRunnerFlags() {
40  return views::MenuRunner::HAS_MNEMONICS;
41}
42
43void 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
53void 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
64views::View* MenuTestBase::CreateContentsView() {
65  return button_;
66}
67
68void MenuTestBase::DoTestOnMessageLoop() {
69  Click(button_, CreateEventTask(this, &MenuTestBase::DoTestWithMenuOpen));
70}
71
72gfx::Size MenuTestBase::GetPreferredSize() const {
73  return button_->GetPreferredSize();
74}
75
76void 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
88void MenuTestBase::ExecuteCommand(int id) {
89  last_command_ = id;
90}
91