Index: ui/base/ime/input_method_chromeos.cc |
diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc |
index 47c9c1678e6d34ecd3380e9e43f12acc520565e9..c624a0fc20bd63dae859f4e05ad50bf2196f79b3 100644 |
--- a/ui/base/ime/input_method_chromeos.cc |
+++ b/ui/base/ime/input_method_chromeos.cc |
@@ -71,7 +71,7 @@ bool InputMethodChromeOS::OnUntranslatedIMEMessage( |
return false; |
} |
-void InputMethodChromeOS::ProcessKeyEventDone(const ui::KeyEvent* event, |
+void InputMethodChromeOS::ProcessKeyEventDone(ui::KeyEvent* event, |
bool is_handled) { |
DCHECK(event); |
if (event->type() == ET_KEY_PRESSED) { |
@@ -87,14 +87,14 @@ void InputMethodChromeOS::ProcessKeyEventDone(const ui::KeyEvent* event, |
} |
if (event->type() == ET_KEY_PRESSED || event->type() == ET_KEY_RELEASED) |
- ProcessKeyEventPostIME(*event, is_handled); |
+ ProcessKeyEventPostIME(event, is_handled); |
handling_key_event_ = false; |
} |
-bool InputMethodChromeOS::DispatchKeyEvent(const ui::KeyEvent& event) { |
- DCHECK(event.IsKeyEvent()); |
- DCHECK(!(event.flags() & ui::EF_IS_SYNTHESIZED)); |
+void InputMethodChromeOS::DispatchKeyEvent(ui::KeyEvent* event) { |
+ DCHECK(event->IsKeyEvent()); |
+ DCHECK(!(event->flags() & ui::EF_IS_SYNTHESIZED)); |
DCHECK(system_toplevel_window_focused()); |
// For linux_chromeos, the ime keyboard cannot track the caps lock state by |
@@ -105,10 +105,10 @@ bool InputMethodChromeOS::DispatchKeyEvent(const ui::KeyEvent& event) { |
chromeos::input_method::InputMethodManager::Get(); |
if (manager) { |
chromeos::input_method::ImeKeyboard* keyboard = manager->GetImeKeyboard(); |
- if (keyboard && event.type() == ui::ET_KEY_PRESSED) { |
- bool caps = (event.key_code() == ui::VKEY_CAPITAL) |
+ if (keyboard && event->type() == ui::ET_KEY_PRESSED) { |
+ bool caps = (event->key_code() == ui::VKEY_CAPITAL) |
? !keyboard->CapsLockIsEnabled() |
- : (event.flags() & EF_CAPS_LOCK_DOWN); |
+ : (event->flags() & EF_CAPS_LOCK_DOWN); |
keyboard->SetCapsLockEnabled(caps); |
} |
} |
@@ -120,32 +120,31 @@ bool InputMethodChromeOS::DispatchKeyEvent(const ui::KeyEvent& event) { |
// Note: We need to send the key event to ibus even if the |context_| is not |
// enabled, so that ibus can have a chance to enable the |context_|. |
if (!IsNonPasswordInputFieldFocused() || !GetEngine()) { |
- if (event.type() == ET_KEY_PRESSED) { |
- if (ExecuteCharacterComposer(event)) { |
+ if (event->type() == ET_KEY_PRESSED) { |
+ if (ExecuteCharacterComposer(*event)) { |
// Treating as PostIME event if character composer handles key event and |
// generates some IME event, |
ProcessKeyEventPostIME(event, true); |
- return true; |
+ return; |
} |
ProcessUnfilteredKeyPressEvent(event); |
} else { |
- DispatchKeyEventPostIME(event); |
+ ignore_result(DispatchKeyEventPostIME(event)); |
} |
- return true; |
+ return; |
} |
handling_key_event_ = true; |
if (GetEngine()->IsInterestedInKeyEvent()) { |
GetEngine()->ProcessKeyEvent( |
- event, |
+ *event, |
base::Bind(&InputMethodChromeOS::ProcessKeyEventDone, |
weak_ptr_factory_.GetWeakPtr(), |
// Pass the ownership of the new copied event. |
- base::Owned(new ui::KeyEvent(event)))); |
+ base::Owned(new ui::KeyEvent(*event)))); |
} else { |
- ProcessKeyEventDone(&event, false); |
+ ProcessKeyEventDone(event, false); |
} |
- return true; |
} |
void InputMethodChromeOS::OnTextInputTypeChanged( |
@@ -336,18 +335,19 @@ void InputMethodChromeOS::UpdateContextFocusState() { |
OnCaretBoundsChanged(GetTextInputClient()); |
} |
-void InputMethodChromeOS::ProcessKeyEventPostIME(const ui::KeyEvent& event, |
+void InputMethodChromeOS::ProcessKeyEventPostIME(ui::KeyEvent* event, |
bool handled) { |
TextInputClient* client = GetTextInputClient(); |
if (!client) { |
// As ibus works asynchronously, there is a chance that the focused client |
// loses focus before this method gets called. |
- DispatchKeyEventPostIME(event); |
+ ignore_result(DispatchKeyEventPostIME(event)); |
return; |
} |
- if (event.type() == ET_KEY_PRESSED && handled) { |
- if (ProcessFilteredKeyPressEvent(event)) { |
+ if (event->type() == ET_KEY_PRESSED && handled) { |
+ ProcessFilteredKeyPressEvent(event); |
+ if (event->stopped_propagation()) { |
ResetContext(); |
return; |
} |
@@ -369,26 +369,30 @@ void InputMethodChromeOS::ProcessKeyEventPostIME(const ui::KeyEvent& event, |
if (handled) |
return; // IME handled the key event. do not forward. |
- if (event.type() == ET_KEY_PRESSED) |
+ if (event->type() == ET_KEY_PRESSED) |
ProcessUnfilteredKeyPressEvent(event); |
- else if (event.type() == ET_KEY_RELEASED) |
- DispatchKeyEventPostIME(event); |
+ else if (event->type() == ET_KEY_RELEASED) |
+ ignore_result(DispatchKeyEventPostIME(event)); |
} |
-bool InputMethodChromeOS::ProcessFilteredKeyPressEvent( |
- const ui::KeyEvent& event) { |
- if (NeedInsertChar()) |
- return DispatchKeyEventPostIME(event); |
- const ui::KeyEvent fabricated_event(ET_KEY_PRESSED, |
- VKEY_PROCESSKEY, |
- event.flags()); |
- return DispatchKeyEventPostIME(fabricated_event); |
+void InputMethodChromeOS::ProcessFilteredKeyPressEvent(ui::KeyEvent* event) { |
+ if (NeedInsertChar()) { |
+ ignore_result(DispatchKeyEventPostIME(event)); |
+ return; |
+ } |
+ ui::KeyEvent fabricated_event(ET_KEY_PRESSED, |
+ VKEY_PROCESSKEY, |
+ event->flags()); |
+ ignore_result(DispatchKeyEventPostIME(&fabricated_event)); |
+ if (fabricated_event.stopped_propagation()) |
+ event->StopPropagation(); |
} |
void InputMethodChromeOS::ProcessUnfilteredKeyPressEvent( |
- const ui::KeyEvent& event) { |
+ ui::KeyEvent* event) { |
const TextInputClient* prev_client = GetTextInputClient(); |
- if (DispatchKeyEventPostIME(event)) { |
+ ignore_result(DispatchKeyEventPostIME(event)); |
+ if (event->stopped_propagation()) { |
ResetContext(); |
return; |
} |
@@ -407,12 +411,12 @@ void InputMethodChromeOS::ProcessUnfilteredKeyPressEvent( |
// If a key event was not filtered by |context_| and |character_composer_|, |
// then it means the key event didn't generate any result text. So we need |
// to send corresponding character to the focused text input client. |
- uint16 ch = event.GetCharacter(); |
+ uint16 ch = event->GetCharacter(); |
if (ch) |
- client->InsertChar(ch, event.flags()); |
+ client->InsertChar(ch, event->flags()); |
} |
-void InputMethodChromeOS::ProcessInputMethodResult(const ui::KeyEvent& event, |
+void InputMethodChromeOS::ProcessInputMethodResult(ui::KeyEvent* event, |
bool handled) { |
TextInputClient* client = GetTextInputClient(); |
DCHECK(client); |
@@ -421,7 +425,7 @@ void InputMethodChromeOS::ProcessInputMethodResult(const ui::KeyEvent& event, |
if (handled && NeedInsertChar()) { |
for (base::string16::const_iterator i = result_text_.begin(); |
i != result_text_.end(); ++i) { |
- client->InsertChar(*i, event.flags()); |
+ client->InsertChar(*i, event->flags()); |
} |
} else { |
client->InsertText(result_text_); |
@@ -454,13 +458,12 @@ bool InputMethodChromeOS::HasInputMethodResult() const { |
return result_text_.length() || composition_changed_; |
} |
-void InputMethodChromeOS::SendFakeProcessKeyEvent(bool pressed) const { |
- if (!GetTextInputClient()) |
- return; |
+bool InputMethodChromeOS::SendFakeProcessKeyEvent(bool pressed) const { |
KeyEvent evt(pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED, |
pressed ? VKEY_PROCESSKEY : VKEY_UNKNOWN, |
EF_IME_FABRICATED_KEY); |
- DispatchKeyEventPostIME(evt); |
+ ignore_result(DispatchKeyEventPostIME(&evt)); |
+ return evt.stopped_propagation(); |
} |
void InputMethodChromeOS::CommitText(const std::string& text) { |
@@ -484,8 +487,8 @@ void InputMethodChromeOS::CommitText(const std::string& text) { |
// If we are not handling key event, do not bother sending text result if the |
// focused text input client does not support text input. |
if (!handling_key_event_ && !IsTextInputTypeNone()) { |
- SendFakeProcessKeyEvent(true); |
- GetTextInputClient()->InsertText(utf16_text); |
+ if (!SendFakeProcessKeyEvent(true)) |
+ GetTextInputClient()->InsertText(utf16_text); |
SendFakeProcessKeyEvent(false); |
result_text_.clear(); |
} |
@@ -528,8 +531,8 @@ void InputMethodChromeOS::UpdateCompositionText( |
if (!handling_key_event_) { |
// If we receive a composition text without pending key event, then we need |
// to send it to the focused text input client directly. |
- SendFakeProcessKeyEvent(true); |
- GetTextInputClient()->SetCompositionText(composition_); |
+ if (!SendFakeProcessKeyEvent(true)) |
+ GetTextInputClient()->SetCompositionText(composition_); |
SendFakeProcessKeyEvent(false); |
composition_changed_ = false; |
composition_.Clear(); |
@@ -547,8 +550,8 @@ void InputMethodChromeOS::HidePreeditText() { |
if (!handling_key_event_) { |
TextInputClient* client = GetTextInputClient(); |
if (client && client->HasCompositionText()) { |
- SendFakeProcessKeyEvent(true); |
- client->ClearCompositionText(); |
+ if (!SendFakeProcessKeyEvent(true)) |
+ client->ClearCompositionText(); |
SendFakeProcessKeyEvent(false); |
} |
composition_changed_ = false; |