summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/accelerators/accelerator_controller.cc2
-rw-r--r--ash/accelerators/accelerator_controller_unittest.cc3
-rw-r--r--ash/accelerators/accelerator_table.cc1
-rw-r--r--ash/ime_control_delegate.h2
-rw-r--r--chrome/browser/chromeos/input_method/input_method_manager_impl.cc6
-rw-r--r--chrome/browser/chromeos/input_method/input_method_manager_impl.h3
-rw-r--r--chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc64
-rw-r--r--chrome/browser/chromeos/input_method/mock_input_method_manager.cc3
-rw-r--r--chrome/browser/chromeos/input_method/mock_input_method_manager.h3
-rw-r--r--chrome/browser/ui/ash/ime_controller_chromeos.cc4
-rw-r--r--chrome/browser/ui/ash/ime_controller_chromeos.h2
-rw-r--r--chromeos/ime/input_method_manager.h3
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|.