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

Unified Diff: content/browser/renderer_host/gesture_event_filter.cc

Issue 13931009: Add latency info to input events sent to RenderWidget. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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/gesture_event_filter.cc
diff --git a/content/browser/renderer_host/gesture_event_filter.cc b/content/browser/renderer_host/gesture_event_filter.cc
index 02ed0c31cfdceae33470d2c4be1a953caeaee534..c7de540dcd5a4d985cc634f72fe067d6eaed8e46 100644
--- a/content/browser/renderer_host/gesture_event_filter.cc
+++ b/content/browser/renderer_host/gesture_event_filter.cc
@@ -75,15 +75,15 @@ GestureEventFilter::GestureEventFilter(RenderWidgetHostImpl* rwhv)
GestureEventFilter::~GestureEventFilter() { }
bool GestureEventFilter::ShouldDiscardFlingCancelEvent(
- const WebKit::WebGestureEvent& gesture_event) {
+ const GestureEventWithLatencyInfo& gesture_event) {
if (coalesced_gesture_events_.empty() && fling_in_progress_)
return false;
GestureEventQueue::reverse_iterator it =
coalesced_gesture_events_.rbegin();
while (it != coalesced_gesture_events_.rend()) {
- if (it->type == WebInputEvent::GestureFlingStart)
+ if (it->event.type == WebInputEvent::GestureFlingStart)
return false;
- if (it->type == WebInputEvent::GestureFlingCancel)
+ if (it->event.type == WebInputEvent::GestureFlingCancel)
return true;
it++;
}
@@ -91,10 +91,10 @@ bool GestureEventFilter::ShouldDiscardFlingCancelEvent(
}
bool GestureEventFilter::ShouldForwardForBounceReduction(
- const WebGestureEvent& gesture_event) {
+ const GestureEventWithLatencyInfo& gesture_event) {
if (debounce_interval_time_ms_ == 0)
return true;
- switch (gesture_event.type) {
+ switch (gesture_event.event.type) {
case WebInputEvent::GestureScrollUpdate:
if (!scrolling_in_progress_) {
debounce_deferring_timer_.Start(
@@ -127,7 +127,8 @@ bool GestureEventFilter::ShouldForwardForBounceReduction(
}
// NOTE: The filters are applied successively. This simplifies the change.
-bool GestureEventFilter::ShouldForward(const WebGestureEvent& gesture_event) {
+bool GestureEventFilter::ShouldForward(
+ const GestureEventWithLatencyInfo& gesture_event) {
return ShouldForwardForZeroVelocityFlingStart(gesture_event) &&
ShouldForwardForBounceReduction(gesture_event) &&
ShouldForwardForGFCFiltering(gesture_event) &&
@@ -137,24 +138,24 @@ bool GestureEventFilter::ShouldForward(const WebGestureEvent& gesture_event) {
}
bool GestureEventFilter::ShouldForwardForZeroVelocityFlingStart(
- const WebGestureEvent& gesture_event) {
- return gesture_event.type != WebInputEvent::GestureFlingStart ||
- gesture_event.sourceDevice != WebGestureEvent::Touchpad ||
- gesture_event.data.flingStart.velocityX != 0 ||
- gesture_event.data.flingStart.velocityY != 0;
+ const GestureEventWithLatencyInfo& gesture_event) {
+ return gesture_event.event.type != WebInputEvent::GestureFlingStart ||
+ gesture_event.event.sourceDevice != WebGestureEvent::Touchpad ||
+ gesture_event.event.data.flingStart.velocityX != 0 ||
+ gesture_event.event.data.flingStart.velocityY != 0;
}
bool GestureEventFilter::ShouldForwardForGFCFiltering(
- const WebGestureEvent& gesture_event) {
- return gesture_event.type != WebInputEvent::GestureFlingCancel ||
+ const GestureEventWithLatencyInfo& gesture_event) {
+ return gesture_event.event.type != WebInputEvent::GestureFlingCancel ||
!ShouldDiscardFlingCancelEvent(gesture_event);
}
bool GestureEventFilter::ShouldForwardForTapSuppression(
- const WebGestureEvent& gesture_event) {
- switch (gesture_event.type) {
+ const GestureEventWithLatencyInfo& gesture_event) {
+ switch (gesture_event.event.type) {
case WebInputEvent::GestureFlingCancel:
- if (gesture_event.sourceDevice == WebGestureEvent::Touchscreen)
+ if (gesture_event.event.sourceDevice == WebGestureEvent::Touchscreen)
touchscreen_tap_suppression_controller_->GestureFlingCancel();
else
touchpad_tap_suppression_controller_->GestureFlingCancel();
@@ -176,12 +177,12 @@ bool GestureEventFilter::ShouldForwardForTapSuppression(
}
bool GestureEventFilter::ShouldForwardForTapDeferral(
- const WebGestureEvent& gesture_event) {
- switch (gesture_event.type) {
+ const GestureEventWithLatencyInfo& gesture_event) {
+ switch (gesture_event.event.type) {
case WebInputEvent::GestureTapDown:
// GestureTapDown is always paired with either a Tap, or TapCancel, so it
// should be impossible to have more than one outstanding at a time.
- DCHECK_EQ(deferred_tap_down_event_.type, WebInputEvent::Undefined);
+ DCHECK_EQ(deferred_tap_down_event_.event.type, WebInputEvent::Undefined);
deferred_tap_down_event_ = gesture_event;
send_gtd_timer_.Start(
FROM_HERE,
@@ -190,27 +191,27 @@ bool GestureEventFilter::ShouldForwardForTapDeferral(
&GestureEventFilter::SendGestureTapDownNow);
return false;
case WebInputEvent::GestureTapCancel:
- if (deferred_tap_down_event_.type == WebInputEvent::Undefined) {
+ if (deferred_tap_down_event_.event.type == WebInputEvent::Undefined) {
// The TapDown has already been put in the queue, must send the
// corresponding TapCancel as well.
return true;
}
// Cancelling a deferred TapDown, just drop them on the floor.
send_gtd_timer_.Stop();
- deferred_tap_down_event_.type = WebInputEvent::Undefined;
+ deferred_tap_down_event_.event.type = WebInputEvent::Undefined;
return false;
case WebInputEvent::GestureTap:
send_gtd_timer_.Stop();
- if (deferred_tap_down_event_.type != WebInputEvent::Undefined) {
+ if (deferred_tap_down_event_.event.type != WebInputEvent::Undefined) {
ForwardGestureEventSkipDeferral(deferred_tap_down_event_);
- deferred_tap_down_event_.type = WebInputEvent::Undefined;
+ deferred_tap_down_event_.event.type = WebInputEvent::Undefined;
}
return true;
case WebInputEvent::GestureFlingStart:
case WebInputEvent::GestureScrollBegin:
case WebInputEvent::GesturePinchBegin:
send_gtd_timer_.Stop();
- deferred_tap_down_event_.type = WebInputEvent::Undefined;
+ deferred_tap_down_event_.event.type = WebInputEvent::Undefined;
return true;
default:
return true;
@@ -221,8 +222,8 @@ bool GestureEventFilter::ShouldForwardForTapDeferral(
}
bool GestureEventFilter::ShouldForwardForCoalescing(
- const WebGestureEvent& gesture_event) {
- switch (gesture_event.type) {
+ const GestureEventWithLatencyInfo& gesture_event) {
+ switch (gesture_event.event.type) {
case WebInputEvent::GestureFlingCancel:
fling_in_progress_ = false;
break;
@@ -246,7 +247,7 @@ void GestureEventFilter::Reset() {
ignore_next_ack_ = false;
combined_scroll_pinch_ = gfx::Transform();
coalesced_gesture_events_.clear();
- deferred_tap_down_event_.type = WebInputEvent::Undefined;
+ deferred_tap_down_event_.event.type = WebInputEvent::Undefined;
debouncing_deferral_queue_.clear();
send_gtd_timer_.Stop();
debounce_deferring_timer_.Stop();
@@ -258,9 +259,9 @@ void GestureEventFilter::ProcessGestureAck(bool processed, int type) {
DLOG(ERROR) << "Received unexpected ACK for event type " << type;
return;
}
- DCHECK_EQ(coalesced_gesture_events_.front().type, type);
+ DCHECK_EQ(coalesced_gesture_events_.front().event.type, type);
if (type == WebInputEvent::GestureFlingCancel) {
- if (coalesced_gesture_events_.front().sourceDevice ==
+ if (coalesced_gesture_events_.front().event.sourceDevice ==
WebGestureEvent::Touchscreen)
touchscreen_tap_suppression_controller_->GestureFlingCancelAck(processed);
else
@@ -270,16 +271,18 @@ void GestureEventFilter::ProcessGestureAck(bool processed, int type) {
if (ignore_next_ack_) {
ignore_next_ack_ = false;
} else if (!coalesced_gesture_events_.empty()) {
- const WebGestureEvent& next_gesture_event =
+ const GestureEventWithLatencyInfo& next_gesture_event =
coalesced_gesture_events_.front();
render_widget_host_->ForwardGestureEventImmediately(next_gesture_event);
// TODO(yusufo): Introduce GesturePanScroll so that these can be combined
// into one gesture and kept inside the queue that way.
if (coalesced_gesture_events_.size() > 1) {
- const WebGestureEvent& second_gesture_event =
+ const GestureEventWithLatencyInfo& second_gesture_event =
coalesced_gesture_events_[1];
- if (next_gesture_event.type == WebInputEvent::GestureScrollUpdate &&
- second_gesture_event.type == WebInputEvent::GesturePinchUpdate) {
+ if (next_gesture_event.event.type ==
+ WebInputEvent::GestureScrollUpdate &&
+ second_gesture_event.event.type ==
+ WebInputEvent::GesturePinchUpdate) {
render_widget_host_->
ForwardGestureEventImmediately(second_gesture_event);
ignore_next_ack_ = true;
@@ -302,9 +305,9 @@ const WebKit::WebInputEvent&
GestureEventFilter::GetGestureEventAwaitingAck() const {
DCHECK(!coalesced_gesture_events_.empty());
if (!ignore_next_ack_)
- return coalesced_gesture_events_.front();
+ return coalesced_gesture_events_.front().event;
else
- return coalesced_gesture_events_.at(1);
+ return coalesced_gesture_events_.at(1).event;
}
void GestureEventFilter::FlingHasBeenHalted() {
@@ -316,13 +319,13 @@ bool GestureEventFilter::ShouldHandleEventNow() {
}
void GestureEventFilter::ForwardGestureEventForDeferral(
- const WebGestureEvent& gesture_event) {
+ const GestureEventWithLatencyInfo& gesture_event) {
if (ShouldForwardForTapDeferral(gesture_event))
ForwardGestureEventSkipDeferral(gesture_event);
}
void GestureEventFilter::ForwardGestureEventSkipDeferral(
- const WebGestureEvent& gesture_event) {
+ const GestureEventWithLatencyInfo& gesture_event) {
if (ShouldForwardForCoalescing(gesture_event))
render_widget_host_->ForwardGestureEventImmediately(gesture_event);
}
@@ -331,9 +334,9 @@ void GestureEventFilter::SendGestureTapDownNow() {
// We must not have already sent the deferred TapDown (if we did, we would
// have stopped the timer, which prevents this task from running - even if
// it's time had already elapsed).
- DCHECK_EQ(deferred_tap_down_event_.type, WebInputEvent::GestureTapDown);
+ DCHECK_EQ(deferred_tap_down_event_.event.type, WebInputEvent::GestureTapDown);
ForwardGestureEventSkipDeferral(deferred_tap_down_event_);
- deferred_tap_down_event_.type = WebInputEvent::Undefined;
+ deferred_tap_down_event_.event.type = WebInputEvent::Undefined;
}
void GestureEventFilter::SendScrollEndingEventsNow() {
@@ -352,19 +355,20 @@ void GestureEventFilter::SendScrollEndingEventsNow() {
}
void GestureEventFilter::MergeOrInsertScrollAndPinchEvent(
- const WebGestureEvent& gesture_event) {
+ const GestureEventWithLatencyInfo& gesture_event) {
if (coalesced_gesture_events_.size() <= 1) {
coalesced_gesture_events_.push_back(gesture_event);
return;
}
- WebGestureEvent* last_event = &coalesced_gesture_events_.back();
- if (gesture_event.type == WebInputEvent::GestureScrollUpdate &&
- last_event->type == WebInputEvent::GestureScrollUpdate &&
- last_event->modifiers == gesture_event.modifiers) {
- last_event->data.scrollUpdate.deltaX +=
- gesture_event.data.scrollUpdate.deltaX;
- last_event->data.scrollUpdate.deltaY +=
- gesture_event.data.scrollUpdate.deltaY;
+ GestureEventWithLatencyInfo* last_event = &coalesced_gesture_events_.back();
+ if (gesture_event.event.type == WebInputEvent::GestureScrollUpdate &&
+ last_event->event.type == WebInputEvent::GestureScrollUpdate &&
+ last_event->event.modifiers == gesture_event.event.modifiers) {
+ last_event->event.data.scrollUpdate.deltaX +=
+ gesture_event.event.data.scrollUpdate.deltaX;
+ last_event->event.data.scrollUpdate.deltaY +=
+ gesture_event.event.data.scrollUpdate.deltaY;
+ last_event->latency.MergeWith(gesture_event.latency);
return;
}
if (coalesced_gesture_events_.size() == 2 ||
@@ -373,22 +377,28 @@ void GestureEventFilter::MergeOrInsertScrollAndPinchEvent(
coalesced_gesture_events_.push_back(gesture_event);
return;
}
- WebGestureEvent scroll_event;
- WebGestureEvent pinch_event;
- scroll_event.modifiers |= gesture_event.modifiers;
- scroll_event.timeStampSeconds = gesture_event.timeStampSeconds;
+ GestureEventWithLatencyInfo scroll_event;
+ GestureEventWithLatencyInfo pinch_event;
+ scroll_event.event.modifiers |= gesture_event.event.modifiers;
+ scroll_event.event.timeStampSeconds = gesture_event.event.timeStampSeconds;
+ scroll_event.latency = gesture_event.latency;
+ scroll_event.latency.MergeWith(last_event->latency);
pinch_event = scroll_event;
- scroll_event.type = WebInputEvent::GestureScrollUpdate;
- pinch_event.type = WebInputEvent::GesturePinchUpdate;
- pinch_event.x = gesture_event.type == WebInputEvent::GesturePinchUpdate ?
- gesture_event.x : last_event->x;
- pinch_event.y = gesture_event.type == WebInputEvent::GesturePinchUpdate ?
- gesture_event.y : last_event->y;
+ scroll_event.event.type = WebInputEvent::GestureScrollUpdate;
+ pinch_event.event.type = WebInputEvent::GesturePinchUpdate;
+ pinch_event.event.x = gesture_event.event.type ==
+ WebInputEvent::GesturePinchUpdate ?
+ gesture_event.event.x : last_event->event.x;
+ pinch_event.event.y = gesture_event.event.type ==
+ WebInputEvent::GesturePinchUpdate ?
+ gesture_event.event.y : last_event->event.y;
combined_scroll_pinch_.ConcatTransform(GetTransformForEvent(gesture_event));
- WebGestureEvent* second_last_event = &coalesced_gesture_events_
+ GestureEventWithLatencyInfo* second_last_event = &coalesced_gesture_events_
[coalesced_gesture_events_.size() - 2];
if (ShouldTryMerging(gesture_event, *second_last_event)) {
+ scroll_event.latency.MergeWith(second_last_event->latency);
+ pinch_event.latency.MergeWith(second_last_event->latency);
coalesced_gesture_events_.pop_back();
} else {
DCHECK(combined_scroll_pinch_ == GetTransformForEvent(gesture_event));
@@ -397,39 +407,40 @@ void GestureEventFilter::MergeOrInsertScrollAndPinchEvent(
}
coalesced_gesture_events_.pop_back();
float combined_scale = combined_scroll_pinch_.matrix().getDouble(0, 0);
- scroll_event.data.scrollUpdate.deltaX =
- (combined_scroll_pinch_.matrix().getDouble(0, 3) + pinch_event.x)
- / combined_scale - pinch_event.x;
- scroll_event.data.scrollUpdate.deltaY =
- (combined_scroll_pinch_.matrix().getDouble(1, 3) + pinch_event.y)
- / combined_scale - pinch_event.y;
+ scroll_event.event.data.scrollUpdate.deltaX =
+ (combined_scroll_pinch_.matrix().getDouble(0, 3) + pinch_event.event.x)
+ / combined_scale - pinch_event.event.x;
+ scroll_event.event.data.scrollUpdate.deltaY =
+ (combined_scroll_pinch_.matrix().getDouble(1, 3) + pinch_event.event.y)
+ / combined_scale - pinch_event.event.y;
coalesced_gesture_events_.push_back(scroll_event);
- pinch_event.data.pinchUpdate.scale = combined_scale;
+ pinch_event.event.data.pinchUpdate.scale = combined_scale;
coalesced_gesture_events_.push_back(pinch_event);
}
-bool GestureEventFilter::ShouldTryMerging(const WebGestureEvent& new_event,
- const WebGestureEvent& event_in_queue) {
+bool GestureEventFilter::ShouldTryMerging(
+ const GestureEventWithLatencyInfo& new_event,
+ const GestureEventWithLatencyInfo& event_in_queue) {
DLOG_IF(WARNING,
- new_event.timeStampSeconds <
- event_in_queue.timeStampSeconds)
+ new_event.event.timeStampSeconds <
+ event_in_queue.event.timeStampSeconds)
<< "Event time not monotonic?\n";
- return (event_in_queue.type == WebInputEvent::GestureScrollUpdate ||
- event_in_queue.type == WebInputEvent::GesturePinchUpdate) &&
- event_in_queue.modifiers == new_event.modifiers;
+ return (event_in_queue.event.type == WebInputEvent::GestureScrollUpdate ||
+ event_in_queue.event.type == WebInputEvent::GesturePinchUpdate) &&
+ event_in_queue.event.modifiers == new_event.event.modifiers;
}
gfx::Transform GestureEventFilter::GetTransformForEvent(
- const WebGestureEvent& gesture_event) {
+ const GestureEventWithLatencyInfo& gesture_event) {
gfx::Transform gesture_transform = gfx::Transform();
- if (gesture_event.type == WebInputEvent::GestureScrollUpdate) {
- gesture_transform.Translate(gesture_event.data.scrollUpdate.deltaX,
- gesture_event.data.scrollUpdate.deltaY);
- } else if (gesture_event.type == WebInputEvent::GesturePinchUpdate) {
- float scale = gesture_event.data.pinchUpdate.scale;
- gesture_transform.Translate(-gesture_event.x, -gesture_event.y);
+ if (gesture_event.event.type == WebInputEvent::GestureScrollUpdate) {
+ gesture_transform.Translate(gesture_event.event.data.scrollUpdate.deltaX,
+ gesture_event.event.data.scrollUpdate.deltaY);
+ } else if (gesture_event.event.type == WebInputEvent::GesturePinchUpdate) {
+ float scale = gesture_event.event.data.pinchUpdate.scale;
+ gesture_transform.Translate(-gesture_event.event.x, -gesture_event.event.y);
gesture_transform.Scale(scale,scale);
- gesture_transform.Translate(gesture_event.x, gesture_event.y);
+ gesture_transform.Translate(gesture_event.event.x, gesture_event.event.y);
}
return gesture_transform;
}
« no previous file with comments | « content/browser/renderer_host/gesture_event_filter.h ('k') | content/browser/renderer_host/overscroll_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698