summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/views/menu_test_base.cc
blob: c06ebfe1e3670dcb1b3fe8b9c0229c6105ab90c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/views/menu_test_base.h"
#include "chrome/test/base/interactive_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
#include "ui/aura/window.h"
#include "ui/base/test/ui_controls.h"
#include "ui/views/controls/button/menu_button.h"
#include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/menu_runner.h"

MenuTestBase::MenuTestBase()
    : ViewEventTestBase(),
      button_(NULL),
      menu_(NULL),
      last_command_(0) {
}

MenuTestBase::~MenuTestBase() {
}

void MenuTestBase::Click(views::View* view, const base::Closure& next) {
  ui_test_utils::MoveMouseToCenterAndPress(
      view,
      ui_controls::LEFT,
      ui_controls::DOWN | ui_controls::UP,
      next);
}

void MenuTestBase::KeyPress(ui::KeyboardCode keycode,
                            const base::Closure& next) {
  ui_controls::SendKeyPressNotifyWhenDone(
      GetWidget()->GetNativeView()->GetRootWindow(), keycode, false, false,
      false, false, next);
}

int MenuTestBase::GetMenuRunnerFlags() {
  return views::MenuRunner::HAS_MNEMONICS;
}

void MenuTestBase::SetUp() {
  button_ = new views::MenuButton(
      NULL, base::ASCIIToUTF16("Menu Test"), this, true);
  menu_ = new views::MenuItemView(this);
  BuildMenu(menu_);
  menu_runner_.reset(new views::MenuRunner(menu_, GetMenuRunnerFlags()));

  ViewEventTestBase::SetUp();
}

void MenuTestBase::TearDown() {
  // We cancel the menu first because certain operations (like a menu opened
  // with views::MenuRunner::FOR_DROP) don't take kindly to simply pulling the
  // runner out from under them.
  menu_runner_->Cancel();

  menu_runner_.reset();
  menu_ = NULL;
  ViewEventTestBase::TearDown();
}

views::View* MenuTestBase::CreateContentsView() {
  return button_;
}

void MenuTestBase::DoTestOnMessageLoop() {
  Click(button_, CreateEventTask(this, &MenuTestBase::DoTestWithMenuOpen));
}

gfx::Size MenuTestBase::GetPreferredSize() const {
  return button_->GetPreferredSize();
}

void MenuTestBase::OnMenuButtonClicked(views::View* source,
                                       const gfx::Point& point) {
  gfx::Point screen_location;
  views::View::ConvertPointToScreen(source, &screen_location);
  gfx::Rect bounds(screen_location, source->size());
  ignore_result(menu_runner_->RunMenuAt(source->GetWidget(),
                                        button_,
                                        bounds,
                                        views::MENU_ANCHOR_TOPLEFT,
                                        ui::MENU_SOURCE_NONE));
}

void MenuTestBase::ExecuteCommand(int id) {
  last_command_ = id;
}