basic browser tests for compact navigation bar.
 * Tests if Browser::ToggleCompactNavigationBar() turns on/off
 compact navigation bar and tool bar.
 * Tests if the accelerator works.

BUG=http://crosbug.com/2028
TEST=new tests CompactNativationBarTest.TestBasic/TestAccelerator should pass.

Review URL: http://codereview.chromium.org/1200001

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42430 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/chromeos/compact_navigation_bar_browsertest.cc b/chrome/browser/chromeos/compact_navigation_bar_browsertest.cc
new file mode 100644
index 0000000..fdc6fbb
--- /dev/null
+++ b/chrome/browser/chromeos/compact_navigation_bar_browsertest.cc
@@ -0,0 +1,135 @@
+// Copyright (c) 2010 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 "chrome/browser/browser.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/frame/browser_view.h"
+#include "chrome/browser/chromeos/view_ids.h"
+#include "chrome/test/in_process_browser_test.h"
+#include "chrome/test/ui_test_utils.h"
+#include "views/widget/widget.h"
+#include "views/window/window.h"
+
+namespace {
+
+// TODO(oshima): Refactor and move to common place (probably in chrome/test/).
+class Key {
+ public:
+  // Creates a key with modifiers.
+  Key(int keyval, bool shift, bool ctrl, bool alt)
+      : keyval_(keyval),
+        modifier_(0) {
+    if (shift)
+      modifier_ |= GDK_SHIFT_MASK;
+    if (ctrl)
+      modifier_ |= GDK_CONTROL_MASK;
+    if (alt)
+      modifier_ |= GDK_MOD1_MASK;
+  }
+
+  void PressOn(views::Window* window) const {
+    Process(window, true);
+  }
+
+  void ReleaseOn(views::Window* window) const {
+    Process(window, false);
+  }
+
+ private:
+  // Injects a synthesized key event into gdk event queue.
+  void Process(views::Window* window, bool press) const {
+    GdkKeymapKey* keys;
+    gint n_keys;
+    gdk_keymap_get_entries_for_keyval(
+        gdk_keymap_get_default(),
+        keyval_,
+        &keys,
+        &n_keys);
+
+    gfx::NativeWindow native_window = window->GetNativeWindow();
+    GdkEvent* event = gdk_event_new(press ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
+    GdkEventKey* key_event = reinterpret_cast<GdkEventKey*>(event);
+    if (press)
+      key_event->state = modifier_ | GDK_KEY_PRESS_MASK;
+    else
+      key_event->state = modifier_ | GDK_KEY_RELEASE_MASK;
+
+    key_event->window = GTK_WIDGET(native_window)->window;
+    key_event->send_event = true;
+    key_event->time = GDK_CURRENT_TIME;
+    key_event->keyval = keyval_;
+    key_event->hardware_keycode = keys[0].keycode;
+    key_event->group = keys[0].group;
+
+    gdk_event_put(event);
+  }
+
+  int keyval_;
+  int modifier_;
+  DISALLOW_COPY_AND_ASSIGN(Key);
+};
+
+}  // namespace
+
+namespace chromeos {
+
+class CompactNavigationBarTest : public InProcessBrowserTest {
+ public:
+  CompactNavigationBarTest() {
+  }
+
+  BrowserView* browser_view() const {
+    return static_cast<BrowserView*>(browser()->window());
+  }
+
+  bool IsViewIdVisible(int id) const {
+    return browser_view()->GetViewByID(id)->IsVisible();
+  }
+
+  void KeyDown(const Key& key) {
+    key.PressOn(browser_view()->GetWidget()->GetWindow());
+  }
+
+  void KeyUp(const Key& key) {
+    key.ReleaseOn(browser_view()->GetWidget()->GetWindow());
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(CompactNavigationBarTest, TestBasic) {
+  EXPECT_FALSE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+  EXPECT_TRUE(IsViewIdVisible(VIEW_ID_TOOLBAR));
+
+  browser()->ToggleCompactNavigationBar();
+  EXPECT_TRUE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+  EXPECT_FALSE(IsViewIdVisible(VIEW_ID_TOOLBAR));
+
+  browser()->ToggleCompactNavigationBar();
+  EXPECT_FALSE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+  EXPECT_TRUE(IsViewIdVisible(VIEW_ID_TOOLBAR));
+}
+
+IN_PROC_BROWSER_TEST_F(CompactNavigationBarTest, TestAccelerator) {
+  EXPECT_FALSE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+
+  // ctrl-shift-c should toggle compact navigation bar.
+  Key ctrl_shift_c(base::VKEY_C, true, true, false);
+  KeyDown(ctrl_shift_c);
+  KeyUp(ctrl_shift_c);
+  RunAllPendingEvents();
+  EXPECT_TRUE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+  KeyDown(ctrl_shift_c);
+  KeyUp(ctrl_shift_c);
+  RunAllPendingEvents();
+  EXPECT_FALSE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+
+  // but ctrl-alt-c should not.
+  Key ctrl_alt_c(base::VKEY_C, true, false, true);
+  KeyDown(ctrl_alt_c);
+  KeyUp(ctrl_alt_c);
+  RunAllPendingEvents();
+  EXPECT_FALSE(IsViewIdVisible(VIEW_ID_COMPACT_NAV_BAR));
+}
+
+}  // namespace chromeos
+
diff --git a/chrome/browser/chromeos/frame/browser_view.cc b/chrome/browser/chromeos/frame/browser_view.cc
index e199b02..9f03a09 100644
--- a/chrome/browser/chromeos/frame/browser_view.cc
+++ b/chrome/browser/chromeos/frame/browser_view.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/chromeos/status/browser_status_area_view.h"
 #include "chrome/browser/chromeos/status/network_menu_button.h"
 #include "chrome/browser/chromeos/status/status_area_button.h"
+#include "chrome/browser/chromeos/view_ids.h"
 #include "chrome/browser/chromeos/wm_ipc.h"
 #include "chrome/browser/views/app_launcher.h"
 #include "chrome/browser/views/frame/browser_extender.h"
@@ -26,7 +27,6 @@
 #include "chrome/browser/views/tabs/tab_strip.h"
 #include "chrome/browser/views/toolbar_view.h"
 #include "chrome/browser/views/toolbar_star_toggle.h"
-#include "chrome/browser/view_ids.h"
 #include "gfx/canvas.h"
 #include "grit/generated_resources.h"
 #include "grit/theme_resources.h"
diff --git a/chrome/browser/chromeos/status/clock_menu_button_browsertest.cc b/chrome/browser/chromeos/status/clock_menu_button_browsertest.cc
index 973bafb9..ed8c77a 100644
--- a/chrome/browser/chromeos/status/clock_menu_button_browsertest.cc
+++ b/chrome/browser/chromeos/status/clock_menu_button_browsertest.cc
@@ -9,9 +9,9 @@
 #include "chrome/browser/browser_window.h"
 #include "chrome/browser/chromeos/frame/browser_view.h"
 #include "chrome/browser/chromeos/status/browser_status_area_view.h"
+#include "chrome/browser/chromeos/view_ids.h"
 #include "chrome/browser/pref_member.h"
 #include "chrome/browser/profile.h"
-#include "chrome/browser/view_ids.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/in_process_browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/view_ids.h b/chrome/browser/chromeos/view_ids.h
new file mode 100644
index 0000000..54b3b7b
--- /dev/null
+++ b/chrome/browser/chromeos/view_ids.h
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 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.
+
+#ifndef CHROME_BROWSER_CHROMEOS_VIEW_IDS_H_
+#define CHROME_BROWSER_CHROMEOS_VIEW_IDS_H_
+
+#include "chrome/browser/view_ids.h"
+
+// View ID used in ChromeOS.
+enum ChromeOSViewIds {
+  // Start with the offset that is big enough to avoid possible
+  // collison.
+  VIEW_ID_APP_MENU_BUTTON = VIEW_ID_PREDEFINED_COUNT + 10000,
+  VIEW_ID_COMPACT_NAV_BAR,
+  VIEW_ID_STATUS_AREA,
+  VIEW_ID_SPACER,
+  VIEW_ID_OTR_AVATAR,
+};
+
+#endif  // CHROME_BROWSER_CHROMEOS_VIEW_IDS_H_
+
diff --git a/chrome/browser/view_ids.h b/chrome/browser/view_ids.h
index 0cd6e30fe..57943da 100644
--- a/chrome/browser/view_ids.h
+++ b/chrome/browser/view_ids.h
@@ -71,15 +71,6 @@
   // The Download shelf.
   VIEW_ID_DOWNLOAD_SHELF,
 
-#if defined(OS_CHROMEOS)
-  // ChromeOS view ids start here.
-  VIEW_ID_APP_MENU_BUTTON = 10000,
-  VIEW_ID_COMPACT_NAV_BAR,
-  VIEW_ID_STATUS_AREA,
-  VIEW_ID_SPACER,
-  VIEW_ID_OTR_AVATAR,
-#endif
-
   // Used in chrome/browser/gtk/view_id_util_browsertests.cc
   // If you add new ids, make sure the above test passes.
   VIEW_ID_PREDEFINED_COUNT
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index b408402f..0a40a8d 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -449,6 +449,7 @@
         'browser/chromeos/usb_mount_observer.h',
         'browser/chromeos/version_loader.cc',
         'browser/chromeos/version_loader.h',
+        'browser/chromeos/view_ids.h',
         'browser/chromeos/wm_ipc.cc',
         'browser/chromeos/wm_ipc.h',
         'browser/chromeos/wm_message_listener.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index f5abd7e9..582ce0a 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1202,6 +1202,7 @@
         'browser/browser_browsertest.cc',
         'browser/browser_init_browsertest.cc',
         'browser/browsing_data_local_storage_helper_unittest.cc',
+        'browser/chromeos/compact_navigation_bar_browsertest.cc',
         'browser/chromeos/notifications/notification_browsertest.cc',
         'browser/crash_recovery_browsertest.cc',
         'browser/download/save_page_browsertest.cc',
diff --git a/chrome/test/in_process_browser_test.cc b/chrome/test/in_process_browser_test.cc
index 3f4ce390..5afcfc2 100644
--- a/chrome/test/in_process_browser_test.cc
+++ b/chrome/test/in_process_browser_test.cc
@@ -315,3 +315,9 @@
   DCHECK_GT(timeout_value, 0);
   initial_timeout_ = timeout_value;
 }
+
+void InProcessBrowserTest::RunAllPendingEvents() {
+  MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask());
+  ui_test_utils::RunMessageLoop();
+}
+
diff --git a/chrome/test/in_process_browser_test.h b/chrome/test/in_process_browser_test.h
index 6e922d9e..dfcf6d65 100644
--- a/chrome/test/in_process_browser_test.h
+++ b/chrome/test/in_process_browser_test.h
@@ -114,6 +114,9 @@
   void EnableDOMAutomation() { dom_automation_enabled_ = true; }
   void EnableSingleProcess() { single_process_ = true; }
 
+  // Run all pending events in the message loop.
+  void RunAllPendingEvents();
+
  private:
   // Invokes CreateBrowser to create a browser, then RunTestOnMainThread, and
   // destroys the browser.