summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/ash.gyp7
-rw-r--r--ash/focus_cycler_unittest.cc126
-rw-r--r--ash/status_area/status_area_view.cc8
-rw-r--r--ash/status_area/status_area_view.h8
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;