Home | History | Annotate | Download | only in views
      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