summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaintlou@chromium.org <saintlou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-27 23:08:17 +0000
committersaintlou@chromium.org <saintlou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-27 23:08:17 +0000
commitc1bf4ed58c3ca36a17fbce09bec66bb3989c8014 (patch)
treebab3f97d5bf3e209873b9a47956525a6a9075afd
parent0c03c08e994b55d99128e71076cb787d7b917e67 (diff)
downloadchromium_src-c1bf4ed58c3ca36a17fbce09bec66bb3989c8014.zip
chromium_src-c1bf4ed58c3ca36a17fbce09bec66bb3989c8014.tar.gz
chromium_src-c1bf4ed58c3ca36a17fbce09bec66bb3989c8014.tar.bz2
(On behalf of yusukes) Handle Caps Lock short cut (Shift+Search) in ash [part 2 of 2].
Add caps_lock_handler.cc which implements ash::CapsLockDelegate. Part 1 of 2: http://codereview.chromium.org/9242003 Original review for Part 2 of 2: http://codereview.chromium.org/9225004/ (LGTM'ed by ben@chromium.org and derat@chromium.org) BUG=110129 TEST=ran browser_tests TBR=ben@chromium.org,derat@chromium.org Review URL: https://chromiumcodereview.appspot.com/9297027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@119513 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chrome_browser_main_extra_parts_aura.cc8
-rw-r--r--chrome/browser/chromeos/system_key_event_listener.cc4
-rw-r--r--chrome/browser/chromeos/system_key_event_listener_browsertest.cc6
-rw-r--r--chrome/browser/ui/views/aura/caps_lock_handler.cc59
-rw-r--r--chrome/browser/ui/views/aura/caps_lock_handler.h62
-rw-r--r--chrome/browser/ui/views/aura/caps_lock_handler_browsertest.cc104
-rw-r--r--chrome/browser/ui/views/aura/screenshot_taker.h2
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
9 files changed, 247 insertions, 1 deletions
diff --git a/chrome/browser/chrome_browser_main_extra_parts_aura.cc b/chrome/browser/chrome_browser_main_extra_parts_aura.cc
index 5ea312d..14e2e29 100644
--- a/chrome/browser/chrome_browser_main_extra_parts_aura.cc
+++ b/chrome/browser/chrome_browser_main_extra_parts_aura.cc
@@ -8,6 +8,7 @@
#include "ash/shell.h"
#include "base/command_line.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/browser/ui/views/aura/caps_lock_handler.h"
#include "chrome/browser/ui/views/aura/chrome_shell_delegate.h"
#include "chrome/browser/ui/views/aura/screen_orientation_listener.h"
#include "chrome/browser/ui/views/aura/screenshot_taker.h"
@@ -15,6 +16,7 @@
#include "ui/gfx/compositor/compositor_setup.h"
#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/input_method/input_method_manager.h"
#include "chrome/browser/chromeos/system/runtime_environment.h"
#endif
@@ -36,6 +38,12 @@ void ChromeBrowserMainExtraPartsAura::PreProfileInit() {
ash::Shell* shell = ash::Shell::CreateInstance(new ChromeShellDelegate);
shell->accelerator_controller()->SetScreenshotDelegate(
scoped_ptr<ash::ScreenshotDelegate>(new ScreenshotTaker).Pass());
+#if defined(OS_CHROMEOS)
+ chromeos::input_method::XKeyboard* xkeyboard =
+ chromeos::input_method::InputMethodManager::GetInstance()->GetXKeyboard();
+ shell->accelerator_controller()->SetCapsLockDelegate(
+ scoped_ptr<ash::CapsLockDelegate>(new CapsLockHandler(xkeyboard)).Pass());
+#endif
// Make sure the singleton ScreenOrientationListener object is created.
ScreenOrientationListener::GetInstance();
diff --git a/chrome/browser/chromeos/system_key_event_listener.cc b/chrome/browser/chromeos/system_key_event_listener.cc
index d78512e..da99633 100644
--- a/chrome/browser/chromeos/system_key_event_listener.cc
+++ b/chrome/browser/chromeos/system_key_event_listener.cc
@@ -302,6 +302,7 @@ bool SystemKeyEventListener::ProcessedXEvent(XEvent* xevent) {
}
if (xevent->type == xkb_event_base_) {
+ // TODO(yusukes): Move this part to aura::RootWindowHost.
XkbEvent* xkey_event = reinterpret_cast<XkbEvent*>(xevent);
if (xkey_event->any.xkb_type == XkbStateNotify) {
input_method::ModifierLockStatus new_caps_lock_state =
@@ -335,7 +336,9 @@ bool SystemKeyEventListener::ProcessedXEvent(XEvent* xevent) {
if (keycode) {
const unsigned int state = (xevent->xkey.state & kSupportedModifiers);
+#if !defined(USE_AURA)
// Toggle Caps Lock if Shift and Search keys are pressed.
+ // When Aura is in use, the shortcut is handled in Ash.
if (XKeycodeToKeysym(ui::GetXDisplay(), keycode, 0) == XK_Super_L) {
const bool shift_is_held = (state & ShiftMask);
const bool other_mods_are_held = (state & ~(ShiftMask | LockMask));
@@ -343,6 +346,7 @@ bool SystemKeyEventListener::ProcessedXEvent(XEvent* xevent) {
input_method_manager->GetXKeyboard()->SetCapsLockEnabled(
!caps_lock_is_on_);
}
+#endif
// Only doing non-Alt/Shift/Ctrl modified keys
if (!(state & (Mod1Mask | ShiftMask | ControlMask))) {
diff --git a/chrome/browser/chromeos/system_key_event_listener_browsertest.cc b/chrome/browser/chromeos/system_key_event_listener_browsertest.cc
index fb116da..d6094fe 100644
--- a/chrome/browser/chromeos/system_key_event_listener_browsertest.cc
+++ b/chrome/browser/chromeos/system_key_event_listener_browsertest.cc
@@ -27,6 +27,12 @@
#define TestKoreanInputMethod DISABLED_TestKoreanInputMethod
#endif
+#if defined(USE_AURA)
+// When Aura is in use, the shortcut is handled in Ash.
+#define TestCapsLock DISABLED_TestCapsLock
+#define TestCapsLockWithNumLock DISABLED_TestCapsLockWithNumLock
+#endif
+
namespace chromeos {
namespace {
diff --git a/chrome/browser/ui/views/aura/caps_lock_handler.cc b/chrome/browser/ui/views/aura/caps_lock_handler.cc
new file mode 100644
index 0000000..fccd62b
--- /dev/null
+++ b/chrome/browser/ui/views/aura/caps_lock_handler.cc
@@ -0,0 +1,59 @@
+// 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 "chrome/browser/ui/views/aura/caps_lock_handler.h"
+
+#include "content/public/browser/browser_thread.h"
+
+// TODO(yusukes): Support Ash on Windows.
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/input_method/xkeyboard.h"
+#include "chrome/browser/chromeos/system/runtime_environment.h"
+#endif
+
+#if defined(OS_CHROMEOS)
+CapsLockHandler::CapsLockHandler(chromeos::input_method::XKeyboard* xkeyboard)
+ : xkeyboard_(xkeyboard),
+ is_running_on_chromeos_(
+ chromeos::system::runtime_environment::IsRunningOnChromeOS()),
+ caps_lock_is_on_(xkeyboard_->CapsLockIsEnabled()) {
+ chromeos::SystemKeyEventListener* system_event_listener =
+ chromeos::SystemKeyEventListener::GetInstance();
+ // SystemKeyEventListener should be instantiated when we're running on Chrome
+ // OS.
+ DCHECK(!is_running_on_chromeos_ || system_event_listener);
+ if (system_event_listener)
+ system_event_listener->AddCapsLockObserver(this);
+}
+#endif
+
+CapsLockHandler::~CapsLockHandler() {
+#if defined(OS_CHROMEOS)
+ chromeos::SystemKeyEventListener* system_event_listener =
+ chromeos::SystemKeyEventListener::GetInstance();
+ if (system_event_listener)
+ system_event_listener->RemoveCapsLockObserver(this);
+#endif
+}
+
+bool CapsLockHandler::HandleToggleCapsLock() {
+#if defined(OS_CHROMEOS)
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
+ if (is_running_on_chromeos_) {
+ // TODO(yusukes): Do not change Caps Lock status and just return false if
+ // spoken feedback is enabled (crosbug.com/110127).
+ xkeyboard_->SetCapsLockEnabled(!caps_lock_is_on_);
+ return true; // consume the shortcut key.
+ }
+#else
+ NOTIMPLEMENTED();
+#endif
+ return false;
+}
+
+#if defined(OS_CHROMEOS)
+void CapsLockHandler::OnCapsLockChange(bool enabled) {
+ caps_lock_is_on_ = enabled;
+}
+#endif
diff --git a/chrome/browser/ui/views/aura/caps_lock_handler.h b/chrome/browser/ui/views/aura/caps_lock_handler.h
new file mode 100644
index 0000000..73c8268
--- /dev/null
+++ b/chrome/browser/ui/views/aura/caps_lock_handler.h
@@ -0,0 +1,62 @@
+// 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.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_AURA_CAPS_LOCK_HANDLER_H_
+#define CHROME_BROWSER_UI_VIEWS_AURA_CAPS_LOCK_HANDLER_H_
+#pragma once
+
+#include "ash/caps_lock_delegate.h"
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/system_key_event_listener.h"
+
+namespace chromeos {
+namespace input_method {
+class XKeyboard;
+} // namespace input_method
+} // namespace chromeos
+#endif
+
+// A class which toggles Caps Lock state when the hotkey for Caps Lock
+// is pressed.
+class CapsLockHandler : public ash::CapsLockDelegate
+#if defined(OS_CHROMEOS)
+ , public chromeos::SystemKeyEventListener::CapsLockObserver
+#endif
+{
+ public:
+ CapsLockHandler() {}
+#if defined(OS_CHROMEOS)
+ explicit CapsLockHandler(chromeos::input_method::XKeyboard* xkeyboard);
+#endif
+ virtual ~CapsLockHandler();
+
+ // Overridden from ash::CapsLockHandler:
+ virtual bool HandleToggleCapsLock() OVERRIDE;
+
+#if defined(OS_CHROMEOS)
+ // Overridden from chromeos::SystemKeyEventListener::CapsLockObserver:
+ virtual void OnCapsLockChange(bool enabled) OVERRIDE;
+
+ void set_is_running_on_chromeos_for_test(bool is_running_on_chromeos) {
+ is_running_on_chromeos_ = is_running_on_chromeos;
+ }
+
+ bool caps_lock_is_on_for_test() const {
+ return caps_lock_is_on_;
+ }
+
+ private:
+ chromeos::input_method::XKeyboard* xkeyboard_;
+ bool is_running_on_chromeos_;
+ bool caps_lock_is_on_;
+#endif
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CapsLockHandler);
+};
+
+#endif // CHROME_BROWSER_UI_VIEWS_AURA_CAPS_LOCK_HANDLER_H_
diff --git a/chrome/browser/ui/views/aura/caps_lock_handler_browsertest.cc b/chrome/browser/ui/views/aura/caps_lock_handler_browsertest.cc
new file mode 100644
index 0000000..7e45167
--- /dev/null
+++ b/chrome/browser/ui/views/aura/caps_lock_handler_browsertest.cc
@@ -0,0 +1,104 @@
+// 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 "chrome/browser/ui/views/aura/caps_lock_handler.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/input_method/xkeyboard.h"
+using namespace chromeos::input_method;
+#endif
+
+namespace {
+
+#if defined(OS_CHROMEOS)
+class DummyXKeyboard : public XKeyboard {
+ public:
+ explicit DummyXKeyboard(bool initial_caps_lock_state)
+ : caps_lock_is_enabled_(initial_caps_lock_state) {}
+ virtual ~DummyXKeyboard() {}
+
+ // Overridden from chrome::input_method::XKeyboard:
+ virtual bool SetCurrentKeyboardLayoutByName(
+ const std::string& layout_name) OVERRIDE {
+ return true;
+ }
+ virtual bool RemapModifierKeys(const ModifierMap& modifier_map) OVERRIDE {
+ return true;
+ }
+ virtual bool ReapplyCurrentKeyboardLayout() OVERRIDE {
+ return true;
+ }
+ virtual void ReapplyCurrentModifierLockStatus() OVERRIDE {}
+ virtual void SetLockedModifiers(
+ ModifierLockStatus new_caps_lock_status,
+ ModifierLockStatus new_num_lock_status) OVERRIDE {}
+ virtual void SetNumLockEnabled(bool enable_num_lock) OVERRIDE {}
+ virtual void SetCapsLockEnabled(bool enable_caps_lock) OVERRIDE {
+ caps_lock_is_enabled_ = enable_caps_lock;
+ }
+ virtual bool NumLockIsEnabled() OVERRIDE {
+ return true;
+ }
+ virtual bool CapsLockIsEnabled() OVERRIDE {
+ return caps_lock_is_enabled_;
+ }
+ virtual std::string CreateFullXkbLayoutName(
+ const std::string& layout_name,
+ const ModifierMap& modifire_map) OVERRIDE {
+ return "";
+ }
+ virtual unsigned int GetNumLockMask() OVERRIDE {
+ return 0;
+ }
+ virtual void GetLockedModifiers(bool* out_caps_lock_enabled,
+ bool* out_num_lock_enabled) OVERRIDE {}
+
+ private:
+ bool caps_lock_is_enabled_;
+
+ DISALLOW_COPY_AND_ASSIGN(DummyXKeyboard);
+};
+
+class CapsLockHandlerTest : public InProcessBrowserTest {
+ public:
+ CapsLockHandlerTest()
+ : initial_caps_lock_state_(false),
+ xkeyboard_(initial_caps_lock_state_) {
+ }
+ virtual void SetUp() OVERRIDE {
+ handler_.reset(new CapsLockHandler(&xkeyboard_));
+ // Force CapsLockHandler::HandleToggleCapsLock() to toggle the lock state.
+ handler_->set_is_running_on_chromeos_for_test(true);
+ }
+ virtual void TearDown() OVERRIDE {
+ handler_.reset();
+ }
+
+ protected:
+ const bool initial_caps_lock_state_;
+ DummyXKeyboard xkeyboard_;
+ scoped_ptr<CapsLockHandler> handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(CapsLockHandlerTest);
+};
+#endif
+
+} // namespace
+
+// Check if HandleToggleCapsLock() really changes the lock state.
+IN_PROC_BROWSER_TEST_F(CapsLockHandlerTest, TestCapsLock) {
+#if defined(OS_CHROMEOS)
+ EXPECT_EQ(initial_caps_lock_state_, handler_->caps_lock_is_on_for_test());
+ EXPECT_TRUE(handler_->HandleToggleCapsLock());
+ EXPECT_EQ(!initial_caps_lock_state_, xkeyboard_.CapsLockIsEnabled());
+ handler_->OnCapsLockChange(!initial_caps_lock_state_);
+ EXPECT_EQ(!initial_caps_lock_state_, handler_->caps_lock_is_on_for_test());
+ EXPECT_TRUE(handler_->HandleToggleCapsLock());
+ handler_->OnCapsLockChange(initial_caps_lock_state_);
+ EXPECT_EQ(initial_caps_lock_state_, xkeyboard_.CapsLockIsEnabled());
+ EXPECT_EQ(initial_caps_lock_state_, handler_->caps_lock_is_on_for_test());
+#endif
+}
diff --git a/chrome/browser/ui/views/aura/screenshot_taker.h b/chrome/browser/ui/views/aura/screenshot_taker.h
index 3aa3ec4..e39989f 100644
--- a/chrome/browser/ui/views/aura/screenshot_taker.h
+++ b/chrome/browser/ui/views/aura/screenshot_taker.h
@@ -14,7 +14,7 @@ class ScreenshotTaker : public ash::ScreenshotDelegate {
public:
ScreenshotTaker();
- virtual void HandleTakeScreenshot() OVERRIDE;
+ virtual void HandleTakeScreenshot() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(ScreenshotTaker);
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 6939ab9..2f1a5b3 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -3376,6 +3376,8 @@
'browser/ui/views/aura/app_list/chrome_app_list_item.h',
'browser/ui/views/aura/app_list/extension_app_item.cc',
'browser/ui/views/aura/app_list/extension_app_item.h',
+ 'browser/ui/views/aura/caps_lock_handler.cc',
+ 'browser/ui/views/aura/caps_lock_handler.h',
'browser/ui/views/aura/chrome_shell_delegate.cc',
'browser/ui/views/aura/chrome_shell_delegate.h',
'browser/ui/views/aura/launcher_app_icon_loader.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index c7cb4e3..b578c09 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -2713,6 +2713,7 @@
'browser/ui/tab_modal_confirm_dialog_browsertest_mac.mm',
'browser/ui/tab_modal_confirm_dialog_browsertest.cc',
'browser/ui/tab_modal_confirm_dialog_browsertest.h',
+ 'browser/ui/views/aura/caps_lock_handler_browsertest.cc',
'browser/ui/views/aura/status_area_host_aura_browsertest.cc',
'browser/ui/views/browser_actions_container_browsertest.cc',
'browser/ui/views/dom_view_browsertest.cc',