diff options
author | yoichio@chromium.org <yoichio@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-27 06:00:44 +0000 |
---|---|---|
committer | yoichio@chromium.org <yoichio@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-27 06:00:44 +0000 |
commit | 11a5eceb9bc0ac7b7615244db0c25939f5c63f51 (patch) | |
tree | a4a9f3033eaca2e0b84d3421fa8927074ca5df27 | |
parent | b48db42e1909c1229017c7e4141f0c839e2d8d0d (diff) | |
download | chromium_src-11a5eceb9bc0ac7b7615244db0c25939f5c63f51.zip chromium_src-11a5eceb9bc0ac7b7615244db0c25939f5c63f51.tar.gz chromium_src-11a5eceb9bc0ac7b7615244db0c25939f5c63f51.tar.bz2 |
Set focused TextInputMode to InputMethodEndingeIBus.
This doesn't change actual behavior.
BUG=244688
Review URL: https://codereview.chromium.org/73673002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@237527 0039d316-1c4b-4281-b951-d872f2087c98
8 files changed, 89 insertions, 36 deletions
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc b/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc index 1c7d121..dd7cc43 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc @@ -393,16 +393,17 @@ bool InputMethodEngineIBus::DeleteSurroundingText(int context_id, return true; } -void InputMethodEngineIBus::FocusIn(ui::TextInputType text_input_type) { +void InputMethodEngineIBus::FocusIn( + const IBusEngineHandlerInterface::InputContext& input_context) { focused_ = true; if (!active_) return; context_id_ = next_context_id_; ++next_context_id_; - InputContext context; + InputMethodEngine ::InputContext context; context.id = context_id_; - switch (text_input_type) { + switch (input_context.type) { case ui::TEXT_INPUT_TYPE_SEARCH: context.type = "search"; break; @@ -438,7 +439,9 @@ void InputMethodEngineIBus::FocusOut() { void InputMethodEngineIBus::Enable() { active_ = true; observer_->OnActivate(engine_id_); - FocusIn(ui::TEXT_INPUT_TYPE_TEXT); + IBusEngineHandlerInterface::InputContext context(ui::TEXT_INPUT_TYPE_TEXT, + ui::TEXT_INPUT_MODE_DEFAULT); + FocusIn(context); } void InputMethodEngineIBus::Disable() { diff --git a/chrome/browser/chromeos/input_method/input_method_engine_ibus.h b/chrome/browser/chromeos/input_method/input_method_engine_ibus.h index 8b3cc41..0871c54 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_ibus.h +++ b/chrome/browser/chromeos/input_method/input_method_engine_ibus.h @@ -77,7 +77,8 @@ class InputMethodEngineIBus : public InputMethodEngine, std::string* error) OVERRIDE; // IBusEngineHandlerInterface overrides. - virtual void FocusIn(ui::TextInputType text_input_type) OVERRIDE; + virtual void FocusIn( + const IBusEngineHandlerInterface::InputContext& input_context) OVERRIDE; virtual void FocusOut() OVERRIDE; virtual void Enable() OVERRIDE; virtual void Disable() OVERRIDE; diff --git a/chrome/browser/chromeos/input_method/input_method_engine_ibus_browserttests.cc b/chrome/browser/chromeos/input_method/input_method_engine_ibus_browserttests.cc index 94d1082..c8e5c29 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_ibus_browserttests.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine_ibus_browserttests.cc @@ -176,8 +176,10 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, ASSERT_TRUE(activated_listener.was_satisfied()); // onFocus event should be fired if FocusIn function is called. - ExtensionTestMessageListener focus_listener("onFocus:text", false);; - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_TEXT); + ExtensionTestMessageListener focus_listener("onFocus:text", false); + IBusEngineHandlerInterface::InputContext context(ui::TEXT_INPUT_TYPE_TEXT, + ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); @@ -254,7 +256,9 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, 1); engine_handler->Enable(); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_TEXT); + IBusEngineHandlerInterface::InputContext context(ui::TEXT_INPUT_TYPE_TEXT, + ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); { SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:No"); @@ -778,37 +782,49 @@ IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, { ExtensionTestMessageListener focus_listener("onFocus:text", false); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_TEXT); + IBusEngineHandlerInterface::InputContext context( + ui::TEXT_INPUT_TYPE_TEXT, ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); } { ExtensionTestMessageListener focus_listener("onFocus:search", false); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_SEARCH); + IBusEngineHandlerInterface::InputContext context( + ui::TEXT_INPUT_TYPE_SEARCH, ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); } { ExtensionTestMessageListener focus_listener("onFocus:tel", false); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_TELEPHONE); + IBusEngineHandlerInterface::InputContext context( + ui::TEXT_INPUT_TYPE_TELEPHONE, ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); } { ExtensionTestMessageListener focus_listener("onFocus:url", false); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_URL); + IBusEngineHandlerInterface::InputContext context( + ui::TEXT_INPUT_TYPE_URL, ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); } { ExtensionTestMessageListener focus_listener("onFocus:email", false); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_EMAIL); + IBusEngineHandlerInterface::InputContext context( + ui::TEXT_INPUT_TYPE_EMAIL, ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); } { ExtensionTestMessageListener focus_listener("onFocus:number", false); - engine_handler->FocusIn(ui::TEXT_INPUT_TYPE_NUMBER); + IBusEngineHandlerInterface::InputContext context( + ui::TEXT_INPUT_TYPE_NUMBER, ui::TEXT_INPUT_MODE_DEFAULT); + engine_handler->FocusIn(context); ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); ASSERT_TRUE(focus_listener.was_satisfied()); } diff --git a/ui/base/ime/chromeos/ibus_bridge.h b/ui/base/ime/chromeos/ibus_bridge.h index be0ed80..5af7ea4 100644 --- a/ui/base/ime/chromeos/ibus_bridge.h +++ b/ui/base/ime/chromeos/ibus_bridge.h @@ -9,6 +9,7 @@ #include <string> #include "base/basictypes.h" #include "base/callback.h" +#include "ui/base/ime/text_input_mode.h" #include "ui/base/ime/text_input_type.h" #include "ui/base/ui_export.h" @@ -53,10 +54,27 @@ class UI_EXPORT IBusEngineHandlerInterface { public: typedef base::Callback<void (bool consumed)> KeyEventDoneCallback; + // A information about a focused text input field. + // A type of each member is based on the html spec, but InputContext can be + // used to specify about a non html text field like Omnibox. + struct InputContext { + InputContext(ui::TextInputType type_, ui::TextInputMode mode_) : + type(type_), mode(mode_) {} + + // An attribute of the field defined at + // http://www.w3.org/TR/html401/interact/forms.html#input-control-types. + ui::TextInputType type; + // An attribute of the field defined at + // http://www.whatwg.org/specs/web-apps/current-work/multipage/ + // association-of-controls-and-forms.html#input-modalities + // :-the-inputmode-attribute. + ui::TextInputMode mode; + }; + virtual ~IBusEngineHandlerInterface() {} // Called when the Chrome input field get the focus. - virtual void FocusIn(ui::TextInputType text_input_type) = 0; + virtual void FocusIn(const InputContext& input_context) = 0; // Called when the Chrome input field lose the focus. virtual void FocusOut() = 0; diff --git a/ui/base/ime/chromeos/mock_ime_engine_handler.cc b/ui/base/ime/chromeos/mock_ime_engine_handler.cc index 430f750..d7e664f 100644 --- a/ui/base/ime/chromeos/mock_ime_engine_handler.cc +++ b/ui/base/ime/chromeos/mock_ime_engine_handler.cc @@ -12,7 +12,8 @@ MockIMEEngineHandler::MockIMEEngineHandler() set_surrounding_text_call_count_(0), process_key_event_call_count_(0), reset_call_count_(0), - last_text_input_type_(ui::TEXT_INPUT_TYPE_NONE), + last_text_input_context_(ui::TEXT_INPUT_TYPE_NONE, + ui::TEXT_INPUT_MODE_DEFAULT), last_set_surrounding_cursor_pos_(0), last_set_surrounding_anchor_pos_(0), last_processed_keysym_(0), @@ -23,9 +24,9 @@ MockIMEEngineHandler::MockIMEEngineHandler() MockIMEEngineHandler::~MockIMEEngineHandler() { } -void MockIMEEngineHandler::FocusIn(ui::TextInputType text_input_type) { +void MockIMEEngineHandler::FocusIn(const InputContext& input_context) { ++focus_in_call_count_; - last_text_input_type_ = text_input_type; + last_text_input_context_ = input_context; } void MockIMEEngineHandler::FocusOut() { diff --git a/ui/base/ime/chromeos/mock_ime_engine_handler.h b/ui/base/ime/chromeos/mock_ime_engine_handler.h index ddff40c..56fc259 100644 --- a/ui/base/ime/chromeos/mock_ime_engine_handler.h +++ b/ui/base/ime/chromeos/mock_ime_engine_handler.h @@ -15,7 +15,7 @@ class UI_EXPORT MockIMEEngineHandler : public IBusEngineHandlerInterface { MockIMEEngineHandler(); virtual ~MockIMEEngineHandler(); - virtual void FocusIn(ui::TextInputType text_input_type) OVERRIDE; + virtual void FocusIn(const InputContext& input_context) OVERRIDE; virtual void FocusOut() OVERRIDE; virtual void Enable() OVERRIDE; virtual void Disable() OVERRIDE; @@ -38,8 +38,8 @@ class UI_EXPORT MockIMEEngineHandler : public IBusEngineHandlerInterface { return process_key_event_call_count_; } - ui::TextInputType last_text_input_type() const { - return last_text_input_type_; + const InputContext& last_text_input_context() const { + return last_text_input_context_; } std::string last_activated_property() const { @@ -80,7 +80,7 @@ class UI_EXPORT MockIMEEngineHandler : public IBusEngineHandlerInterface { int set_surrounding_text_call_count_; int process_key_event_call_count_; int reset_call_count_; - ui::TextInputType last_text_input_type_; + InputContext last_text_input_context_; std::string last_activated_property_; std::string last_set_surrounding_text_; uint32 last_set_surrounding_cursor_pos_; diff --git a/ui/base/ime/input_method_ibus.cc b/ui/base/ime/input_method_ibus.cc index d7c4b62..ac503a9 100644 --- a/ui/base/ime/input_method_ibus.cc +++ b/ui/base/ime/input_method_ibus.cc @@ -406,16 +406,17 @@ void InputMethodIBus::UpdateContextFocusState() { return; // We only focus in |context_| when the focus is in a normal textfield. + // Even if focus is not changed, a text input type change causes a focus + // blink. // ibus_input_context_focus_{in|out}() run asynchronously. - if (old_context_focused && !context_focused_) { + bool input_type_change = + (current_text_input_type != previous_textinput_type_); + if (old_context_focused && (!context_focused_ || input_type_change)) GetEngine()->FocusOut(); - } else if (!old_context_focused && context_focused_) { - GetEngine()->FocusIn(current_text_input_type); - OnCaretBoundsChanged(GetTextInputClient()); - } else if (context_focused_ && - current_text_input_type != previous_textinput_type_) { - GetEngine()->FocusOut(); - GetEngine()->FocusIn(current_text_input_type); + if (context_focused_ && (!old_context_focused || input_type_change)) { + chromeos::IBusEngineHandlerInterface::InputContext context( + current_text_input_type, GetTextInputMode()); + GetEngine()->FocusIn(context); OnCaretBoundsChanged(GetTextInputClient()); } } diff --git a/ui/base/ime/input_method_ibus_unittest.cc b/ui/base/ime/input_method_ibus_unittest.cc index 9750e66..44c0594 100644 --- a/ui/base/ime/input_method_ibus_unittest.cc +++ b/ui/base/ime/input_method_ibus_unittest.cc @@ -279,7 +279,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate, return input_type_; } virtual TextInputMode GetTextInputMode() const OVERRIDE { - return TEXT_INPUT_MODE_DEFAULT; + return input_mode_; } virtual bool CanComposeInline() const OVERRIDE { return can_compose_inline_; @@ -349,6 +349,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate, on_input_method_changed_call_count_ = 0; input_type_ = TEXT_INPUT_TYPE_NONE; + input_mode_ = TEXT_INPUT_MODE_DEFAULT; can_compose_inline_ = true; caret_bounds_ = gfx::Rect(); } @@ -373,6 +374,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate, // Variables that will be returned from the ui::TextInputClient functions. TextInputType input_type_; + TextInputMode input_mode_; bool can_compose_inline_; gfx::Rect caret_bounds_; gfx::Range text_range_; @@ -537,22 +539,31 @@ TEST_F(InputMethodIBusTest, Focus_Scenario) { EXPECT_EQ(0, mock_ime_engine_handler_->focus_in_call_count()); EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count()); EXPECT_EQ(TEXT_INPUT_TYPE_NONE, - mock_ime_engine_handler_->last_text_input_type()); + mock_ime_engine_handler_->last_text_input_context().type); + EXPECT_EQ(TEXT_INPUT_MODE_DEFAULT, + mock_ime_engine_handler_->last_text_input_context().mode); input_type_ = TEXT_INPUT_TYPE_TEXT; + input_mode_ = TEXT_INPUT_MODE_LATIN; ime_->OnTextInputTypeChanged(this); - // Confirm that only FocusIn is called and the TextInputType is TEXT. + // Confirm that only FocusIn is called, the TextInputType is TEXT and the + // TextInputMode is LATIN.. EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count()); EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count()); EXPECT_EQ(TEXT_INPUT_TYPE_TEXT, - mock_ime_engine_handler_->last_text_input_type()); + mock_ime_engine_handler_->last_text_input_context().type); + EXPECT_EQ(TEXT_INPUT_MODE_LATIN, + mock_ime_engine_handler_->last_text_input_context().mode); + input_mode_ = TEXT_INPUT_MODE_KANA; ime_->OnTextInputTypeChanged(this); // Confirm that both FocusIn and FocusOut are NOT called. EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count()); EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count()); EXPECT_EQ(TEXT_INPUT_TYPE_TEXT, - mock_ime_engine_handler_->last_text_input_type()); + mock_ime_engine_handler_->last_text_input_context().type); + EXPECT_EQ(TEXT_INPUT_MODE_LATIN, + mock_ime_engine_handler_->last_text_input_context().mode); input_type_ = TEXT_INPUT_TYPE_URL; ime_->OnTextInputTypeChanged(this); @@ -561,7 +572,9 @@ TEST_F(InputMethodIBusTest, Focus_Scenario) { EXPECT_EQ(2, mock_ime_engine_handler_->focus_in_call_count()); EXPECT_EQ(1, mock_ime_engine_handler_->focus_out_call_count()); EXPECT_EQ(TEXT_INPUT_TYPE_URL, - mock_ime_engine_handler_->last_text_input_type()); + mock_ime_engine_handler_->last_text_input_context().type); + EXPECT_EQ(TEXT_INPUT_MODE_KANA, + mock_ime_engine_handler_->last_text_input_context().mode); } // Test if the new |caret_bounds_| is correctly sent to ibus-daemon. |