diff options
author | saintlou@chromium.org <saintlou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-27 23:08:17 +0000 |
---|---|---|
committer | saintlou@chromium.org <saintlou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-27 23:08:17 +0000 |
commit | c1bf4ed58c3ca36a17fbce09bec66bb3989c8014 (patch) | |
tree | bab3f97d5bf3e209873b9a47956525a6a9075afd | |
parent | 0c03c08e994b55d99128e71076cb787d7b917e67 (diff) | |
download | chromium_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.cc | 8 | ||||
-rw-r--r-- | chrome/browser/chromeos/system_key_event_listener.cc | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/system_key_event_listener_browsertest.cc | 6 | ||||
-rw-r--r-- | chrome/browser/ui/views/aura/caps_lock_handler.cc | 59 | ||||
-rw-r--r-- | chrome/browser/ui/views/aura/caps_lock_handler.h | 62 | ||||
-rw-r--r-- | chrome/browser/ui/views/aura/caps_lock_handler_browsertest.cc | 104 | ||||
-rw-r--r-- | chrome/browser/ui/views/aura/screenshot_taker.h | 2 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 |
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', |