diff options
-rw-r--r-- | ash/ash.gyp | 7 | ||||
-rw-r--r-- | ash/focus_cycler_unittest.cc | 126 | ||||
-rw-r--r-- | ash/status_area/status_area_view.cc | 8 | ||||
-rw-r--r-- | ash/status_area/status_area_view.h | 8 |
4 files changed, 147 insertions, 2 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp index fa3b733..1919b84 100644 --- a/ash/ash.gyp +++ b/ash/ash.gyp @@ -249,6 +249,7 @@ 'accelerators/accelerator_controller_unittest.cc', 'accelerators/accelerator_filter_unittest.cc', 'drag_drop/drag_drop_controller_unittest.cc', + 'focus_cycler_unittest.cc', 'ime/input_method_event_filter_unittest.cc', 'launcher/launcher_model_unittest.cc', 'launcher/launcher_unittest.cc', @@ -297,6 +298,12 @@ '../build/linux/system.gyp:ibus', ], }], + ['OS=="win"', { + # TODO(zork): fix this test to build on Windows. See: crosbug.com/26906 + 'sources/': [ + ['exclude', 'focus_cycler_unittest.cc'], + ], + }], ['OS=="mac"', { 'sources/': [ ['exclude', 'accelerators/accelerator_controller_unittest.cc'], diff --git a/ash/focus_cycler_unittest.cc b/ash/focus_cycler_unittest.cc new file mode 100644 index 0000000..2642182 --- /dev/null +++ b/ash/focus_cycler_unittest.cc @@ -0,0 +1,126 @@ +// Copyright (c) 2012 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 "ash/focus_cycler.h" + +#include "ash/launcher/launcher.h" +#include "ash/shell.h" +#include "ash/shell_window_ids.h" +#include "ash/wm/window_util.h" +#include "ash/test/ash_test_base.h" +#include "ash/shell_factory.h" +#include "ui/aura/test/test_windows.h" +#include "ui/aura/window.h" +#include "ui/views/controls/button/menu_button.h" +#include "ui/views/widget/widget.h" + +namespace ash { +namespace test { + +using aura::test::CreateTestWindowWithId; +using aura::Window; +using internal::FocusCycler; + +typedef AshTestBase FocusCyclerTest; + +TEST_F(FocusCyclerTest, CycleFocusBrowserOnly) { + scoped_ptr<FocusCycler> focus_cycler(new FocusCycler()); + + // Create a single test window. + Window* default_container = + ash::Shell::GetInstance()->GetContainer( + internal::kShellWindowId_DefaultContainer); + scoped_ptr<Window> window0(CreateTestWindowWithId(0, default_container)); + ActivateWindow(window0.get()); + EXPECT_TRUE(IsActiveWindow(window0.get())); + + // Cycle the window + focus_cycler->RotateFocus(FocusCycler::FORWARD); + EXPECT_TRUE(IsActiveWindow(window0.get())); +} + +TEST_F(FocusCyclerTest, CycleFocusForward) { + scoped_ptr<FocusCycler> focus_cycler(new FocusCycler()); + + // Add the Status area + views::Widget* status_widget = internal::CreateStatusArea(); + ASSERT_TRUE(status_widget); + focus_cycler->AddWidget(status_widget); + + // Add a mock button to the status area. + status_widget->GetContentsView()->AddChildView( + new views::MenuButton(NULL, string16(), NULL, false)); + + // Add the launcher + Launcher* launcher = Shell::GetInstance()->launcher(); + ASSERT_TRUE(launcher); + views::Widget* launcher_widget = launcher->widget(); + ASSERT_TRUE(launcher_widget); + focus_cycler->AddWidget(launcher_widget); + launcher->SetFocusCycler(focus_cycler.get()); + + // Create a single test window. + Window* default_container = + ash::Shell::GetInstance()->GetContainer( + internal::kShellWindowId_DefaultContainer); + scoped_ptr<Window> window0(CreateTestWindowWithId(0, default_container)); + ActivateWindow(window0.get()); + EXPECT_TRUE(IsActiveWindow(window0.get())); + + // Cycle focus to the status area + focus_cycler->RotateFocus(FocusCycler::FORWARD); + EXPECT_TRUE(status_widget->IsActive()); + + // Cycle focus to the launcher + focus_cycler->RotateFocus(FocusCycler::FORWARD); + EXPECT_TRUE(launcher_widget->IsActive()); + + // Cycle focus to the browser + focus_cycler->RotateFocus(FocusCycler::FORWARD); + EXPECT_TRUE(IsActiveWindow(window0.get())); +} + +TEST_F(FocusCyclerTest, CycleFocusBackward) { + scoped_ptr<FocusCycler> focus_cycler(new FocusCycler()); + + // Add the Status area + views::Widget* status_widget = internal::CreateStatusArea(); + ASSERT_TRUE(status_widget); + focus_cycler->AddWidget(status_widget); + + // Add a mock button to the status area. + status_widget->GetContentsView()->AddChildView( + new views::MenuButton(NULL, string16(), NULL, false)); + + // Add the launcher + Launcher* launcher = Shell::GetInstance()->launcher(); + ASSERT_TRUE(launcher); + views::Widget* launcher_widget = launcher->widget(); + ASSERT_TRUE(launcher_widget); + focus_cycler->AddWidget(launcher_widget); + launcher->SetFocusCycler(focus_cycler.get()); + + // Create a single test window. + Window* default_container = + ash::Shell::GetInstance()->GetContainer( + internal::kShellWindowId_DefaultContainer); + scoped_ptr<Window> window0(CreateTestWindowWithId(0, default_container)); + ActivateWindow(window0.get()); + EXPECT_TRUE(IsActiveWindow(window0.get())); + + // Cycle focus to the launcher + focus_cycler->RotateFocus(FocusCycler::BACKWARD); + EXPECT_TRUE(launcher_widget->IsActive()); + + // Cycle focus to the status area + focus_cycler->RotateFocus(FocusCycler::BACKWARD); + EXPECT_TRUE(status_widget->IsActive()); + + // Cycle focus to the browser + focus_cycler->RotateFocus(FocusCycler::BACKWARD); + EXPECT_TRUE(IsActiveWindow(window0.get())); +} + +} // namespace test +} // namespace ash diff --git a/ash/status_area/status_area_view.cc b/ash/status_area/status_area_view.cc index 212a4cb..8bcdfb1 100644 --- a/ash/status_area/status_area_view.cc +++ b/ash/status_area/status_area_view.cc @@ -28,6 +28,14 @@ gfx::Size StatusAreaView::GetPreferredSize() { return gfx::Size(status_mock_.width(), status_mock_.height()); } +views::Widget* StatusAreaView::GetWidget() { + return View::GetWidget(); +} + +const views::Widget* StatusAreaView::GetWidget() const { + return View::GetWidget(); +} + void StatusAreaView::OnPaint(gfx::Canvas* canvas) { canvas->DrawBitmapInt(status_mock_, 0, 0); } diff --git a/ash/status_area/status_area_view.h b/ash/status_area/status_area_view.h index e7788a1..32d9f37 100644 --- a/ash/status_area/status_area_view.h +++ b/ash/status_area/status_area_view.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -7,18 +7,22 @@ #pragma once #include "third_party/skia/include/core/SkBitmap.h" +#include "ui/views/accessible_pane_view.h" #include "ui/views/widget/widget_delegate.h" namespace ash { namespace internal { -class StatusAreaView : public views::WidgetDelegateView { +class StatusAreaView : public views::WidgetDelegate, + public views::AccessiblePaneView { public: StatusAreaView(); virtual ~StatusAreaView(); // Overridden from views::View: virtual gfx::Size GetPreferredSize() OVERRIDE; + virtual views::Widget* GetWidget() OVERRIDE; + virtual const views::Widget* GetWidget() const OVERRIDE; private: virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; |