Handle Ctrl+F1 and Ctrl+F2 correctly even when no browser window is available.

- Remove accelerators from ash/focus_cycler.cc and chrome/browser/ui/views/accelerator_table.cc. Instead, handle it in ash/accelerator/accelerator_controller.cc.
- Do not try to focus a browser window in ash/focus_cycler.cc when it's not available. Unit tests added.

BUG=129307
TEST=ran aura_shell_unittests + manually checked


Review URL: https://chromiumcodereview.appspot.com/10545132

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142107 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ash/focus_cycler_unittest.cc b/ash/focus_cycler_unittest.cc
index c21a1f9d..d0377a2 100644
--- a/ash/focus_cycler_unittest.cc
+++ b/ash/focus_cycler_unittest.cc
@@ -136,6 +136,95 @@
   EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
 }
 
+TEST_F(FocusCyclerTest, CycleFocusForwardBackward) {
+  scoped_ptr<FocusCycler> focus_cycler(new FocusCycler());
+
+  // Add the Status area
+  scoped_ptr<SystemTray> tray(CreateSystemTray());
+  ASSERT_TRUE(tray->GetWidget());
+  focus_cycler->AddWidget(tray->GetWidget());
+  GetStatusAreaWidgetDelegate(tray->GetWidget())->SetFocusCyclerForTesting(
+      focus_cycler.get());
+
+  // Add the launcher
+  Launcher* launcher = Shell::GetInstance()->launcher();
+  ASSERT_TRUE(launcher);
+  views::Widget* launcher_widget = launcher->widget();
+  ASSERT_TRUE(launcher_widget);
+  launcher->SetFocusCycler(focus_cycler.get());
+
+  // Create a single test window.
+  Window* default_container = Shell::GetContainer(
+      Shell::GetPrimaryRootWindow(),
+      internal::kShellWindowId_DefaultContainer);
+  scoped_ptr<Window> window0(CreateTestWindowWithId(0, default_container));
+  wm::ActivateWindow(window0.get());
+  EXPECT_TRUE(wm::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(tray->GetWidget()->IsActive());
+
+  // Cycle focus to the browser
+  focus_cycler->RotateFocus(FocusCycler::BACKWARD);
+  EXPECT_TRUE(wm::IsActiveWindow(window0.get()));
+
+  // Cycle focus to the status area
+  focus_cycler->RotateFocus(FocusCycler::FORWARD);
+  EXPECT_TRUE(tray->GetWidget()->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(wm::IsActiveWindow(window0.get()));
+}
+
+TEST_F(FocusCyclerTest, CycleFocusNoBrowser) {
+  scoped_ptr<FocusCycler> focus_cycler(new FocusCycler());
+
+  // Add the Status area
+  scoped_ptr<SystemTray> tray(CreateSystemTray());
+  ASSERT_TRUE(tray->GetWidget());
+  focus_cycler->AddWidget(tray->GetWidget());
+  GetStatusAreaWidgetDelegate(tray->GetWidget())->SetFocusCyclerForTesting(
+      focus_cycler.get());
+
+  // Add the launcher and focus it
+  Launcher* launcher = Shell::GetInstance()->launcher();
+  ASSERT_TRUE(launcher);
+  views::Widget* launcher_widget = launcher->widget();
+  ASSERT_TRUE(launcher_widget);
+  launcher->SetFocusCycler(focus_cycler.get());
+  focus_cycler->FocusWidget(launcher_widget);
+
+  // Cycle focus to the status area
+  focus_cycler->RotateFocus(FocusCycler::FORWARD);
+  EXPECT_TRUE(tray->GetWidget()->IsActive());
+
+  // Cycle focus to the launcher
+  focus_cycler->RotateFocus(FocusCycler::FORWARD);
+  EXPECT_TRUE(launcher_widget->IsActive());
+
+  // Cycle focus to the status area
+  focus_cycler->RotateFocus(FocusCycler::FORWARD);
+  EXPECT_TRUE(tray->GetWidget()->IsActive());
+
+  // 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(tray->GetWidget()->IsActive());
+}
+
 class FocusCyclerLauncherTest : public AshTestBase {
  public:
   FocusCyclerLauncherTest() : AshTestBase() {}