| 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)
|
|
|