diff options
12 files changed, 75 insertions, 21 deletions
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index b96c201..8b9f9d4 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc @@ -759,7 +759,7 @@ bool AcceleratorController::PerformAction(int action, break; case PREVIOUS_IME: if (ime_control_delegate_) - return ime_control_delegate_->HandlePreviousIme(); + return ime_control_delegate_->HandlePreviousIme(accelerator); break; case PRINT_UI_HIERARCHIES: return HandlePrintUIHierarchies(); diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc index a1a7f2c..4981cbb 100644 --- a/ash/accelerators/accelerator_controller_unittest.cc +++ b/ash/accelerators/accelerator_controller_unittest.cc @@ -214,8 +214,9 @@ class DummyImeControlDelegate : public ImeControlDelegate { ++handle_next_ime_count_; return consume_; } - virtual bool HandlePreviousIme() OVERRIDE { + virtual bool HandlePreviousIme(const ui::Accelerator& accelerator) OVERRIDE { ++handle_previous_ime_count_; + last_accelerator_ = accelerator; return consume_; } virtual bool HandleSwitchIme(const ui::Accelerator& accelerator) OVERRIDE { diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index 3a6e5c8..982176a 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc @@ -25,6 +25,7 @@ const AcceleratorData kAcceleratorData[] = { { false, ui::VKEY_RSHIFT, ui::EF_NONE, DISABLE_CAPS_LOCK }, { true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, PREVIOUS_IME }, + { false, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, PREVIOUS_IME }, // Shortcuts for Japanese IME. { true, ui::VKEY_CONVERT, ui::EF_NONE, SWITCH_IME }, { true, ui::VKEY_NONCONVERT, ui::EF_NONE, SWITCH_IME }, diff --git a/ash/ime_control_delegate.h b/ash/ime_control_delegate.h index 7f64dc5..6aa5609 100644 --- a/ash/ime_control_delegate.h +++ b/ash/ime_control_delegate.h @@ -17,7 +17,7 @@ class ImeControlDelegate { virtual ~ImeControlDelegate() {} virtual bool HandleNextIme() = 0; - virtual bool HandlePreviousIme() = 0; + virtual bool HandlePreviousIme(const ui::Accelerator& accelerator) = 0; // Switches to another IME depending on the |accelerator|. virtual bool HandleSwitchIme(const ui::Accelerator& accelerator) = 0; diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index c0082d0..7f2fa95 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc @@ -698,7 +698,8 @@ bool InputMethodManagerImpl::SwitchToNextInputMethod() { return true; } -bool InputMethodManagerImpl::SwitchToPreviousInputMethod() { +bool InputMethodManagerImpl::SwitchToPreviousInputMethod( + const ui::Accelerator& accelerator) { // Sanity check. if (active_input_method_ids_.empty()) { DVLOG(1) << "active input method is empty"; @@ -710,6 +711,9 @@ bool InputMethodManagerImpl::SwitchToPreviousInputMethod() { if (active_input_method_ids_.size() == 1) return false; + if (accelerator.type() == ui::ET_KEY_RELEASED) + return true; + if (previous_input_method_.id().empty() || previous_input_method_.id() == current_input_method_.id()) { return SwitchToNextInputMethod(); diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h index 16de674..1d0d417 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h @@ -91,7 +91,8 @@ class InputMethodManagerImpl : public InputMethodManager, InputMethodDescriptors* result) OVERRIDE; virtual void SetEnabledExtensionImes(std::vector<std::string>* ids) OVERRIDE; virtual bool SwitchToNextInputMethod() OVERRIDE; - virtual bool SwitchToPreviousInputMethod() OVERRIDE; + virtual bool SwitchToPreviousInputMethod( + const ui::Accelerator& accelerator) OVERRIDE; virtual bool SwitchInputMethod(const ui::Accelerator& accelerator) OVERRIDE; virtual InputMethodDescriptor GetCurrentInputMethod() const OVERRIDE; virtual InputMethodPropertyList diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc index 69129f7..978007e 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc @@ -778,39 +778,50 @@ TEST_F(InputMethodManagerImplTest, TestPreviousInputMethod) { manager_->AddObserver(&observer); InitComponentExtension(); InitIBusBus(); + + ui::Accelerator keydown_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN); + keydown_accelerator.set_type(ui::ET_KEY_PRESSED); + ui::Accelerator keyup_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN); + keyup_accelerator.set_type(ui::ET_KEY_RELEASED); + manager_->EnableLayouts("en-US", "xkb:us::eng"); EXPECT_EQ(5U, manager_->GetNumActiveInputMethods()); EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us", xkeyboard_->last_layout_); - manager_->SwitchToNextInputMethod(); + EXPECT_TRUE(manager_->SwitchToNextInputMethod()); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us(intl)", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us(intl)", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us", xkeyboard_->last_layout_); - manager_->SwitchToNextInputMethod(); + EXPECT_TRUE(manager_->SwitchToNextInputMethod()); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us(intl)", xkeyboard_->last_layout_); - manager_->SwitchToNextInputMethod(); + EXPECT_TRUE(manager_->SwitchToNextInputMethod()); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us:altgr-intl:eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us(altgr-intl)", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us(intl)", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_TRUE(observer.last_show_message_); EXPECT_EQ("xkb:us:altgr-intl:eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us(altgr-intl)", xkeyboard_->last_layout_); @@ -818,6 +829,31 @@ TEST_F(InputMethodManagerImplTest, TestPreviousInputMethod) { manager_->RemoveObserver(&observer); } +TEST_F(InputMethodManagerImplTest, + TestSwitchToPreviousInputMethodForOneActiveInputMethod) { + TestObserver observer; + manager_->AddObserver(&observer); + InitComponentExtension(); + InitIBusBus(); + + ui::Accelerator keydown_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN); + keydown_accelerator.set_type(ui::ET_KEY_PRESSED); + ui::Accelerator keyup_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN); + keyup_accelerator.set_type(ui::ET_KEY_RELEASED); + + std::vector<std::string> ids; + ids.push_back("xkb:us:dvorak:eng"); + EXPECT_TRUE(manager_->EnableInputMethods(ids)); + EXPECT_EQ(1U, manager_->GetNumActiveInputMethods()); + + // Ctrl+Space accelerator should not be consumed if there is only one active + // input method. + EXPECT_FALSE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_FALSE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); + + manager_->RemoveObserver(&observer); +} + TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithUsLayouts) { TestObserver observer; manager_->AddObserver(&observer); @@ -855,6 +891,12 @@ TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithJpLayout) { // Enable "xkb:jp::jpn" and press Muhenkan/ZenkakuHankaku. InitComponentExtension(); InitIBusBus(); + + ui::Accelerator keydown_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN); + keydown_accelerator.set_type(ui::ET_KEY_PRESSED); + ui::Accelerator keyup_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN); + keyup_accelerator.set_type(ui::ET_KEY_RELEASED); + manager_->EnableLayouts("ja", "xkb:us::eng"); EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id()); @@ -863,14 +905,16 @@ TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithJpLayout) { ui::Accelerator(ui::VKEY_NONCONVERT, ui::EF_NONE))); EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("jp", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us", xkeyboard_->last_layout_); EXPECT_TRUE(manager_->SwitchInputMethod( ui::Accelerator(ui::VKEY_DBE_SBCSCHAR, ui::EF_NONE))); EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("jp", xkeyboard_->last_layout_); - manager_->SwitchToPreviousInputMethod(); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator)); + EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator)); EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id()); EXPECT_EQ("us", xkeyboard_->last_layout_); EXPECT_TRUE(manager_->SwitchInputMethod( diff --git a/chrome/browser/chromeos/input_method/mock_input_method_manager.cc b/chrome/browser/chromeos/input_method/mock_input_method_manager.cc index 4e5cf82..4aeef61 100644 --- a/chrome/browser/chromeos/input_method/mock_input_method_manager.cc +++ b/chrome/browser/chromeos/input_method/mock_input_method_manager.cc @@ -124,7 +124,8 @@ bool MockInputMethodManager::SwitchToNextInputMethod() { return true; } -bool MockInputMethodManager::SwitchToPreviousInputMethod() { +bool MockInputMethodManager::SwitchToPreviousInputMethod( + const ui::Accelerator& accelerator) { return true; } diff --git a/chrome/browser/chromeos/input_method/mock_input_method_manager.h b/chrome/browser/chromeos/input_method/mock_input_method_manager.h index aa001c8..5db4950 100644 --- a/chrome/browser/chromeos/input_method/mock_input_method_manager.h +++ b/chrome/browser/chromeos/input_method/mock_input_method_manager.h @@ -63,7 +63,8 @@ class MockInputMethodManager : public InputMethodManager { InputMethodDescriptors* result) OVERRIDE; virtual void SetEnabledExtensionImes(std::vector<std::string>* ids) OVERRIDE; virtual bool SwitchToNextInputMethod() OVERRIDE; - virtual bool SwitchToPreviousInputMethod() OVERRIDE; + virtual bool SwitchToPreviousInputMethod( + const ui::Accelerator& accelerator) OVERRIDE; virtual bool SwitchInputMethod(const ui::Accelerator& accelerator) OVERRIDE; virtual InputMethodDescriptor GetCurrentInputMethod() const OVERRIDE; virtual InputMethodPropertyList diff --git a/chrome/browser/ui/ash/ime_controller_chromeos.cc b/chrome/browser/ui/ash/ime_controller_chromeos.cc index 239b1d0..fca4702 100644 --- a/chrome/browser/ui/ash/ime_controller_chromeos.cc +++ b/chrome/browser/ui/ash/ime_controller_chromeos.cc @@ -13,10 +13,10 @@ bool ImeController::HandleNextIme() { return manager->SwitchToNextInputMethod(); } -bool ImeController::HandlePreviousIme() { +bool ImeController::HandlePreviousIme(const ui::Accelerator& accelerator) { chromeos::input_method::InputMethodManager* manager = chromeos::input_method::InputMethodManager::Get(); - return manager->SwitchToPreviousInputMethod(); + return manager->SwitchToPreviousInputMethod(accelerator); } bool ImeController::HandleSwitchIme(const ui::Accelerator& accelerator) { diff --git a/chrome/browser/ui/ash/ime_controller_chromeos.h b/chrome/browser/ui/ash/ime_controller_chromeos.h index e0f2e64..bdfa28e 100644 --- a/chrome/browser/ui/ash/ime_controller_chromeos.h +++ b/chrome/browser/ui/ash/ime_controller_chromeos.h @@ -18,7 +18,7 @@ class ImeController : public ash::ImeControlDelegate { // Overridden from ash::ImeControlDelegate: virtual bool HandleNextIme() OVERRIDE; - virtual bool HandlePreviousIme() OVERRIDE; + virtual bool HandlePreviousIme(const ui::Accelerator& accelerator) OVERRIDE; virtual bool HandleSwitchIme(const ui::Accelerator& accelerator) OVERRIDE; virtual ui::Accelerator RemapAccelerator( const ui::Accelerator& accelerator) OVERRIDE; diff --git a/chromeos/ime/input_method_manager.h b/chromeos/ime/input_method_manager.h index e2d38dd..5a94455 100644 --- a/chromeos/ime/input_method_manager.h +++ b/chromeos/ime/input_method_manager.h @@ -190,7 +190,8 @@ class CHROMEOS_EXPORT InputMethodManager { virtual bool SwitchToNextInputMethod() = 0; // Switches the current input method (or keyboard layout) to the previous one. - virtual bool SwitchToPreviousInputMethod() = 0; + virtual bool SwitchToPreviousInputMethod( + const ui::Accelerator& accelerator) = 0; // Switches to an input method (or keyboard layout) which is associated with // the |accelerator|. |