Index: tools/telemetry/telemetry/page/actions/drag.js |
diff --git a/tools/telemetry/telemetry/page/actions/drag.js b/tools/telemetry/telemetry/page/actions/drag.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8787d18223e1e6f21c95cf524b9065663f1f7603 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/page/actions/drag.js |
@@ -0,0 +1,70 @@ |
+// 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. |
+ |
+// This file provides the DragAction object, which performs drag on a page |
+// using given start and end positions: |
+// 1. var action = new __DragAction(callback) |
+// 2. action.start(drag_options) |
+'use strict'; |
+ |
+(function() { |
+ function DragGestureOptions(opt_options) { |
+ this.element_ = opt_options.element; |
+ this.left_start_ratio_ = opt_options.left_start_ratio; |
+ this.top_start_ratio_ = opt_options.top_start_ratio; |
+ this.left_end_ratio_ = opt_options.left_end_ratio; |
+ this.top_end_ratio_ = opt_options.top_end_ratio; |
+ this.speed_ = opt_options.speed; |
+ this.gesture_source_type_ = opt_options.gesture_source_type; |
+ } |
+ |
+ function supportedByBrowser() { |
+ return !!(window.chrome && |
+ chrome.gpuBenchmarking && |
+ chrome.gpuBenchmarking.smoothDrag); |
+ } |
+ |
+ // This class performs drag action using given start and end positions, |
+ // by a single drag gesture. |
+ function DragAction(opt_callback) { |
+ this.beginMeasuringHook = function() {} |
+ this.endMeasuringHook = function() {} |
+ |
+ this.callback_ = opt_callback; |
+ } |
+ |
+ DragAction.prototype.start = function(opt_options) { |
+ this.options_ = new DragGestureOptions(opt_options); |
+ requestAnimationFrame(this.startGesture_.bind(this)); |
+ }; |
+ |
+ DragAction.prototype.startGesture_ = function() { |
+ this.beginMeasuringHook(); |
+ |
+ var rect = __GestureCommon_GetBoundingVisibleRect(this.options_.element_); |
+ var start_left = |
+ rect.left + rect.width * this.options_.left_start_ratio_; |
+ var start_top = |
+ rect.top + rect.height * this.options_.top_start_ratio_; |
+ var end_left = |
+ rect.left + rect.width * this.options_.left_end_ratio_; |
+ var end_top = |
+ rect.top + rect.height * this.options_.top_end_ratio_; |
+ chrome.gpuBenchmarking.smoothDrag( |
+ start_left, start_top, end_left, end_top, |
+ this.onGestureComplete_.bind(this), this.options_.gesture_source_type_, |
+ this.options_.speed_); |
+ }; |
+ |
+ DragAction.prototype.onGestureComplete_ = function() { |
+ this.endMeasuringHook(); |
+ |
+ // We're done. |
+ if (this.callback_) |
+ this.callback_(); |
+ }; |
+ |
+ window.__DragAction = DragAction; |
+ window.__DragAction_SupportedByBrowser = supportedByBrowser; |
+})(); |