| Index: ui/views/controls/menu/menu_controller_unittest.cc
|
| diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc
|
| index 4ace55d947b329b352265004ea73d5f6099aa4f5..9aa008f83f93c6dbe77eec08f7b9cc2d03bdc19f 100644
|
| --- a/ui/views/controls/menu/menu_controller_unittest.cc
|
| +++ b/ui/views/controls/menu/menu_controller_unittest.cc
|
| @@ -4,34 +4,26 @@
|
|
|
| #include "ui/views/controls/menu/menu_controller.h"
|
|
|
| -#include "base/run_loop.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "ui/aura/scoped_window_targeter.h"
|
| +#include "ui/aura/window.h"
|
| #include "ui/events/event_handler.h"
|
| #include "ui/events/null_event_targeter.h"
|
| -#include "ui/events/platform/platform_event_source.h"
|
| -#include "ui/events/test/platform_event_source_test_api.h"
|
| +#include "ui/events/test/event_generator.h"
|
| #include "ui/views/controls/menu/menu_item_view.h"
|
| #include "ui/views/controls/menu/submenu_view.h"
|
| #include "ui/views/test/views_test_base.h"
|
|
|
| #if defined(USE_AURA)
|
| -#include "ui/aura/env.h"
|
| #include "ui/aura/scoped_window_targeter.h"
|
| #include "ui/aura/window.h"
|
| -#include "ui/wm/public/dispatcher_client.h"
|
| #endif
|
|
|
| -#if defined(OS_WIN)
|
| -#include "base/message_loop/message_pump_dispatcher.h"
|
| -#elif defined(USE_X11)
|
| +#if defined(USE_X11)
|
| #include <X11/Xlib.h>
|
| #undef Bool
|
| #undef None
|
| #include "ui/events/test/events_test_utils_x11.h"
|
| -#elif defined(USE_OZONE)
|
| -#include "ui/events/event.h"
|
| -#elif defined(OS_MACOSX)
|
| -#include "ui/events/test/event_generator.h"
|
| #endif
|
|
|
| namespace views {
|
| @@ -39,15 +31,6 @@ namespace test {
|
|
|
| namespace {
|
|
|
| -class TestMenuItemView : public MenuItemView {
|
| - public:
|
| - TestMenuItemView() : MenuItemView(nullptr) {}
|
| - ~TestMenuItemView() override {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(TestMenuItemView);
|
| -};
|
| -
|
| class SubmenuViewShown : public SubmenuView {
|
| public:
|
| SubmenuViewShown(MenuItemView* parent) : SubmenuView(parent) {}
|
| @@ -58,43 +41,30 @@ class SubmenuViewShown : public SubmenuView {
|
| DISALLOW_COPY_AND_ASSIGN(SubmenuViewShown);
|
| };
|
|
|
| -#if defined(USE_AURA)
|
| -class TestDispatcherClient : public aura::client::DispatcherClient {
|
| +class TestEventHandler : public ui::EventHandler {
|
| public:
|
| - TestDispatcherClient() : dispatcher_(nullptr) {}
|
| - ~TestDispatcherClient() override {}
|
| + TestEventHandler() : outstanding_touches_(0) {}
|
|
|
| - base::MessagePumpDispatcher* dispatcher() {
|
| - return dispatcher_;
|
| + void OnTouchEvent(ui::TouchEvent* event) override {
|
| + switch(event->type()) {
|
| + case ui::ET_TOUCH_PRESSED:
|
| + outstanding_touches_++;
|
| + break;
|
| + case ui::ET_TOUCH_RELEASED:
|
| + case ui::ET_TOUCH_CANCELLED:
|
| + outstanding_touches_--;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| }
|
|
|
| - // aura::client::DispatcherClient:
|
| - void PrepareNestedLoopClosures(base::MessagePumpDispatcher* dispatcher,
|
| - base::Closure* run_closure,
|
| - base::Closure* quit_closure) override {
|
| - scoped_ptr<base::RunLoop> run_loop(new base::RunLoop());
|
| - *quit_closure = run_loop->QuitClosure();
|
| - *run_closure = base::Bind(&TestDispatcherClient::RunNestedDispatcher,
|
| - base::Unretained(this),
|
| - base::Passed(&run_loop),
|
| - dispatcher);
|
| - }
|
| + int outstanding_touches() const { return outstanding_touches_; }
|
|
|
| private:
|
| - void RunNestedDispatcher(scoped_ptr<base::RunLoop> run_loop,
|
| - base::MessagePumpDispatcher* dispatcher) {
|
| - base::AutoReset<base::MessagePumpDispatcher*> reset_dispatcher(&dispatcher_,
|
| - dispatcher);
|
| - base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
|
| - base::MessageLoop::ScopedNestableTaskAllower allow(loop);
|
| - run_loop->Run();
|
| - }
|
| -
|
| - base::MessagePumpDispatcher* dispatcher_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TestDispatcherClient);
|
| + int outstanding_touches_;
|
| + DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
|
| };
|
| -#endif // USE_AURA
|
|
|
| } // namespace
|
|
|
| @@ -111,373 +81,279 @@ class TestMenuItemViewShown : public MenuItemView {
|
|
|
| class MenuControllerTest : public ViewsTestBase {
|
| public:
|
| - MenuControllerTest()
|
| - : controller_(nullptr),
|
| - event_source_(ui::PlatformEventSource::GetInstance()) {}
|
| - ~MenuControllerTest() override { ResetMenuController(); }
|
| -
|
| - // Dispatches |count| number of items, each in a separate iteration of the
|
| - // message-loop, by posting a task.
|
| - void Step3_DispatchEvents(int count) {
|
| - base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
|
| - base::MessageLoop::ScopedNestableTaskAllower allow(loop);
|
| - controller_->exit_type_ = MenuController::EXIT_ALL;
|
| -
|
| - DispatchEvent();
|
| - if (count) {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MenuControllerTest::Step3_DispatchEvents,
|
| - base::Unretained(this),
|
| - count - 1));
|
| - } else {
|
| - EXPECT_TRUE(run_loop_->running());
|
| - run_loop_->Quit();
|
| - }
|
| + MenuControllerTest() : menu_controller_(nullptr) {
|
| }
|
|
|
| - // Runs a nested message-loop that does not involve the menu itself.
|
| - void Step2_RunNestedLoop() {
|
| - base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
|
| - base::MessageLoop::ScopedNestableTaskAllower allow(loop);
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MenuControllerTest::Step3_DispatchEvents,
|
| - base::Unretained(this),
|
| - 3));
|
| - run_loop_.reset(new base::RunLoop());
|
| - run_loop_->Run();
|
| + ~MenuControllerTest() override {}
|
| +
|
| + // ViewsTestBase:
|
| + void SetUp() override {
|
| + ViewsTestBase::SetUp();
|
| + Init();
|
| }
|
|
|
| - void Step1_RunMenu() {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MenuControllerTest::Step2_RunNestedLoop,
|
| - base::Unretained(this)));
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| - RunMenu(owner.get());
|
| + void TearDown() override {
|
| + owner_->CloseNow();
|
| +
|
| + menu_controller_->showing_ = false;
|
| + menu_controller_->owner_ = nullptr;
|
| + delete menu_controller_;
|
| + menu_controller_ = nullptr;
|
| +
|
| + ViewsTestBase::TearDown();
|
| }
|
|
|
| - scoped_ptr<Widget> CreateOwnerWidget() {
|
| - scoped_ptr<Widget> widget(new Widget);
|
| - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - widget->Init(params);
|
| - widget->Show();
|
| + void ReleaseTouchId(int id) {
|
| + event_generator_->ReleaseTouchId(id);
|
| + }
|
|
|
| -#if defined(USE_AURA)
|
| - aura::client::SetDispatcherClient(
|
| - widget->GetNativeWindow()->GetRootWindow(), &dispatcher_client_);
|
| -#endif
|
| - return widget.Pass();
|
| + void PressKey(ui::KeyboardCode key_code) {
|
| + event_generator_->PressKey(key_code, 0);
|
| }
|
|
|
| - const MenuItemView* pending_state_item() const {
|
| - return controller_->pending_state_.item;
|
| +#if defined(OS_LINUX) && defined(USE_X11)
|
| + void TestEventTargeter() {
|
| + {
|
| + // With the |ui::NullEventTargeter| instantiated and assigned we expect
|
| + // the menu to not handle the key event.
|
| + aura::ScopedWindowTargeter scoped_targeter(
|
| + owner()->GetNativeWindow()->GetRootWindow(),
|
| + scoped_ptr<ui::EventTargeter>(new ui::NullEventTargeter));
|
| + event_generator_->PressKey(ui::VKEY_ESCAPE, 0);
|
| + EXPECT_EQ(MenuController::EXIT_NONE, menu_exit_type());
|
| + }
|
| + // Now that the targeter has been destroyed, expect to exit the menu
|
| + // normally when hitting escape.
|
| + event_generator_->PressKey(ui::VKEY_ESCAPE, 0);
|
| + EXPECT_EQ(MenuController::EXIT_OUTERMOST, menu_exit_type());
|
| }
|
| +#endif // defined(OS_LINUX) && defined(USE_X11)
|
|
|
| + protected:
|
| void SetPendingStateItem(MenuItemView* item) {
|
| - controller_->pending_state_.item = item;
|
| - controller_->pending_state_.submenu_open = true;
|
| + menu_controller_->pending_state_.item = item;
|
| + menu_controller_->pending_state_.submenu_open = true;
|
| }
|
|
|
| void ResetSelection() {
|
| - controller_->SetSelection(nullptr,
|
| - MenuController::SELECTION_EXIT |
|
| - MenuController::SELECTION_UPDATE_IMMEDIATELY);
|
| + menu_controller_->SetSelection(
|
| + nullptr,
|
| + MenuController::SELECTION_EXIT |
|
| + MenuController::SELECTION_UPDATE_IMMEDIATELY);
|
| }
|
|
|
| void IncrementSelection() {
|
| - controller_->IncrementSelection(MenuController::INCREMENT_SELECTION_DOWN);
|
| + menu_controller_->IncrementSelection(
|
| + MenuController::INCREMENT_SELECTION_DOWN);
|
| }
|
|
|
| void DecrementSelection() {
|
| - controller_->IncrementSelection(MenuController::INCREMENT_SELECTION_UP);
|
| + menu_controller_->IncrementSelection(
|
| + MenuController::INCREMENT_SELECTION_UP);
|
| }
|
|
|
| MenuItemView* FindInitialSelectableMenuItemDown(MenuItemView* parent) {
|
| - return controller_->FindInitialSelectableMenuItem(
|
| + return menu_controller_->FindInitialSelectableMenuItem(
|
| parent, MenuController::INCREMENT_SELECTION_DOWN);
|
| }
|
|
|
| MenuItemView* FindInitialSelectableMenuItemUp(MenuItemView* parent) {
|
| - return controller_->FindInitialSelectableMenuItem(
|
| + return menu_controller_->FindInitialSelectableMenuItem(
|
| parent, MenuController::INCREMENT_SELECTION_UP);
|
| }
|
|
|
| MenuItemView* FindNextSelectableMenuItem(MenuItemView* parent,
|
| int index) {
|
| - return controller_->FindNextSelectableMenuItem(
|
| +
|
| + return menu_controller_->FindNextSelectableMenuItem(
|
| parent, index, MenuController::INCREMENT_SELECTION_DOWN);
|
| }
|
|
|
| MenuItemView* FindPreviousSelectableMenuItem(MenuItemView* parent,
|
| int index) {
|
| - return controller_->FindNextSelectableMenuItem(
|
| + return menu_controller_->FindNextSelectableMenuItem(
|
| parent, index, MenuController::INCREMENT_SELECTION_UP);
|
| }
|
|
|
| - void SetupMenu(views::Widget* owner, views::MenuItemView* item) {
|
| - ResetMenuController();
|
| - controller_ = new MenuController(nullptr, true, nullptr);
|
| - controller_->owner_ = owner;
|
| - controller_->showing_ = true;
|
| - controller_->SetSelection(item,
|
| - MenuController::SELECTION_UPDATE_IMMEDIATELY);
|
| + void RunMenu() {
|
| + menu_controller_->RunMessageLoop(false);
|
| }
|
|
|
| - void RunMenu(views::Widget* owner) {
|
| - scoped_ptr<TestMenuItemView> menu_item(new TestMenuItemView);
|
| - SetupMenu(owner, menu_item.get());
|
| - controller_->RunMessageLoop(false);
|
| + Widget* owner() { return owner_.get(); }
|
| + ui::test::EventGenerator* event_generator() { return event_generator_.get(); }
|
| + TestMenuItemViewShown* menu_item() { return menu_item_.get(); }
|
| + MenuController* menu_controller() { return menu_controller_; }
|
| + const MenuItemView* pending_state_item() const {
|
| + return menu_controller_->pending_state_.item;
|
| }
|
| -
|
| -#if defined(USE_X11)
|
| - void DispatchEscapeAndExpect(MenuController::ExitType exit_type) {
|
| - ui::ScopedXI2Event key_event;
|
| - key_event.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, 0);
|
| - event_source_.Dispatch(key_event);
|
| - EXPECT_EQ(exit_type, controller_->exit_type());
|
| - controller_->exit_type_ = MenuController::EXIT_ALL;
|
| - DispatchEvent();
|
| + MenuController::ExitType menu_exit_type() const {
|
| + return menu_controller_->exit_type_;
|
| }
|
|
|
| - void DispatchTouch(int evtype, int id) {
|
| - ui::ScopedXI2Event touch_event;
|
| - std::vector<ui::Valuator> valuators;
|
| - touch_event.InitTouchEvent(1, evtype, id, gfx::Point(10, 10), valuators);
|
| - event_source_.Dispatch(touch_event);
|
| - DispatchEvent();
|
| + private:
|
| + void Init() {
|
| + owner_.reset(new Widget);
|
| + Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| + owner_->Init(params);
|
| + event_generator_.reset(
|
| + new ui::test::EventGenerator(GetContext(), owner_->GetNativeWindow()));
|
| + owner_->Show();
|
| +
|
| + SetupMenuItem();
|
| +
|
| + SetupMenuController();
|
| }
|
| -#endif
|
|
|
| - void DispatchEvent() {
|
| -#if defined(USE_X11)
|
| - XEvent xevent;
|
| - memset(&xevent, 0, sizeof(xevent));
|
| - event_source_.Dispatch(&xevent);
|
| -#elif defined(OS_WIN)
|
| - MSG msg;
|
| - memset(&msg, 0, sizeof(MSG));
|
| - dispatcher_client_.dispatcher()->Dispatch(msg);
|
| -#elif defined(USE_OZONE)
|
| - ui::KeyEvent event(' ', ui::VKEY_SPACE, ui::EF_NONE);
|
| - event_source_.Dispatch(&event);
|
| -#elif defined(OS_MACOSX) && !defined(USE_AURA)
|
| - // Since this is not an interactive test, on Mac there will be no key
|
| - // window. Any system event will just get ignored, so use the EventGenerator
|
| - // to generate a dummy event. Without Aura, these will be native events.
|
| - gfx::NativeWindow window = controller_->owner()->GetNativeWindow();
|
| - ui::test::EventGenerator generator(window, window);
|
| - // Send "up", since this will not activate a menu item. But note that the
|
| - // test has already set exit_type_ = EXIT_ALL just before the first call
|
| - // to this function.
|
| - generator.PressKey(ui::VKEY_UP, 0);
|
| -#else
|
| -#error Unsupported platform
|
| -#endif
|
| + void SetupMenuItem() {
|
| + menu_item_.reset(new TestMenuItemViewShown);
|
| + menu_item_->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One"));
|
| + menu_item_->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two"));
|
| + menu_item_->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("Three"));
|
| + menu_item_->AppendMenuItemWithLabel(4, base::ASCIIToUTF16("Four"));
|
| }
|
|
|
| - private:
|
| - void ResetMenuController() {
|
| - if (controller_) {
|
| - // These properties are faked by RunMenu for the purposes of testing and
|
| - // need to be undone before we call the destructor.
|
| - controller_->owner_ = nullptr;
|
| - controller_->showing_ = false;
|
| - delete controller_;
|
| - controller_ = nullptr;
|
| - }
|
| + void SetupMenuController() {
|
| + menu_controller_= new MenuController(nullptr, true, nullptr);
|
| + menu_controller_->owner_ = owner_.get();
|
| + menu_controller_->showing_ = true;
|
| + menu_controller_->SetSelection(
|
| + menu_item_.get(), MenuController::SELECTION_UPDATE_IMMEDIATELY);
|
| }
|
|
|
| - // A weak pointer to the MenuController owned by this class.
|
| - MenuController* controller_;
|
| - scoped_ptr<base::RunLoop> run_loop_;
|
| - ui::test::PlatformEventSourceTestAPI event_source_;
|
| -#if defined(USE_AURA)
|
| - TestDispatcherClient dispatcher_client_;
|
| -#endif
|
| + scoped_ptr<Widget> owner_;
|
| + scoped_ptr<ui::test::EventGenerator> event_generator_;
|
| + scoped_ptr<TestMenuItemViewShown> menu_item_;
|
| + MenuController* menu_controller_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MenuControllerTest);
|
| };
|
|
|
| -TEST_F(MenuControllerTest, Basic) {
|
| - base::MessageLoop::ScopedNestableTaskAllower allow_nested(
|
| - base::MessageLoop::current());
|
| - message_loop()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MenuControllerTest::Step1_RunMenu, base::Unretained(this)));
|
| -}
|
| -
|
| #if defined(OS_LINUX) && defined(USE_X11)
|
| // Tests that an event targeter which blocks events will be honored by the menu
|
| // event dispatcher.
|
| TEST_F(MenuControllerTest, EventTargeter) {
|
| - {
|
| - // Verify that the menu handles the escape key under normal circumstances.
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| - message_loop()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MenuControllerTest::DispatchEscapeAndExpect,
|
| - base::Unretained(this),
|
| - MenuController::EXIT_OUTERMOST));
|
| - RunMenu(owner.get());
|
| - }
|
| -
|
| - {
|
| - // With the NULL targeter instantiated and assigned we expect the menu to
|
| - // not handle the key event.
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| - aura::ScopedWindowTargeter scoped_targeter(
|
| - owner->GetNativeWindow()->GetRootWindow(),
|
| - scoped_ptr<ui::EventTargeter>(new ui::NullEventTargeter));
|
| - message_loop()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MenuControllerTest::DispatchEscapeAndExpect,
|
| - base::Unretained(this),
|
| - MenuController::EXIT_NONE));
|
| - RunMenu(owner.get());
|
| - }
|
| + base::MessageLoopForUI::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&MenuControllerTest::TestEventTargeter,
|
| + base::Unretained(this)));
|
| + RunMenu();
|
| }
|
| -#endif
|
| +#endif // defined(OS_LINUX) && defined(USE_X11)
|
|
|
| #if defined(USE_X11)
|
| -
|
| -class TestEventHandler : public ui::EventHandler {
|
| - public:
|
| - TestEventHandler() : outstanding_touches_(0) {}
|
| -
|
| - void OnTouchEvent(ui::TouchEvent* event) override {
|
| - switch(event->type()) {
|
| - case ui::ET_TOUCH_PRESSED:
|
| - outstanding_touches_++;
|
| - break;
|
| - case ui::ET_TOUCH_RELEASED:
|
| - case ui::ET_TOUCH_CANCELLED:
|
| - outstanding_touches_--;
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - }
|
| -
|
| - int outstanding_touches() const { return outstanding_touches_; }
|
| -
|
| - private:
|
| - int outstanding_touches_;
|
| -};
|
| -
|
| // Tests that touch event ids are released correctly. See crbug.com/439051 for
|
| // details. When the ids aren't managed correctly, we get stuck down touches.
|
| TEST_F(MenuControllerTest, TouchIdsReleasedCorrectly) {
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| TestEventHandler test_event_handler;
|
| - owner->GetNativeWindow()->GetRootWindow()->AddPreTargetHandler(
|
| + owner()->GetNativeWindow()->GetRootWindow()->AddPreTargetHandler(
|
| &test_event_handler);
|
|
|
| std::vector<int> devices;
|
| devices.push_back(1);
|
| ui::SetUpTouchDevicesForTest(devices);
|
|
|
| - DispatchTouch(XI_TouchBegin, 0);
|
| - DispatchTouch(XI_TouchBegin, 1);
|
| - DispatchTouch(XI_TouchEnd, 0);
|
| + event_generator()->PressTouchId(0);
|
| + event_generator()->PressTouchId(1);
|
| + event_generator()->ReleaseTouchId(0);
|
|
|
| - message_loop()->PostTask(FROM_HERE,
|
| - base::Bind(&MenuControllerTest::DispatchTouch,
|
| - base::Unretained(this), XI_TouchEnd, 1));
|
| + base::MessageLoopForUI::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&MenuControllerTest::ReleaseTouchId,
|
| + base::Unretained(this),
|
| + 1));
|
|
|
| - message_loop()->PostTask(
|
| + base::MessageLoopForUI::current()->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&MenuControllerTest::DispatchEscapeAndExpect,
|
| - base::Unretained(this), MenuController::EXIT_OUTERMOST));
|
| + base::Bind(&MenuControllerTest::PressKey,
|
| + base::Unretained(this),
|
| + ui::VKEY_ESCAPE));
|
| +
|
| + RunMenu();
|
|
|
| - RunMenu(owner.get());
|
| + EXPECT_EQ(MenuController::EXIT_OUTERMOST, menu_exit_type());
|
| EXPECT_EQ(0, test_event_handler.outstanding_touches());
|
|
|
| - owner->GetNativeWindow()->GetRootWindow()->RemovePreTargetHandler(
|
| + owner()->GetNativeWindow()->GetRootWindow()->RemovePreTargetHandler(
|
| &test_event_handler);
|
| }
|
| -#endif // defined(USE_X11)
|
| +#endif // defined(USE_X11)
|
|
|
| // Tests that initial selected menu items are correct when items are enabled or
|
| // disabled.
|
| TEST_F(MenuControllerTest, InitialSelectedItem) {
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| - scoped_ptr<TestMenuItemView> menu_item(new TestMenuItemView);
|
| - menu_item->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One"));
|
| - menu_item->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two"));
|
| - menu_item->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("Three"));
|
| - SetupMenu(owner.get(), menu_item.get());
|
| -
|
| - // Leave items "Two" and "Three" enabled.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false);
|
| + // Leave items "Two", "Three", and "Four" enabled.
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false);
|
| // The first selectable item should be item "Two".
|
| MenuItemView* first_selectable =
|
| - FindInitialSelectableMenuItemDown(menu_item.get());
|
| + FindInitialSelectableMenuItemDown(menu_item());
|
| ASSERT_NE(nullptr, first_selectable);
|
| EXPECT_EQ(2, first_selectable->GetCommand());
|
| - // The last selectable item should be item "Three".
|
| + // The last selectable item should be item "Four".
|
| MenuItemView* last_selectable =
|
| - FindInitialSelectableMenuItemUp(menu_item.get());
|
| + FindInitialSelectableMenuItemUp(menu_item());
|
| ASSERT_NE(nullptr, last_selectable);
|
| - EXPECT_EQ(3, last_selectable->GetCommand());
|
| + EXPECT_EQ(4, last_selectable->GetCommand());
|
|
|
| // Leave items "One" and "Two" enabled.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(true);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(true);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(true);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(true);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false);
|
| // The first selectable item should be item "One".
|
| - first_selectable = FindInitialSelectableMenuItemDown(menu_item.get());
|
| + first_selectable = FindInitialSelectableMenuItemDown(menu_item());
|
| ASSERT_NE(nullptr, first_selectable);
|
| EXPECT_EQ(1, first_selectable->GetCommand());
|
| // The last selectable item should be item "Two".
|
| - last_selectable = FindInitialSelectableMenuItemUp(menu_item.get());
|
| + last_selectable = FindInitialSelectableMenuItemUp(menu_item());
|
| ASSERT_NE(nullptr, last_selectable);
|
| EXPECT_EQ(2, last_selectable->GetCommand());
|
|
|
| // Leave only a single item "One" enabled.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(true);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(false);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(true);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false);
|
| // The first selectable item should be item "One".
|
| - first_selectable = FindInitialSelectableMenuItemDown(menu_item.get());
|
| + first_selectable = FindInitialSelectableMenuItemDown(menu_item());
|
| ASSERT_NE(nullptr, first_selectable);
|
| EXPECT_EQ(1, first_selectable->GetCommand());
|
| // The last selectable item should be item "One".
|
| - last_selectable = FindInitialSelectableMenuItemUp(menu_item.get());
|
| + last_selectable = FindInitialSelectableMenuItemUp(menu_item());
|
| ASSERT_NE(nullptr, last_selectable);
|
| EXPECT_EQ(1, last_selectable->GetCommand());
|
|
|
| // Leave only a single item "Three" enabled.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(false);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(true);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(true);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false);
|
| // The first selectable item should be item "Three".
|
| - first_selectable = FindInitialSelectableMenuItemDown(menu_item.get());
|
| + first_selectable = FindInitialSelectableMenuItemDown(menu_item());
|
| ASSERT_NE(nullptr, first_selectable);
|
| EXPECT_EQ(3, first_selectable->GetCommand());
|
| // The last selectable item should be item "Three".
|
| - last_selectable = FindInitialSelectableMenuItemUp(menu_item.get());
|
| + last_selectable = FindInitialSelectableMenuItemUp(menu_item());
|
| ASSERT_NE(nullptr, last_selectable);
|
| EXPECT_EQ(3, last_selectable->GetCommand());
|
|
|
| // Leave only a single item ("Two") selected. It should be the first and the
|
| // last selectable item.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(true);
|
| - menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| - first_selectable = FindInitialSelectableMenuItemDown(menu_item.get());
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(0)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(1)->SetEnabled(true);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false);
|
| + first_selectable = FindInitialSelectableMenuItemDown(menu_item());
|
| ASSERT_NE(nullptr, first_selectable);
|
| EXPECT_EQ(2, first_selectable->GetCommand());
|
| - last_selectable = FindInitialSelectableMenuItemUp(menu_item.get());
|
| + last_selectable = FindInitialSelectableMenuItemUp(menu_item());
|
| ASSERT_NE(nullptr, last_selectable);
|
| EXPECT_EQ(2, last_selectable->GetCommand());
|
|
|
| // There should be no next or previous selectable item since there is only a
|
| // single enabled item in the menu.
|
| - EXPECT_EQ(nullptr, FindNextSelectableMenuItem(menu_item.get(), 1));
|
| - EXPECT_EQ(nullptr, FindPreviousSelectableMenuItem(menu_item.get(), 1));
|
| + EXPECT_EQ(nullptr, FindNextSelectableMenuItem(menu_item(), 1));
|
| + EXPECT_EQ(nullptr, FindPreviousSelectableMenuItem(menu_item(), 1));
|
|
|
| // Clear references in menu controller to the menu item that is going away.
|
| ResetSelection();
|
| @@ -486,19 +362,11 @@ TEST_F(MenuControllerTest, InitialSelectedItem) {
|
| // Tests that opening menu and pressing 'Down' and 'Up' iterates over enabled
|
| // items.
|
| TEST_F(MenuControllerTest, NextSelectedItem) {
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| - scoped_ptr<TestMenuItemView> menu_item(new TestMenuItemView);
|
| - menu_item->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One"));
|
| - menu_item->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two"));
|
| - menu_item->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("Three"));
|
| - menu_item->AppendMenuItemWithLabel(4, base::ASCIIToUTF16("Four"));
|
| // Disabling the item "Three" gets it skipped when using keyboard to navigate.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
| -
|
| - SetupMenu(owner.get(), menu_item.get());
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(2)->SetEnabled(false);
|
|
|
| // Fake initial hot selection.
|
| - SetPendingStateItem(menu_item->GetSubmenu()->GetMenuItemAt(0));
|
| + SetPendingStateItem(menu_item()->GetSubmenu()->GetMenuItemAt(0));
|
| EXPECT_EQ(1, pending_state_item()->GetCommand());
|
|
|
| // Move down in the menu.
|
| @@ -533,19 +401,11 @@ TEST_F(MenuControllerTest, NextSelectedItem) {
|
|
|
| // Tests that opening menu and pressing 'Up' selects the last enabled menu item.
|
| TEST_F(MenuControllerTest, PreviousSelectedItem) {
|
| - scoped_ptr<Widget> owner(CreateOwnerWidget());
|
| - scoped_ptr<TestMenuItemViewShown> menu_item(new TestMenuItemViewShown);
|
| - menu_item->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One"));
|
| - menu_item->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two"));
|
| - menu_item->AppendMenuItemWithLabel(3, base::ASCIIToUTF16("Three"));
|
| - menu_item->AppendMenuItemWithLabel(4, base::ASCIIToUTF16("Four"));
|
| // Disabling the item "Four" gets it skipped when using keyboard to navigate.
|
| - menu_item->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false);
|
| -
|
| - SetupMenu(owner.get(), menu_item.get());
|
| + menu_item()->GetSubmenu()->GetMenuItemAt(3)->SetEnabled(false);
|
|
|
| // Fake initial root item selection and submenu showing.
|
| - SetPendingStateItem(menu_item.get());
|
| + SetPendingStateItem(menu_item());
|
| EXPECT_EQ(0, pending_state_item()->GetCommand());
|
|
|
| // Move up and select a previous (in our case the last enabled) item.
|
|
|