Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index 2ece7075add91125890a1c8b7bdfb2b73940e1b4..46b2b75480431ee619f1390b1143b273b6224989 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -498,7 +498,8 @@ RenderWidget::RenderWidget(CompositorDependencies* compositor_deps, |
display_mode_(blink::WebDisplayModeUndefined), |
handling_input_event_(false), |
handling_event_overscroll_(nullptr), |
- handling_ime_event_(false), |
+ handling_ime_events_count_(0), |
+ pending_show_ime_if_needed_(false), |
handling_event_type_(WebInputEvent::Undefined), |
ignore_ack_for_mouse_move_from_debugger_(false), |
closing_(false), |
@@ -517,6 +518,7 @@ RenderWidget::RenderWidget(CompositorDependencies* compositor_deps, |
next_output_surface_id_(0), |
#if defined(OS_ANDROID) |
text_field_is_dirty_(false), |
+ pending_update_from_non_ime_(false), |
#endif |
popup_origin_scale_for_emulation_(0.f), |
frame_swap_message_queue_(new FrameSwapMessageQueue()), |
@@ -1069,27 +1071,11 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
handling_event_overscroll_resetter(&handling_event_overscroll_, |
&event_overscroll); |
-#if defined(OS_ANDROID) |
- // On Android, when a key is pressed or sent from the Keyboard using IME, |
- // |AdapterInputConnection| generates input key events to make sure all JS |
- // listeners that monitor KeyUp and KeyDown events receive the proper key |
- // code. Since this input key event comes from IME, we need to set the |
- // IME event guard here to make sure it does not interfere with other IME |
- // events. |
- scoped_ptr<ImeEventGuard> ime_event_guard_maybe; |
- if (WebInputEvent::isKeyboardEventType(input_event->type)) { |
- const WebKeyboardEvent& key_event = |
- *static_cast<const WebKeyboardEvent*>(input_event); |
- // Some keys are special and it's essential that no events get blocked. |
- if (key_event.nativeKeyCode != AKEYCODE_TAB && |
- key_event.nativeKeyCode != AKEYCODE_DPAD_CENTER && |
- key_event.nativeKeyCode != AKEYCODE_DPAD_LEFT && |
- key_event.nativeKeyCode != AKEYCODE_DPAD_RIGHT && |
- key_event.nativeKeyCode != AKEYCODE_DPAD_UP && |
- key_event.nativeKeyCode != AKEYCODE_DPAD_DOWN) |
- ime_event_guard_maybe.reset(new ImeEventGuard(this)); |
- } |
-#endif |
+ const bool is_keyboard_event = |
+ WebInputEvent::isKeyboardEventType(input_event->type); |
+ |
+ // For non-keyboard events, we want the change source to be FROM_NON_IME. |
+ ImeEventGuard guard(this, !is_keyboard_event); |
base::TimeTicks start_time; |
if (base::TimeTicks::IsHighResolution()) |
@@ -1879,27 +1865,46 @@ static bool IsDateTimeInput(ui::TextInputType type) { |
void RenderWidget::StartHandlingImeEvent() { |
- DCHECK(!handling_ime_event_); |
- handling_ime_event_ = true; |
+ ++handling_ime_events_count_; |
} |
-void RenderWidget::FinishHandlingImeEvent() { |
- DCHECK(handling_ime_event_); |
- handling_ime_event_ = false; |
+void RenderWidget::FinishHandlingImeEvent(bool from_non_ime) { |
+ --handling_ime_events_count_; |
+ CHECK_GE(handling_ime_events_count_, 0); |
+#if defined(OS_ANDROID) |
+ // From non-IME source should take precedence because AdapterInputConnection |
+ // makes real changes only when it's not originating from IME. |
+ pending_update_from_non_ime_ |= from_non_ime; |
+#endif |
+ if (handling_ime_events_count_ > 0) |
+ return; |
+ |
// While handling an ime event, text input state and selection bounds updates |
// are ignored. These must explicitly be updated once finished handling the |
// ime event. |
UpdateSelectionBounds(); |
#if defined(OS_ANDROID) |
- UpdateTextInputState(NO_SHOW_IME, FROM_IME); |
+ UpdateTextInputState(NO_SHOW_IME, |
+ pending_update_from_non_ime_ ? FROM_NON_IME : FROM_IME); |
+ pending_update_from_non_ime_ = false; |
#endif |
} |
void RenderWidget::UpdateTextInputState(ShowIme show_ime, |
ChangeSource change_source) { |
TRACE_EVENT0("renderer", "RenderWidget::UpdateTextInputState"); |
- if (handling_ime_event_) |
+ if (handling_ime_events_count_ > 0) { |
+ if (show_ime == SHOW_IME_IF_NEEDED) |
+ pending_show_ime_if_needed_ = true; |
+ |
return; |
+ } |
+ |
+ if (pending_show_ime_if_needed_) { |
+ show_ime = SHOW_IME_IF_NEEDED; |
+ pending_show_ime_if_needed_ = false; |
+ } |
+ |
ui::TextInputType new_type = GetTextInputType(); |
if (IsDateTimeInput(new_type)) |
return; // Not considered as a text input field in WebKit/Chromium. |
@@ -1965,7 +1970,7 @@ void RenderWidget::UpdateSelectionBounds() { |
TRACE_EVENT0("renderer", "RenderWidget::UpdateSelectionBounds"); |
if (!webwidget_) |
return; |
- if (handling_ime_event_) |
+ if (handling_ime_events_count_ > 0) |
return; |
#if defined(USE_AURA) |