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

Unified Diff: content/child/web_gesture_curve_impl.cc

Issue 634373003: Consolidate content fling implementations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix win build Created 6 years, 2 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
« no previous file with comments | « content/child/web_gesture_curve_impl.h ('k') | content/child/web_gesture_curve_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/child/web_gesture_curve_impl.cc
diff --git a/content/child/web_gesture_curve_impl.cc b/content/child/web_gesture_curve_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a13db535a10821f50c3a996300a341209af9ebaa
--- /dev/null
+++ b/content/child/web_gesture_curve_impl.cc
@@ -0,0 +1,97 @@
+// Copyright 2014 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/child/web_gesture_curve_impl.h"
+
+#include "base/logging.h"
+#include "third_party/WebKit/public/platform/WebFloatSize.h"
+#include "third_party/WebKit/public/platform/WebGestureCurveTarget.h"
+#include "ui/events/gestures/fling_curve.h"
+#include "ui/gfx/vector2d.h"
+
+#if defined(OS_ANDROID)
+#include "ui/events/android/scroller.h"
+#endif
+
+using blink::WebGestureCurve;
+
+namespace content {
+namespace {
+
+scoped_ptr<ui::GestureCurve> CreateDefaultPlatformCurve(
+ const gfx::Vector2dF& initial_velocity) {
+ DCHECK(!initial_velocity.IsZero());
+#if defined(OS_ANDROID)
+ auto scroller = make_scoped_ptr(new ui::Scroller(ui::Scroller::Config()));
+ scroller->Fling(0,
+ 0,
+ initial_velocity.x(),
+ initial_velocity.y(),
+ INT_MIN,
+ INT_MAX,
+ INT_MIN,
+ INT_MAX,
+ base::TimeTicks());
+ return scroller.PassAs<ui::GestureCurve>();
+#else
+ return scoped_ptr<ui::GestureCurve>(
+ new ui::FlingCurve(initial_velocity, base::TimeTicks()));
+#endif
+}
+
+} // namespace
+
+// static
+scoped_ptr<WebGestureCurve> WebGestureCurveImpl::CreateFromDefaultPlatformCurve(
+ const gfx::Vector2dF& initial_velocity,
+ const gfx::Vector2dF& initial_offset) {
+ return CreateFrom(CreateDefaultPlatformCurve(initial_velocity),
+ initial_offset);
+}
+
+// static
+scoped_ptr<WebGestureCurve> WebGestureCurveImpl::CreateFrom(
+ scoped_ptr<ui::GestureCurve> curve,
+ const gfx::Vector2dF& initial_offset) {
+ return scoped_ptr<WebGestureCurve>(
+ new WebGestureCurveImpl(curve.Pass(), initial_offset));
+}
+
+WebGestureCurveImpl::WebGestureCurveImpl(scoped_ptr<ui::GestureCurve> curve,
+ const gfx::Vector2dF& initial_offset)
+ : curve_(curve.Pass()), last_offset_(initial_offset) {
+}
+
+WebGestureCurveImpl::~WebGestureCurveImpl() {
+}
+
+bool WebGestureCurveImpl::apply(double time,
+ blink::WebGestureCurveTarget* target) {
+ // If the fling has yet to start, simply return and report true to prevent
+ // fling termination.
+ if (time <= 0)
+ return true;
+
+ const base::TimeTicks time_ticks =
+ base::TimeTicks() + base::TimeDelta::FromSecondsD(time);
+ gfx::Vector2dF offset, velocity;
+ bool still_active =
+ curve_->ComputeScrollOffset(time_ticks, &offset, &velocity);
+
+ gfx::Vector2dF delta = offset - last_offset_;
+ last_offset_ = offset;
+
+ // As successive timestamps can be arbitrarily close (but monotonic!), don't
+ // assume that a zero delta means the curve has terminated.
+ if (delta.IsZero())
+ return still_active;
+
+ // scrollBy() could delete this curve if the animation is over, so don't touch
+ // any member variables after making that call.
+ bool did_scroll = target->scrollBy(blink::WebFloatSize(delta),
+ blink::WebFloatSize(velocity));
+ return did_scroll && still_active;
+}
+
+} // namespace content
« no previous file with comments | « content/child/web_gesture_curve_impl.h ('k') | content/child/web_gesture_curve_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698