Chromium Code Reviews| Index: content/browser/renderer_host/input/input_router_impl.cc |
| diff --git a/content/browser/renderer_host/input/input_router_impl.cc b/content/browser/renderer_host/input/input_router_impl.cc |
| index df02bb43ac6becfd7378a6aa54290f0d2112dd51..d2c2ccf51dcab0d398832c7005fe69c3e663f8dd 100644 |
| --- a/content/browser/renderer_host/input/input_router_impl.cc |
| +++ b/content/browser/renderer_host/input/input_router_impl.cc |
| @@ -356,19 +356,22 @@ void InputRouterImpl::OfferToHandlers(const WebInputEvent& input_event, |
| OfferToRenderer(input_event, latency_info, is_keyboard_shortcut); |
| // Touch events should always indicate in the event whether they are |
| - // cancelable (respect ACK disposition) or not. |
| - bool ignores_ack = WebInputEventTraits::IgnoresAckDisposition(input_event); |
| - if (WebInputEvent::isTouchEventType(input_event.type)) { |
| + // cancelable (respect ACK disposition) or not except touchmove. |
| + bool needs_synthetic_ack = |
| + WebInputEventTraits::WillReceiveAckFromRenderer(input_event); |
| + |
| + if (WebInputEvent::isTouchEventType(input_event.type) && |
| + input_event.type != WebInputEvent::TouchMove) { |
| const WebTouchEvent& touch = static_cast<const WebTouchEvent&>(input_event); |
| - DCHECK_NE(ignores_ack, !!touch.cancelable); |
| + DCHECK_EQ(needs_synthetic_ack, touch.cancelable); |
| } |
| - // If we don't care about the ack disposition, send the ack immediately. |
| - if (ignores_ack) { |
| - ProcessInputEventAck(input_event.type, |
| - INPUT_EVENT_ACK_STATE_IGNORED, |
| - latency_info, |
| - IGNORING_DISPOSITION); |
| + // If we don't need synthetic ack from render, send the ack immediately. |
| + if (!needs_synthetic_ack) { |
|
jdduke (slow)
2015/05/08 21:30:48
Hmm, synthetic means fake, so I think this should
lanwei
2015/05/11 19:27:56
Done.
|
| + ProcessInputEventAck( |
| + input_event.type, INPUT_EVENT_ACK_STATE_IGNORED, latency_info, |
| + WebInputEventTraits::GetUniqueTouchEventId(input_event), |
| + IGNORING_DISPOSITION); |
| } |
| } |
| @@ -380,13 +383,19 @@ bool InputRouterImpl::OfferToClient(const WebInputEvent& input_event, |
| client_->FilterInputEvent(input_event, latency_info); |
| switch (filter_ack) { |
| case INPUT_EVENT_ACK_STATE_CONSUMED: |
| - case INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS: |
| + case INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS: { |
| // Send the ACK and early exit. |
| next_mouse_move_.reset(); |
| - ProcessInputEventAck(input_event.type, filter_ack, latency_info, CLIENT); |
| + InputEventAck ack( |
|
jdduke (slow)
2015/05/08 21:30:48
You can remove this unused variable.
lanwei
2015/05/11 19:27:55
Done.
|
| + input_event.type, filter_ack, latency_info, |
| + WebInputEventTraits::GetUniqueTouchEventId(input_event)); |
| + ProcessInputEventAck( |
| + input_event.type, filter_ack, latency_info, |
| + WebInputEventTraits::GetUniqueTouchEventId(input_event), CLIENT); |
| // WARNING: |this| may be deleted at this point. |
| consumed = true; |
| break; |
| + } |
| case INPUT_EVENT_ACK_STATE_UNKNOWN: |
| // Simply drop the event. |
| consumed = true; |
| @@ -406,7 +415,7 @@ bool InputRouterImpl::OfferToRenderer(const WebInputEvent& input_event, |
| // Ack messages for ignored ack event types should never be sent by the |
| // renderer. Consequently, such event types should not affect event time |
| // or in-flight event count metrics. |
| - if (!WebInputEventTraits::IgnoresAckDisposition(input_event)) { |
| + if (WebInputEventTraits::WillReceiveAckFromRenderer(input_event)) { |
| input_event_start_time_ = TimeTicks::Now(); |
| client_->IncrementInFlightEventCount(); |
| } |
| @@ -415,10 +424,8 @@ bool InputRouterImpl::OfferToRenderer(const WebInputEvent& input_event, |
| return false; |
| } |
| -void InputRouterImpl::OnInputEventAck( |
| - const InputHostMsg_HandleInputEvent_ACK_Params& ack) { |
| +void InputRouterImpl::OnInputEventAck(const InputEventAck& ack) { |
| client_->DecrementInFlightEventCount(); |
| - |
| // Log the time delta for processing an input event. |
| TimeDelta delta = TimeTicks::Now() - input_event_start_time_; |
| UMA_HISTOGRAM_TIMES("MPArch.IIR_InputEventDelta", delta); |
| @@ -429,21 +436,8 @@ void InputRouterImpl::OnInputEventAck( |
| OnDidOverscroll(*ack.overscroll); |
| } |
| - ProcessInputEventAck(ack.type, ack.state, ack.latency, RENDERER); |
| - // WARNING: |this| may be deleted at this point. |
| - |
| - // This is used only for testing, and the other end does not use the |
| - // source object. On linux, specifying |
| - // Source<RenderWidgetHost> results in a very strange |
| - // runtime error in the epilogue of the enclosing |
| - // (ProcessInputEventAck) method, but not on other platforms; using |
| - // 'void' instead is just as safe (since NotificationSource |
| - // is not actually typesafe) and avoids this error. |
| - int type = static_cast<int>(ack.type); |
| - NotificationService::current()->Notify( |
| - NOTIFICATION_RENDER_WIDGET_HOST_DID_RECEIVE_INPUT_EVENT_ACK, |
| - Source<void>(this), |
| - Details<int>(&type)); |
| + ProcessInputEventAck(ack.type, ack.state, ack.latency, |
| + ack.unique_touch_event_id, RENDERER); |
| } |
| void InputRouterImpl::OnDidOverscroll(const DidOverscrollParams& params) { |
| @@ -502,11 +496,11 @@ void InputRouterImpl::OnDidStopFlinging() { |
| client_->DidStopFlinging(); |
| } |
| -void InputRouterImpl::ProcessInputEventAck( |
| - WebInputEvent::Type event_type, |
| - InputEventAckState ack_result, |
| - const ui::LatencyInfo& latency_info, |
| - AckSource ack_source) { |
| +void InputRouterImpl::ProcessInputEventAck(WebInputEvent::Type event_type, |
| + InputEventAckState ack_result, |
| + const ui::LatencyInfo& latency_info, |
| + uint32 unique_touch_event_id, |
| + AckSource ack_source) { |
| TRACE_EVENT2("input", "InputRouterImpl::ProcessInputEventAck", |
| "type", WebInputEventTraits::GetName(event_type), |
| "ack", GetEventAckName(ack_result)); |
| @@ -528,7 +522,7 @@ void InputRouterImpl::ProcessInputEventAck( |
| } else if (event_type == WebInputEvent::MouseWheel) { |
| ProcessWheelAck(ack_result, latency_info); |
| } else if (WebInputEvent::isTouchEventType(event_type)) { |
| - ProcessTouchAck(ack_result, latency_info); |
| + ProcessTouchAck(ack_result, latency_info, unique_touch_event_id); |
| } else if (WebInputEvent::isGestureEventType(event_type)) { |
| ProcessGestureAck(event_type, ack_result, latency_info); |
| } else if (event_type != WebInputEvent::Undefined) { |
| @@ -607,11 +601,12 @@ void InputRouterImpl::ProcessGestureAck(WebInputEvent::Type type, |
| gesture_event_queue_.ProcessGestureAck(ack_result, type, latency); |
| } |
| -void InputRouterImpl::ProcessTouchAck( |
| - InputEventAckState ack_result, |
| - const ui::LatencyInfo& latency) { |
| +void InputRouterImpl::ProcessTouchAck(InputEventAckState ack_result, |
| + const ui::LatencyInfo& latency, |
| + uint32 unique_touch_event_id) { |
| // |touch_event_queue_| will forward to OnTouchEventAck when appropriate. |
| - touch_event_queue_.ProcessTouchAck(ack_result, latency); |
| + touch_event_queue_.ProcessTouchAck(ack_result, latency, |
| + unique_touch_event_id); |
| } |
| void InputRouterImpl::UpdateTouchAckTimeoutEnabled() { |