| Index: ui/views/view_unittest.cc
|
| diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
|
| index e9af12ad5a964d0a67207326d15e99dbd2163f12..484ccf5e653be2da161808b195e99ebef81a3b05 100644
|
| --- a/ui/views/view_unittest.cc
|
| +++ b/ui/views/view_unittest.cc
|
| @@ -30,6 +30,7 @@
|
| #include "ui/events/event_utils.h"
|
| #include "ui/events/keycodes/keyboard_codes.h"
|
| #include "ui/events/scoped_target_handler.h"
|
| +#include "ui/events/test/event_generator.h"
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/gfx/path.h"
|
| #include "ui/gfx/transform.h"
|
| @@ -2103,28 +2104,58 @@ bool TestView::AcceleratorPressed(const ui::Accelerator& accelerator) {
|
| return true;
|
| }
|
|
|
| +namespace {
|
| +
|
| +// A Widget with a TestView in the view hierarchy. Used for accelerator tests.
|
| +class TestViewWidget {
|
| + public:
|
| + TestViewWidget(const Widget::InitParams& create_params,
|
| + ui::Accelerator* initial_accelerator,
|
| + bool show_after_init = true)
|
| + : view_(new TestView) {
|
| + view_->Reset();
|
| +
|
| + // Register a keyboard accelerator before the view is added to a window.
|
| + if (initial_accelerator) {
|
| + view_->AddAccelerator(*initial_accelerator);
|
| + EXPECT_EQ(view_->accelerator_count_map_[*initial_accelerator], 0);
|
| + }
|
| +
|
| + // Create a window and add the view as its child.
|
| + Widget::InitParams params = create_params;
|
| + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| + params.bounds = gfx::Rect(0, 0, 100, 100);
|
| + widget_.Init(params);
|
| + View* root = widget_.GetRootView();
|
| + root->AddChildView(view_);
|
| + if (show_after_init)
|
| + widget_.Show();
|
| +
|
| + EXPECT_TRUE(widget_.GetFocusManager());
|
| + }
|
| +
|
| + TestView* view() { return view_; }
|
| + Widget* widget() { return &widget_; }
|
| +
|
| + private:
|
| + TestView* view_;
|
| + Widget widget_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestViewWidget);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| // On non-ChromeOS aura there is extra logic to determine whether a view should
|
| // handle accelerators or not (see View::CanHandleAccelerators for details).
|
| // This test targets that extra logic, but should also work on other platforms.
|
| TEST_F(ViewTest, HandleAccelerator) {
|
| ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
|
| - TestView* view = new TestView();
|
| - view->Reset();
|
| - view->AddAccelerator(return_accelerator);
|
| - EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0);
|
| -
|
| - // Create a window and add the view as its child.
|
| - std::unique_ptr<Widget> widget(new Widget);
|
| - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| - params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - params.bounds = gfx::Rect(0, 0, 100, 100);
|
| - widget->Init(params);
|
| - View* root = widget->GetRootView();
|
| - root->AddChildView(view);
|
| - widget->Show();
|
| -
|
| + TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
|
| + &return_accelerator);
|
| + TestView* view = test_widget.view();
|
| + Widget* widget = test_widget.widget();
|
| FocusManager* focus_manager = widget->GetFocusManager();
|
| - ASSERT_TRUE(focus_manager);
|
|
|
| #if defined(USE_AURA) && !defined(OS_CHROMEOS)
|
| // When a non-child view is not active, it shouldn't handle accelerators.
|
| @@ -2181,30 +2212,63 @@ TEST_F(ViewTest, HandleAccelerator) {
|
| #endif
|
| }
|
|
|
| +// TODO(themblsha): Bring this up on non-Mac platforms. It currently fails
|
| +// because TestView::AcceleratorPressed() is not called. See
|
| +// http://crbug.com/667757.
|
| +#if defined(OS_MACOSX)
|
| +// Test that BridgedContentView correctly handles Accelerator key events when
|
| +// subject to OS event dispatch.
|
| +TEST_F(ViewTest, ActivateAcceleratorOnMac) {
|
| + // Cmd+1 translates to "noop:" command by interpretKeyEvents.
|
| + ui::Accelerator command_accelerator(ui::VKEY_1, ui::EF_COMMAND_DOWN);
|
| + TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
|
| + &command_accelerator);
|
| + TestView* view = test_widget.view();
|
| +
|
| + ui::test::EventGenerator event_generator(
|
| + test_widget.widget()->GetNativeWindow());
|
| + // Emulate normal event dispatch through -[NSWindow sendEvent:].
|
| + event_generator.set_target(ui::test::EventGenerator::Target::WINDOW);
|
| +
|
| + event_generator.PressKey(command_accelerator.key_code(),
|
| + command_accelerator.modifiers());
|
| + event_generator.ReleaseKey(command_accelerator.key_code(),
|
| + command_accelerator.modifiers());
|
| + EXPECT_EQ(view->accelerator_count_map_[command_accelerator], 1);
|
| +
|
| + // Without an _wantsKeyDownForEvent: override we'll only get a keyUp: event
|
| + // for this accelerator.
|
| + ui::Accelerator key_up_accelerator(ui::VKEY_TAB,
|
| + ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN);
|
| + view->AddAccelerator(key_up_accelerator);
|
| + event_generator.PressKey(key_up_accelerator.key_code(),
|
| + key_up_accelerator.modifiers());
|
| + event_generator.ReleaseKey(key_up_accelerator.key_code(),
|
| + key_up_accelerator.modifiers());
|
| + EXPECT_EQ(view->accelerator_count_map_[key_up_accelerator], 1);
|
| +
|
| + // We should handle this accelerator inside keyDown: as it doesn't translate
|
| + // to any command by default.
|
| + ui::Accelerator key_down_accelerator(
|
| + ui::VKEY_L, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN);
|
| + view->AddAccelerator(key_down_accelerator);
|
| + event_generator.PressKey(key_down_accelerator.key_code(),
|
| + key_down_accelerator.modifiers());
|
| + event_generator.ReleaseKey(key_down_accelerator.key_code(),
|
| + key_down_accelerator.modifiers());
|
| + EXPECT_EQ(view->accelerator_count_map_[key_down_accelerator], 1);
|
| +}
|
| +#endif // OS_MACOSX
|
| +
|
| // TODO: these tests were initially commented out when getting aura to
|
| -// run. Figure out if still valuable and either nuke or fix.
|
| -#if 0
|
| +// run. Figure out if still valuable and either nuke or fix. crbug.com/667757.
|
| +#if defined(OS_MACOSX)
|
| TEST_F(ViewTest, ActivateAccelerator) {
|
| - // Register a keyboard accelerator before the view is added to a window.
|
| ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
|
| - TestView* view = new TestView();
|
| - view->Reset();
|
| - view->AddAccelerator(return_accelerator);
|
| - EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0);
|
| -
|
| - // Create a window and add the view as its child.
|
| - std::unique_ptr<Widget> widget(new Widget);
|
| - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - params.bounds = gfx::Rect(0, 0, 100, 100);
|
| - widget->Init(params);
|
| - View* root = widget->GetRootView();
|
| - root->AddChildView(view);
|
| - widget->Show();
|
| -
|
| - // Get the focus manager.
|
| - FocusManager* focus_manager = widget->GetFocusManager();
|
| - ASSERT_TRUE(focus_manager);
|
| + TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
|
| + &return_accelerator);
|
| + TestView* view = test_widget.view();
|
| + FocusManager* focus_manager = test_widget.widget()->GetFocusManager();
|
|
|
| // Hit the return key and see if it takes effect.
|
| EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
|
| @@ -2245,55 +2309,29 @@ TEST_F(ViewTest, ActivateAccelerator) {
|
| EXPECT_FALSE(focus_manager->ProcessAccelerator(escape_accelerator));
|
| EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 2);
|
| EXPECT_EQ(view->accelerator_count_map_[escape_accelerator], 2);
|
| -
|
| - widget->CloseNow();
|
| }
|
|
|
| TEST_F(ViewTest, HiddenViewWithAccelerator) {
|
| ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
|
| - TestView* view = new TestView();
|
| - view->Reset();
|
| - view->AddAccelerator(return_accelerator);
|
| - EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0);
|
| -
|
| - std::unique_ptr<Widget> widget(new Widget);
|
| - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - params.bounds = gfx::Rect(0, 0, 100, 100);
|
| - widget->Init(params);
|
| - View* root = widget->GetRootView();
|
| - root->AddChildView(view);
|
| - widget->Show();
|
| -
|
| - FocusManager* focus_manager = widget->GetFocusManager();
|
| - ASSERT_TRUE(focus_manager);
|
| + TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
|
| + &return_accelerator);
|
| + TestView* view = test_widget.view();
|
| + FocusManager* focus_manager = test_widget.widget()->GetFocusManager();
|
|
|
| view->SetVisible(false);
|
| EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
|
|
|
| view->SetVisible(true);
|
| EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator));
|
| -
|
| - widget->CloseNow();
|
| }
|
|
|
| TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) {
|
| ui::Accelerator return_accelerator(ui::VKEY_RETURN, ui::EF_NONE);
|
| - TestView* view = new TestView();
|
| - view->Reset();
|
| - view->AddAccelerator(return_accelerator);
|
| - EXPECT_EQ(view->accelerator_count_map_[return_accelerator], 0);
|
| -
|
| - std::unique_ptr<Widget> widget(new Widget);
|
| - Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
|
| - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
| - params.bounds = gfx::Rect(0, 0, 100, 100);
|
| - widget->Init(params);
|
| - View* root = widget->GetRootView();
|
| - root->AddChildView(view);
|
| -
|
| - FocusManager* focus_manager = widget->GetFocusManager();
|
| - ASSERT_TRUE(focus_manager);
|
| + TestViewWidget test_widget(CreateParams(Widget::InitParams::TYPE_POPUP),
|
| + &return_accelerator, false);
|
| + TestView* view = test_widget.view();
|
| + Widget* widget = test_widget.widget();
|
| + FocusManager* focus_manager = test_widget.widget()->GetFocusManager();
|
|
|
| EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
|
| EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]);
|
| @@ -2305,10 +2343,12 @@ TEST_F(ViewTest, ViewInHiddenWidgetWithAccelerator) {
|
| widget->Hide();
|
| EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator));
|
| EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]);
|
| -
|
| - widget->CloseNow();
|
| }
|
| +#endif // OS_MACOSX
|
|
|
| +// TODO: these tests were initially commented out when getting aura to
|
| +// run. Figure out if still valuable and either nuke or fix.
|
| +#if 0
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // Mouse-wheel message rerouting
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|