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

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

Issue 119323007: Add timestamps to synthesized events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleanup. Created 6 years, 12 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/synthetic_pinch_gesture.cc
diff --git a/content/browser/renderer_host/input/synthetic_pinch_gesture.cc b/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
index dfe5cf474e7a72957ed5f4f7ac1c258440ecc8d5..14713635c70b69851ad65db7af80869da75284f0 100644
--- a/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
+++ b/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
@@ -15,8 +15,8 @@ namespace content {
SyntheticPinchGesture::SyntheticPinchGesture(
const SyntheticPinchGestureParams& params)
: params_(params),
- current_y_0_(0.0f),
- current_y_1_(0.0f),
+ start_y_0_(0.0f),
+ start_y_1_(0.0f),
target_y_0_(0.0f),
target_y_1_(0.0f),
gesture_source_type_(SyntheticGestureParams::DEFAULT_INPUT),
@@ -27,7 +27,7 @@ SyntheticPinchGesture::SyntheticPinchGesture(
SyntheticPinchGesture::~SyntheticPinchGesture() {}
SyntheticGesture::Result SyntheticPinchGesture::ForwardInputEvents(
- const base::TimeDelta& interval, SyntheticGestureTarget* target) {
+ const base::TimeTicks& timestamp, SyntheticGestureTarget* target) {
if (state_ == SETUP) {
gesture_source_type_ = params_.gesture_source_type;
if (gesture_source_type_ == SyntheticGestureParams::DEFAULT_INPUT)
@@ -37,11 +37,12 @@ SyntheticGesture::Result SyntheticPinchGesture::ForwardInputEvents(
return SyntheticGesture::GESTURE_SOURCE_TYPE_NOT_SUPPORTED_BY_PLATFORM;
state_ = STARTED;
+ start_time_ = timestamp;
}
DCHECK_NE(gesture_source_type_, SyntheticGestureParams::DEFAULT_INPUT);
if (gesture_source_type_ == SyntheticGestureParams::TOUCH_INPUT)
- ForwardTouchInputEvents(interval, target);
+ ForwardTouchInputEvents(timestamp, target);
else
return SyntheticGesture::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED;
@@ -50,7 +51,7 @@ SyntheticGesture::Result SyntheticPinchGesture::ForwardInputEvents(
}
void SyntheticPinchGesture::ForwardTouchInputEvents(
- const base::TimeDelta& interval, SyntheticGestureTarget* target) {
+ const base::TimeTicks& timestamp, SyntheticGestureTarget* target) {
switch (state_) {
case STARTED:
// Check for an early finish.
@@ -59,17 +60,18 @@ void SyntheticPinchGesture::ForwardTouchInputEvents(
break;
}
SetupCoordinates(target);
- PressTouchPoints(target);
+ PressTouchPoints(target, timestamp);
state_ = MOVING;
break;
- case MOVING:
- UpdateTouchPoints(interval);
- MoveTouchPoints(target);
- if (HasReachedTarget()) {
- ReleaseTouchPoints(target);
+ case MOVING: {
+ base::TimeTicks event_timestamp = timestamp;
+ float delta = GetDeltaForPointer0AndUpdateTimestamp(&event_timestamp);
+ MoveTouchPoints(target, delta, event_timestamp);
+ if (HasReachedTarget(delta)) {
+ ReleaseTouchPoints(target, event_timestamp);
state_ = DONE;
}
- break;
+ } break;
case SETUP:
NOTREACHED() << "State SETUP invalid for synthetic pinch.";
case DONE:
@@ -77,40 +79,40 @@ void SyntheticPinchGesture::ForwardTouchInputEvents(
}
}
-void SyntheticPinchGesture::UpdateTouchPoints(base::TimeDelta interval) {
- // Compute the delta for the first pointer. The other one moves exactly
- // the same but in the opposite direction.
- float delta = GetDeltaForPointer0(interval);
- current_y_0_ += delta;
- current_y_1_ -= delta;
+void SyntheticPinchGesture::PressTouchPoints(SyntheticGestureTarget* target,
+ const base::TimeTicks& timestamp) {
+ touch_event_.PressPoint(params_.anchor.x(), start_y_0_);
+ touch_event_.PressPoint(params_.anchor.x(), start_y_1_);
+ ForwardTouchEvent(target, timestamp);
}
-void SyntheticPinchGesture::PressTouchPoints(SyntheticGestureTarget* target) {
- touch_event_.PressPoint(params_.anchor.x(), current_y_0_);
- touch_event_.PressPoint(params_.anchor.x(), current_y_1_);
- ForwardTouchEvent(target);
-}
+void SyntheticPinchGesture::MoveTouchPoints(SyntheticGestureTarget* target,
+ float delta,
+ const base::TimeTicks& timestamp) {
+ // The two pointers move in opposite directions.
+ float current_y_0 = start_y_0_ + delta;
+ float current_y_1 = start_y_1_ - delta;
-void SyntheticPinchGesture::MoveTouchPoints(SyntheticGestureTarget* target) {
// The current pointer positions are stored as float but the pointer
// coordinates of the input event are integers. Floor both positions so that
// in case of an odd distance one of the pointers (the one whose position goes
// down) moves one pixel further than the other. The explicit flooring is only
// needed for negative values.
- touch_event_.MovePoint(0, params_.anchor.x(), floor(current_y_0_));
- touch_event_.MovePoint(1, params_.anchor.x(), floor(current_y_1_));
- ForwardTouchEvent(target);
+ touch_event_.MovePoint(0, params_.anchor.x(), floor(current_y_0));
+ touch_event_.MovePoint(1, params_.anchor.x(), floor(current_y_1));
+ ForwardTouchEvent(target, timestamp);
}
-void SyntheticPinchGesture::ReleaseTouchPoints(SyntheticGestureTarget* target) {
+void SyntheticPinchGesture::ReleaseTouchPoints(
+ SyntheticGestureTarget* target, const base::TimeTicks& timestamp) {
touch_event_.ReleasePoint(0);
touch_event_.ReleasePoint(1);
- ForwardTouchEvent(target);
+ ForwardTouchEvent(target, timestamp);
}
-
-void SyntheticPinchGesture::ForwardTouchEvent(SyntheticGestureTarget* target)
- const {
+void SyntheticPinchGesture::ForwardTouchEvent(
+ SyntheticGestureTarget* target, const base::TimeTicks& timestamp) {
+ touch_event_.timeStampSeconds = ConvertTimestampToSeconds(timestamp);
target->DispatchInputEventToPlatform(
InputEvent(touch_event_, ui::LatencyInfo(), false));
}
@@ -125,42 +127,49 @@ void SyntheticPinchGesture::SetupCoordinates(SyntheticGestureTarget* target) {
// Move pointers away from each other to zoom in
// or towards each other to zoom out.
if (params_.zoom_in) {
- current_y_0_ = params_.anchor.y() - inner_distance_to_anchor;
- current_y_1_ = params_.anchor.y() + inner_distance_to_anchor;
+ start_y_0_ = params_.anchor.y() - inner_distance_to_anchor;
+ start_y_1_ = params_.anchor.y() + inner_distance_to_anchor;
target_y_0_ = params_.anchor.y() - outer_distance_to_anchor;
target_y_1_ = params_.anchor.y() + outer_distance_to_anchor;
} else {
- current_y_0_ = params_.anchor.y() - outer_distance_to_anchor;
- current_y_1_ = params_.anchor.y() + outer_distance_to_anchor;
+ start_y_0_ = params_.anchor.y() - outer_distance_to_anchor;
+ start_y_1_ = params_.anchor.y() + outer_distance_to_anchor;
target_y_0_ = params_.anchor.y() - inner_distance_to_anchor;
target_y_1_ = params_.anchor.y() + inner_distance_to_anchor;
}
}
-float SyntheticPinchGesture::GetDeltaForPointer0(
- const base::TimeDelta& interval) const {
- float total_abs_delta =
- params_.relative_pointer_speed_in_pixels_s * interval.InSecondsF();
+float SyntheticPinchGesture::GetDeltaForPointer0AndUpdateTimestamp(
+ base::TimeTicks* timestamp) const {
+ float total_abs_delta = params_.relative_pointer_speed_in_pixels_s *
jdduke (slow) 2014/01/03 18:24:30 DCHECK(timestamp);
Dominik Grewe 2014/01/06 11:46:07 Done.
+ (*timestamp - start_time_).InSecondsF();
// Make sure we're not moving too far in the final step.
- total_abs_delta =
- std::min(total_abs_delta, ComputeAbsoluteRemainingDistance());
+ if (total_abs_delta > ComputeAbsoluteDistance()) {
+ total_abs_delta = ComputeAbsoluteDistance();
+
+ // Update timestamp to match the end of the gesture.
+ int total_duration_in_ms = (1000.0f * ComputeAbsoluteDistance()) /
jdduke (slow) 2014/01/03 18:24:30 Nit: This may be slightly more readable as: 1000
Dominik Grewe 2014/01/06 11:46:07 Done.
+ params_.relative_pointer_speed_in_pixels_s;
+ *timestamp =
+ start_time_ + base::TimeDelta::FromMilliseconds(total_duration_in_ms);
+ }
float abs_delta_pointer_0 = total_abs_delta / 2;
return params_.zoom_in ? -abs_delta_pointer_0 : abs_delta_pointer_0;
}
-float SyntheticPinchGesture::ComputeAbsoluteRemainingDistance() const {
- float distance_0 = params_.zoom_in ? (current_y_0_ - target_y_0_)
- : (target_y_0_ - current_y_0_);
+float SyntheticPinchGesture::ComputeAbsoluteDistance() const {
+ float distance_0 =
+ params_.zoom_in ? (start_y_0_ - target_y_0_) : (target_y_0_ - start_y_0_);
DCHECK_GE(distance_0, 0);
// Both pointers move the same overall distance at the same speed.
return 2 * distance_0;
}
-bool SyntheticPinchGesture::HasReachedTarget() const {
- return ComputeAbsoluteRemainingDistance() == 0;
+bool SyntheticPinchGesture::HasReachedTarget(float delta) const {
+ return start_y_0_ + delta == target_y_0_;
jdduke (slow) 2014/01/03 18:24:30 Is it possible we'd run into floating point precis
Dominik Grewe 2014/01/06 11:46:07 I don't think that this could cause problems. In t
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698