| Index: content/renderer/render_widget.cc
|
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
|
| index 605bae594e7992ee9dc6e1c596687ad9690695db..0a396ec8680ba48f22231aaa24606f4d975b3b76 100644
|
| --- a/content/renderer/render_widget.cc
|
| +++ b/content/renderer/render_widget.cc
|
| @@ -226,6 +226,9 @@ RenderWidget::RenderWidget(WebKit::WebPopupType popup_type,
|
| device_scale_factor_(screen_info_.deviceScaleFactor),
|
| is_threaded_compositing_enabled_(false),
|
| next_output_surface_id_(0),
|
| +#if defined(OS_ANDROID)
|
| + outstanding_ime_acks_(0),
|
| +#endif
|
| weak_ptr_factory_(this) {
|
| if (!swapped_out)
|
| RenderProcess::current()->AddRefProcess();
|
| @@ -385,6 +388,7 @@ bool RenderWidget::OnMessageReceived(const IPC::Message& message) {
|
| #if defined(OS_ANDROID)
|
| IPC_MESSAGE_HANDLER(ViewMsg_ImeBatchStateChanged, OnImeBatchStateChanged)
|
| IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_ImeEventAck, OnImeEventAck)
|
| #endif
|
| IPC_MESSAGE_HANDLER(ViewMsg_Snapshot, OnSnapshot)
|
| IPC_MESSAGE_HANDLER(ViewMsg_SetBrowserRenderingStats,
|
| @@ -887,7 +891,7 @@ void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event,
|
| // Allow the IME to be shown when the focus changes as a consequence
|
| // of a processed touch end event.
|
| if (input_event->type == WebInputEvent::TouchEnd && processed)
|
| - UpdateTextInputState(SHOW_IME_IF_NEEDED);
|
| + UpdateTextInputState(SHOW_IME_IF_NEEDED, SEND_IME_ACK);
|
| #endif
|
|
|
| handling_input_event_ = false;
|
| @@ -1577,7 +1581,7 @@ void RenderWidget::willBeginCompositorFrame() {
|
| // is done.
|
| UpdateTextInputType();
|
| #if defined(OS_ANDROID)
|
| - UpdateTextInputState(DO_NOT_SHOW_IME);
|
| + UpdateTextInputState(DO_NOT_SHOW_IME, SEND_IME_ACK);
|
| #endif
|
| UpdateSelectionBounds();
|
|
|
| @@ -1802,7 +1806,7 @@ void RenderWidget::OnImeSetComposition(
|
| const string16& text,
|
| const std::vector<WebCompositionUnderline>& underlines,
|
| int selection_start, int selection_end) {
|
| - if (!webwidget_)
|
| + if (!ShouldHandleImeEvent())
|
| return;
|
| ImeEventGuard guard(this);
|
| if (!webwidget_->setComposition(
|
| @@ -1821,7 +1825,7 @@ void RenderWidget::OnImeSetComposition(
|
| void RenderWidget::OnImeConfirmComposition(const string16& text,
|
| const ui::Range& replacement_range,
|
| bool keep_selection) {
|
| - if (!webwidget_)
|
| + if (!ShouldHandleImeEvent())
|
| return;
|
| ImeEventGuard guard(this);
|
| handling_input_event_ = true;
|
| @@ -2004,9 +2008,26 @@ void RenderWidget::OnImeBatchStateChanged(bool is_begin) {
|
| }
|
|
|
| void RenderWidget::OnShowImeIfNeeded() {
|
| - UpdateTextInputState(SHOW_IME_IF_NEEDED);
|
| + UpdateTextInputState(SHOW_IME_IF_NEEDED, SEND_IME_ACK);
|
| }
|
| +
|
| +void RenderWidget::IncrementOutstandingImeEventAcks() {
|
| + ++outstanding_ime_acks_;
|
| +}
|
| +
|
| +void RenderWidget::OnImeEventAck() {
|
| + --outstanding_ime_acks_;
|
| + DCHECK(outstanding_ime_acks_ >= 0);
|
| +}
|
| +#endif
|
| +
|
| +bool RenderWidget::ShouldHandleImeEvent() {
|
| +#if defined(OS_ANDROID)
|
| + return !!webwidget_ && outstanding_ime_acks_ == 0;
|
| +#else
|
| + return !!webwidget_;
|
| #endif
|
| +}
|
|
|
| void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) {
|
| if (device_scale_factor_ == device_scale_factor)
|
| @@ -2120,7 +2141,7 @@ void RenderWidget::FinishHandlingImeEvent() {
|
| // ime event.
|
| UpdateSelectionBounds();
|
| #if defined(OS_ANDROID)
|
| - UpdateTextInputState(DO_NOT_SHOW_IME);
|
| + UpdateTextInputState(DO_NOT_SHOW_IME, NO_IME_ACK);
|
| #endif
|
| }
|
|
|
| @@ -2153,7 +2174,7 @@ void RenderWidget::UpdateTextInputType() {
|
| }
|
|
|
| #if defined(OS_ANDROID)
|
| -void RenderWidget::UpdateTextInputState(ShowIme show_ime) {
|
| +void RenderWidget::UpdateTextInputState(ShowIme show_ime, ImeAck imeAck) {
|
| if (handling_ime_event_)
|
| return;
|
| bool show_ime_if_needed = (show_ime == SHOW_IME_IF_NEEDED);
|
| @@ -2183,6 +2204,9 @@ void RenderWidget::UpdateTextInputState(ShowIme show_ime) {
|
| p.composition_end = new_info.compositionEnd;
|
| p.can_compose_inline = new_can_compose_inline;
|
| p.show_ime_if_needed = show_ime_if_needed;
|
| + p.require_ack = imeAck == SEND_IME_ACK;
|
| + if (p.require_ack)
|
| + IncrementOutstandingImeEventAcks();
|
| Send(new ViewHostMsg_TextInputStateChanged(routing_id(), p));
|
|
|
| text_input_info_ = new_info;
|
| @@ -2363,7 +2387,7 @@ void RenderWidget::didHandleGestureEvent(
|
| return;
|
| if (event.type == WebInputEvent::GestureTap ||
|
| event.type == WebInputEvent::GestureLongPress) {
|
| - UpdateTextInputState(SHOW_IME_IF_NEEDED);
|
| + UpdateTextInputState(SHOW_IME_IF_NEEDED, SEND_IME_ACK);
|
| }
|
| #endif
|
| }
|
|
|