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

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

Issue 1349813002: Enable pinch-zoom telemetry on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@telemetry
Patch Set: feedback Created 5 years, 3 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 53e15d78fda2dae78b4a1c223d0cc2a5b9685f9c..346eaade596c494859a7efa22a42c8da22f1cbb5 100644
--- a/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
+++ b/content/browser/renderer_host/input/synthetic_pinch_gesture.cc
@@ -1,165 +1,39 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/renderer_host/input/synthetic_pinch_gesture.h"
-#include <cmath>
-
-#include "base/logging.h"
-#include "ui/events/latency_info.h"
+#include "content/browser/renderer_host/input/synthetic_touchpad_pinch_gesture.h"
+#include "content/browser/renderer_host/input/synthetic_touchscreen_pinch_gesture.h"
namespace content {
SyntheticPinchGesture::SyntheticPinchGesture(
const SyntheticPinchGestureParams& params)
- : params_(params),
- start_y_0_(0.0f),
- start_y_1_(0.0f),
- max_pointer_delta_0_(0.0f),
- gesture_source_type_(SyntheticGestureParams::DEFAULT_INPUT),
- state_(SETUP) {
- DCHECK_GT(params_.scale_factor, 0.0f);
-}
-
+ : params_(params) {}
SyntheticPinchGesture::~SyntheticPinchGesture() {}
SyntheticGesture::Result SyntheticPinchGesture::ForwardInputEvents(
- const base::TimeTicks& timestamp, SyntheticGestureTarget* target) {
- if (state_ == SETUP) {
- gesture_source_type_ = params_.gesture_source_type;
- if (gesture_source_type_ == SyntheticGestureParams::DEFAULT_INPUT)
- gesture_source_type_ = target->GetDefaultSyntheticGestureSourceType();
-
- state_ = STARTED;
- start_time_ = timestamp;
- }
-
- DCHECK_NE(gesture_source_type_, SyntheticGestureParams::DEFAULT_INPUT);
- if (gesture_source_type_ == SyntheticGestureParams::TOUCH_INPUT)
- ForwardTouchInputEvents(timestamp, target);
- else
- return SyntheticGesture::GESTURE_SOURCE_TYPE_NOT_IMPLEMENTED;
-
- return (state_ == DONE) ? SyntheticGesture::GESTURE_FINISHED
- : SyntheticGesture::GESTURE_RUNNING;
-}
-
-void SyntheticPinchGesture::ForwardTouchInputEvents(
- const base::TimeTicks& timestamp, SyntheticGestureTarget* target) {
- switch (state_) {
- case STARTED:
- // Check for an early finish.
- if (params_.scale_factor == 1.0f) {
- state_ = DONE;
- break;
- }
- SetupCoordinatesAndStopTime(target);
- PressTouchPoints(target, timestamp);
- state_ = MOVING;
- break;
- case MOVING: {
- base::TimeTicks event_timestamp = ClampTimestamp(timestamp);
- float delta = GetDeltaForPointer0AtTime(event_timestamp);
- MoveTouchPoints(target, delta, event_timestamp);
- if (HasReachedTarget(event_timestamp)) {
- ReleaseTouchPoints(target, event_timestamp);
- state_ = DONE;
- }
- } break;
- case SETUP:
- NOTREACHED() << "State SETUP invalid for synthetic pinch.";
- case DONE:
- NOTREACHED() << "State DONE invalid for synthetic pinch.";
- }
-}
-
-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::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;
-
- touch_event_.MovePoint(0, params_.anchor.x(), current_y_0);
- touch_event_.MovePoint(1, params_.anchor.x(), current_y_1);
- ForwardTouchEvent(target, timestamp);
-}
-
-void SyntheticPinchGesture::ReleaseTouchPoints(
- SyntheticGestureTarget* target, const base::TimeTicks& timestamp) {
- touch_event_.ReleasePoint(0);
- touch_event_.ReleasePoint(1);
- ForwardTouchEvent(target, timestamp);
-}
-
-void SyntheticPinchGesture::ForwardTouchEvent(
- SyntheticGestureTarget* target, const base::TimeTicks& timestamp) {
- touch_event_.timeStampSeconds = ConvertTimestampToSeconds(timestamp);
- target->DispatchInputEventToPlatform(touch_event_);
-}
-
-void SyntheticPinchGesture::SetupCoordinatesAndStopTime(
+ const base::TimeTicks& timestamp,
SyntheticGestureTarget* target) {
- // To achieve the specified scaling factor, the ratio of the final to the
- // initial span (distance between the pointers) has to be equal to the scaling
- // factor. Since we're moving both pointers at the same speed, each pointer's
- // distance to the anchor is half the span.
- float initial_distance_to_anchor, final_distance_to_anchor;
- if (params_.scale_factor > 1.0f) { // zooming in
- initial_distance_to_anchor = target->GetMinScalingSpanInDips() / 2.0f;
- final_distance_to_anchor =
- (initial_distance_to_anchor + target->GetTouchSlopInDips()) *
- params_.scale_factor;
- } else { // zooming out
- final_distance_to_anchor = target->GetMinScalingSpanInDips() / 2.0f;
- initial_distance_to_anchor =
- (final_distance_to_anchor / params_.scale_factor) +
- target->GetTouchSlopInDips();
+ if (!lazy_gesture_) {
+ SyntheticGestureParams::GestureSourceType source_type =
+ params_.gesture_source_type;
+ if (source_type == SyntheticGestureParams::DEFAULT_INPUT) {
+ source_type = target->GetDefaultSyntheticGestureSourceType();
+ }
+
+ DCHECK_NE(SyntheticGestureParams::DEFAULT_INPUT, source_type);
+ if (source_type == SyntheticGestureParams::TOUCH_INPUT) {
+ lazy_gesture_.reset(new SyntheticTouchscreenPinchGesture(params_));
+ } else {
+ DCHECK_EQ(SyntheticGestureParams::MOUSE_INPUT, source_type);
+ lazy_gesture_.reset(new SyntheticTouchpadPinchGesture(params_));
+ }
}
- start_y_0_ = params_.anchor.y() - initial_distance_to_anchor;
- start_y_1_ = params_.anchor.y() + initial_distance_to_anchor;
-
- max_pointer_delta_0_ = initial_distance_to_anchor - final_distance_to_anchor;
-
- int64 total_duration_in_us = static_cast<int64>(
- 1e6 * (static_cast<double>(std::abs(2 * max_pointer_delta_0_)) /
- params_.relative_pointer_speed_in_pixels_s));
- DCHECK_GT(total_duration_in_us, 0);
- stop_time_ =
- start_time_ + base::TimeDelta::FromMicroseconds(total_duration_in_us);
-}
-
-float SyntheticPinchGesture::GetDeltaForPointer0AtTime(
- const base::TimeTicks& timestamp) const {
- // Make sure the final delta is correct. Using the computation below can lead
- // to issues with floating point precision.
- if (HasReachedTarget(timestamp))
- return max_pointer_delta_0_;
-
- float total_abs_delta = params_.relative_pointer_speed_in_pixels_s *
- (timestamp - start_time_).InSecondsF();
- float abs_delta_pointer_0 = total_abs_delta / 2.0f;
- return (params_.scale_factor > 1.0f) ? -abs_delta_pointer_0
- : abs_delta_pointer_0;
-}
-
-base::TimeTicks SyntheticPinchGesture::ClampTimestamp(
- const base::TimeTicks& timestamp) const {
- return std::min(timestamp, stop_time_);
-}
-
-bool SyntheticPinchGesture::HasReachedTarget(const base::TimeTicks& timestamp)
- const {
- return timestamp >= stop_time_;
+ return lazy_gesture_->ForwardInputEvents(timestamp, target);
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698