Index: content/browser/renderer_host/render_widget_host_impl.cc |
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
index d433291906ddfc5c024d2362fa9e4c3a101f7c79..4f8fe1342aab4852b573d6507404541278695f5b 100644 |
--- a/content/browser/renderer_host/render_widget_host_impl.cc |
+++ b/content/browser/renderer_host/render_widget_host_impl.cc |
@@ -1139,7 +1139,7 @@ void RenderWidgetHostImpl::ForwardInputEvent(const WebInputEvent& input_event, |
return; |
} |
- in_process_event_types_.push(input_event.type); |
+ in_process_event_types_.push_back(input_event.type); |
// Transmit any pending wheel events on a non-wheel event. This ensures that |
// the renderer receives the final PhaseEnded wheel event, which is necessary |
@@ -1693,9 +1693,43 @@ void RenderWidgetHostImpl::OnInputEventAck( |
TRACE_EVENT0("renderer_host", "RenderWidgetHostImpl::OnInputEventAck"); |
bool processed = (ack_result == INPUT_EVENT_ACK_STATE_CONSUMED); |
- if (!in_process_event_types_.empty() && |
- in_process_event_types_.front() == event_type) |
- in_process_event_types_.pop(); |
+ if (!in_process_event_types_.empty()) { |
+ bool found = false; |
+ for (std::deque<WebKit::WebInputEvent::Type>::iterator i = |
+ in_process_event_types_.begin(); |
+ i != in_process_event_types_.end(); ++i) { |
+ if (*i == event_type) { |
+ in_process_event_types_.erase(i); |
+ found = true; |
+ break; |
+ } else { |
+ // Ensure we're not ACK'ing out of |type| order. The reason is that |
+ // we push the event stream in system order |in_process_event_types_|, |
+ // however there are various internal queues for gesture / touch / etc |
+ // that may ACK in their own internal order. When traversing |
jamesr
2013/01/15 19:26:11
what does this mean? The render process should AC
|
+ // |in_process_event_types_|, ensure we don't jump over an event of the |
+ // the same category. |
+ int ack_type = static_cast<int>(event_type); |
+ int queue_type = static_cast<int>(*i); |
+ bool out_of_order = |
+ (WebInputEvent::isMouseEventType(ack_type) && |
+ WebInputEvent::isMouseEventType(queue_type)) || |
+ (WebInputEvent::isKeyboardEventType(ack_type) && |
+ WebInputEvent::isKeyboardEventType(queue_type)) || |
+ (WebInputEvent::isTouchEventType(ack_type) && |
+ WebInputEvent::isTouchEventType(queue_type)) || |
+ (WebInputEvent::isGestureEventType(ack_type) && |
+ WebInputEvent::isGestureEventType(queue_type)); |
+ if (out_of_order) { |
+ DVLOG(1) << "OnInputEventAck out of order " << ack_type << " " |
+ << queue_type; |
+ break; |
+ } |
+ } |
+ } |
+ if (!found) |
+ DVLOG(1) << "OnInputEventAck not found " << event_type; |
+ } |
// Log the time delta for processing an input event. |
TimeDelta delta = TimeTicks::Now() - input_event_start_time_; |