Index: ui/views/view_unittest.cc |
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc |
index 68675c0aa8d0748f74102ea9f7b7e3295d9d9334..a852c77d4ffdda5cb52426863c207b1dc6c93ca7 100644 |
--- a/ui/views/view_unittest.cc |
+++ b/ui/views/view_unittest.cc |
@@ -2101,6 +2101,80 @@ bool TestView::AcceleratorPressed(const ui::Accelerator& accelerator) { |
return true; |
} |
+// 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. |
+ scoped_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); |
+ |
+#if defined(USE_AURA) && !defined(OS_CHROMEOS) |
+ // When a non-child view is not active, it shouldn't handle accelerators. |
+ EXPECT_FALSE(widget->IsActive()); |
+ EXPECT_FALSE(focus_manager->ProcessAccelerator(return_accelerator)); |
+ EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]); |
+#endif |
+ |
+ // When a non-child view is active, it should handle accelerators. |
+ view->accelerator_count_map_[return_accelerator] = 0; |
+ widget->Activate(); |
+ EXPECT_TRUE(widget->IsActive()); |
+ EXPECT_TRUE(focus_manager->ProcessAccelerator(return_accelerator)); |
+ EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); |
+ |
+ // Add a child view associated with a child widget. |
+ TestView* child_view = new TestView(); |
+ child_view->Reset(); |
+ child_view->AddAccelerator(return_accelerator); |
+ EXPECT_EQ(child_view->accelerator_count_map_[return_accelerator], 0); |
+ view->AddChildView(child_view); |
+ Widget* child_widget = new Widget; |
+ Widget::InitParams child_params = |
+ CreateParams(Widget::InitParams::TYPE_CONTROL); |
+ child_params.parent = widget->GetNativeView(); |
+ child_widget->Init(child_params); |
+ child_widget->SetContentsView(child_view); |
+ |
+ FocusManager* child_focus_manager = child_widget->GetFocusManager(); |
+ ASSERT_TRUE(child_focus_manager); |
+ |
+ // When a child view is in focus, it should handle accelerators. |
+ child_view->accelerator_count_map_[return_accelerator] = 0; |
+ view->accelerator_count_map_[return_accelerator] = 0; |
+ child_focus_manager->SetFocusedView(child_view); |
+ EXPECT_FALSE(child_view->GetWidget()->IsActive()); |
+ EXPECT_TRUE(child_focus_manager->ProcessAccelerator(return_accelerator)); |
+ EXPECT_EQ(1, child_view->accelerator_count_map_[return_accelerator]); |
+ EXPECT_EQ(0, view->accelerator_count_map_[return_accelerator]); |
+ |
+#if defined(USE_AURA) && !defined(OS_CHROMEOS) |
+ // When a child view is not in focus, its parent should handle accelerators. |
+ child_view->accelerator_count_map_[return_accelerator] = 0; |
+ view->accelerator_count_map_[return_accelerator] = 0; |
+ child_focus_manager->ClearFocus(); |
+ EXPECT_FALSE(child_view->GetWidget()->IsActive()); |
+ EXPECT_TRUE(child_focus_manager->ProcessAccelerator(return_accelerator)); |
+ EXPECT_EQ(0, child_view->accelerator_count_map_[return_accelerator]); |
+ EXPECT_EQ(1, view->accelerator_count_map_[return_accelerator]); |
+#endif |
+} |
+ |
// TODO: these tests were initially commented out when getting aura to |
// run. Figure out if still valuable and either nuke or fix. |
#if 0 |