Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index 5c82eda23832f6bf500bb5cb2975ce53e2c71cbd..6d69198747eb5cc87c571a6550c9579cdc1c581d 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -4,6 +4,7 @@ |
#include "content/renderer/render_widget.h" |
+#include "base/auto_reset.h" |
#include "base/bind.h" |
#include "base/command_line.h" |
#include "base/debug/trace_event.h" |
@@ -373,7 +374,8 @@ RenderWidget::RenderWidget(blink::WebPopupType popup_type, |
has_focus_(false), |
handling_input_event_(false), |
handling_ime_event_(false), |
- handling_touchstart_event_(false), |
+ handling_event_type_(WebInputEvent::Undefined), |
+ ignore_ack_for_mouse_move_from_debugger_(false), |
closing_(false), |
is_swapped_out_(swapped_out), |
input_method_is_active_(false), |
@@ -903,11 +905,12 @@ void RenderWidget::OnSwapBuffersComplete() { |
void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
const ui::LatencyInfo& latency_info, |
bool is_keyboard_shortcut) { |
- handling_input_event_ = true; |
- if (!input_event) { |
- handling_input_event_ = false; |
+ base::AutoReset<bool> handling_input_event_resetter( |
+ &handling_input_event_, true); |
+ if (!input_event) |
return; |
- } |
+ base::AutoReset<WebInputEvent::Type> handling_event_type_resetter( |
+ &handling_event_type_, input_event->type); |
base::TimeTicks start_time; |
if (base::TimeTicks::IsHighResNowFastAndReliable()) |
@@ -993,9 +996,6 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
prevent_default = prevent_default || WillHandleGestureEvent(gesture_event); |
} |
- if (input_event->type == WebInputEvent::TouchStart) |
- handling_touchstart_event_ = true; |
- |
bool processed = prevent_default; |
if (input_event->type != WebInputEvent::Char || !suppress_next_char_events_) { |
suppress_next_char_events_ = false; |
@@ -1003,8 +1003,6 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
processed = webwidget_->handleInputEvent(*input_event); |
} |
- handling_touchstart_event_ = false; |
- |
// If this RawKeyDown event corresponds to a browser keyboard shortcut and |
// it's not processed by webkit, then we need to suppress the upcoming Char |
// events. |
@@ -1053,7 +1051,11 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
TRACE_EVENT_SYNTHETIC_DELAY_END("blink.HandleInputEvent"); |
- if (!WebInputEventTraits::IgnoresAckDisposition(*input_event)) { |
+ // Note that we can't use handling_event_type_ here since it will be overriden |
+ // by reentrant calls for events after the paused one. |
+ bool no_ack = ignore_ack_for_mouse_move_from_debugger_ && |
+ input_event->type == WebInputEvent::MouseMove; |
+ if (!WebInputEventTraits::IgnoresAckDisposition(*input_event) && !no_ack) { |
InputHostMsg_HandleInputEvent_ACK_Params ack; |
ack.type = input_event->type; |
ack.state = ack_result; |
@@ -1080,6 +1082,7 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
Send(response.release()); |
} |
} |
+ ignore_ack_for_mouse_move_from_debugger_ = false; |
#if defined(OS_ANDROID) |
// Allow the IME to be shown when the focus changes as a consequence |
@@ -1094,8 +1097,6 @@ void RenderWidget::OnHandleInputEvent(const blink::WebInputEvent* input_event, |
UpdateTextInputState(SHOW_IME_IF_NEEDED, FROM_IME); |
#endif |
- handling_input_event_ = false; |
- |
if (!prevent_default) { |
if (WebInputEvent::isKeyboardEventType(input_event->type)) |
DidHandleKeyEvent(); |
@@ -1517,6 +1518,21 @@ bool RenderWidget::ShouldHandleImeEvent() { |
#endif |
} |
+bool RenderWidget::SendAckForMouseMoveFromDebugger() { |
+ if (handling_event_type_ == WebInputEvent::MouseMove) { |
+ InputHostMsg_HandleInputEvent_ACK_Params ack; |
+ ack.type = handling_event_type_; |
+ ack.state = INPUT_EVENT_ACK_STATE_CONSUMED; |
+ Send(new InputHostMsg_HandleInputEvent_ACK(routing_id_, ack)); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+void RenderWidget::IgnoreAckForMouseMoveFromDebugger() { |
+ ignore_ack_for_mouse_move_from_debugger_ = true; |
+} |
+ |
void RenderWidget::SetDeviceScaleFactor(float device_scale_factor) { |
if (device_scale_factor_ == device_scale_factor) |
return; |
@@ -1963,7 +1979,7 @@ void RenderWidget::setTouchAction( |
// Ignore setTouchAction calls that result from synthetic touch events (eg. |
// when blink is emulating touch with mouse). |
- if (!handling_touchstart_event_) |
+ if (handling_event_type_ != WebInputEvent::TouchStart) |
return; |
// Verify the same values are used by the types so we can cast between them. |