Index: content/browser/renderer_host/render_widget_host_view_android.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
index 9c45d7c59a1af24c656f67fd6af09bff7eb926ae..7a7335e2916f2ffe057ba4aba9dea73bc73c7f1f 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -73,6 +73,11 @@ void InsertSyncPointAndAckForCompositor( |
route_id, renderer_host_id, ack); |
} |
+// Sends an acknowledgement to the renderer of a processed IME event. |
+void SendImeEventAck(RenderWidgetHostImpl* host) { |
+ host->Send(new ViewMsg_ImeEventAck(host->GetRoutingID())); |
+} |
+ |
} // anonymous namespace |
RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
@@ -83,6 +88,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
are_layers_attached_(true), |
content_view_core_(NULL), |
ime_adapter_android_(this), |
+ has_ordered_ime_processing_(false), |
cached_background_color_(SK_ColorWHITE), |
texture_id_in_layer_(0), |
weak_ptr_factory_(this), |
@@ -114,6 +120,10 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
true); |
} |
+ has_ordered_ime_processing_ = |
+ CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableOrderedImeProcessing); |
+ |
host_->SetView(this); |
SetContentViewCore(content_view_core); |
} |
@@ -390,6 +400,11 @@ int RenderWidgetHostViewAndroid::GetNativeImeAdapter() { |
void RenderWidgetHostViewAndroid::OnTextInputStateChanged( |
const ViewHostMsg_TextInputState_Params& params) { |
+ if (has_ordered_ime_processing()) { |
+ // Regardless of how we exit from this method, we must acknowledge that we |
+ // processed the input state change. |
+ base::ScopedClosureRunner ackCaller(base::Bind(&SendImeEventAck, host_)); |
+ } |
if (!IsShowing()) |
return; |