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

Unified Diff: content/browser/renderer_host/input/input_router_impl.cc

Issue 997283002: Coalesce async touch move events until the ack back from render (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing unittests Created 5 years, 7 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
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() {

Powered by Google App Engine
This is Rietveld 408576698