| // 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; |
| })(); |