Index: content/browser/renderer_host/render_widget_host_impl.cc |
=================================================================== |
--- content/browser/renderer_host/render_widget_host_impl.cc (revision 167782) |
+++ content/browser/renderer_host/render_widget_host_impl.cc (working copy) |
@@ -1056,6 +1056,20 @@ |
} |
} |
+void RenderWidgetHostImpl::SendInputEvent(const WebInputEvent& input_event, |
+ int event_size, |
+ bool is_keyboard_shortcut) { |
+ IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); |
+ message->WriteData( |
+ reinterpret_cast<const char*>(&input_event), event_size); |
+ // |is_keyboard_shortcut| only makes sense for RawKeyDown events. |
+ if (input_event.type == WebInputEvent::RawKeyDown) |
+ message->WriteBool(is_keyboard_shortcut); |
+ input_event_start_time_ = TimeTicks::Now(); |
+ Send(message); |
+ increment_in_flight_event_count(); |
+} |
+ |
void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, |
int event_size, |
bool is_keyboard_shortcut) { |
@@ -1068,25 +1082,24 @@ |
in_process_event_types_.push(input_event.type); |
- IPC::Message* message = new ViewMsg_HandleInputEvent(routing_id_); |
- message->WriteData( |
- reinterpret_cast<const char*>(&input_event), event_size); |
- // |is_keyboard_shortcut| only makes sense for RawKeyDown events. |
- if (input_event.type == WebInputEvent::RawKeyDown) |
- message->WriteBool(is_keyboard_shortcut); |
- input_event_start_time_ = TimeTicks::Now(); |
- Send(message); |
- |
- // Any non-wheel input event cancels pending wheel events. |
- if (input_event.type != WebInputEvent::MouseWheel) |
+ // Transmit any pending wheel events on a non-wheel event. This ensures that |
+ // the renderer receives the final PhaseEnded wheel event, which is necessary |
+ // to terminate rubber-banding, for example. |
+ if (input_event.type != WebInputEvent::MouseWheel) { |
+ for (size_t i = 0; i < coalesced_mouse_wheel_events_.size(); ++i) { |
+ SendInputEvent(coalesced_mouse_wheel_events_[i], |
+ sizeof(WebMouseWheelEvent), false); |
+ } |
coalesced_mouse_wheel_events_.clear(); |
+ } |
+ SendInputEvent(input_event, event_size, is_keyboard_shortcut); |
+ |
// Any input event cancels a pending mouse move event. Note that |
// |next_mouse_move_| possibly owns |input_event|, so don't use |input_event| |
// after this line. |
next_mouse_move_.reset(); |
- increment_in_flight_event_count(); |
StartHangMonitorTimeout( |
TimeDelta::FromMilliseconds(hung_renderer_delay_ms_)); |
} |