Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(380)

Unified Diff: content/renderer/render_widget.cc

Issue 18750003: Require ACK for editor-related changes not originating from browser. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_widget.cc
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 3e7b5daf954ccc7c02eae09f7cf3e171ce80a988..829abe6d4a35b9f4a129daca0ca38908326befa2 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();
@@ -389,6 +392,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,
@@ -897,7 +901,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(true, true);
#endif
handling_input_event_ = false;
@@ -1587,7 +1591,7 @@ void RenderWidget::willBeginCompositorFrame() {
// is done.
UpdateTextInputType();
#if defined(OS_ANDROID)
- UpdateTextInputState(DO_NOT_SHOW_IME);
+ UpdateTextInputState(false, true);
#endif
UpdateSelectionBounds();
@@ -1812,7 +1816,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(
@@ -1831,7 +1835,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;
@@ -2014,9 +2018,26 @@ void RenderWidget::OnImeBatchStateChanged(bool is_begin) {
}
void RenderWidget::OnShowImeIfNeeded() {
- UpdateTextInputState(SHOW_IME_IF_NEEDED);
+ UpdateTextInputState(true, true);
}
+
+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)
@@ -2130,7 +2151,7 @@ void RenderWidget::FinishHandlingImeEvent() {
// ime event.
UpdateSelectionBounds();
#if defined(OS_ANDROID)
- UpdateTextInputState(DO_NOT_SHOW_IME);
+ UpdateTextInputState(false, false);
#endif
}
@@ -2163,10 +2184,10 @@ void RenderWidget::UpdateTextInputType() {
}
#if defined(OS_ANDROID)
-void RenderWidget::UpdateTextInputState(ShowIme show_ime) {
+void RenderWidget::UpdateTextInputState(bool show_ime_if_needed,
+ bool send_ime_ack) {
if (handling_ime_event_)
return;
- bool show_ime_if_needed = (show_ime == SHOW_IME_IF_NEEDED);
if (!show_ime_if_needed && !input_method_is_active_)
return;
ui::TextInputType new_type = GetTextInputType();
@@ -2193,6 +2214,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 = send_ime_ack;
+ if (p.require_ack)
+ IncrementOutstandingImeEventAcks();
Send(new ViewHostMsg_TextInputStateChanged(routing_id(), p));
text_input_info_ = new_info;
@@ -2373,7 +2397,7 @@ void RenderWidget::didHandleGestureEvent(
return;
if (event.type == WebInputEvent::GestureTap ||
event.type == WebInputEvent::GestureLongPress) {
- UpdateTextInputState(SHOW_IME_IF_NEEDED);
+ UpdateTextInputState(true, true);
}
#endif
}
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698