1cef7893435aa41160dd1255c43cb8498279738ccChris Craik// Copyright 2015 The Chromium Authors. All rights reserved. 2cef7893435aa41160dd1255c43cb8498279738ccChris Craik// Use of this source code is governed by a BSD-style license that can be 3cef7893435aa41160dd1255c43cb8498279738ccChris Craik// found in the LICENSE file. 4cef7893435aa41160dd1255c43cb8498279738ccChris Craik 5cef7893435aa41160dd1255c43cb8498279738ccChris Craik// This file provides the DragAction object, which performs drag on a page 6cef7893435aa41160dd1255c43cb8498279738ccChris Craik// using given start and end positions: 7cef7893435aa41160dd1255c43cb8498279738ccChris Craik// 1. var action = new __DragAction(callback) 8cef7893435aa41160dd1255c43cb8498279738ccChris Craik// 2. action.start(drag_options) 9cef7893435aa41160dd1255c43cb8498279738ccChris Craik'use strict'; 10cef7893435aa41160dd1255c43cb8498279738ccChris Craik 11cef7893435aa41160dd1255c43cb8498279738ccChris Craik(function() { 12cef7893435aa41160dd1255c43cb8498279738ccChris Craik function DragGestureOptions(opt_options) { 13cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.element_ = opt_options.element; 14cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.left_start_ratio_ = opt_options.left_start_ratio; 15cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.top_start_ratio_ = opt_options.top_start_ratio; 16cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.left_end_ratio_ = opt_options.left_end_ratio; 17cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.top_end_ratio_ = opt_options.top_end_ratio; 18cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.speed_ = opt_options.speed; 19cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.gesture_source_type_ = opt_options.gesture_source_type; 20cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 21cef7893435aa41160dd1255c43cb8498279738ccChris Craik 22cef7893435aa41160dd1255c43cb8498279738ccChris Craik function supportedByBrowser() { 23cef7893435aa41160dd1255c43cb8498279738ccChris Craik return !!(window.chrome && 24cef7893435aa41160dd1255c43cb8498279738ccChris Craik chrome.gpuBenchmarking && 25cef7893435aa41160dd1255c43cb8498279738ccChris Craik chrome.gpuBenchmarking.smoothDrag); 26cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 27cef7893435aa41160dd1255c43cb8498279738ccChris Craik 28cef7893435aa41160dd1255c43cb8498279738ccChris Craik // This class performs drag action using given start and end positions, 29cef7893435aa41160dd1255c43cb8498279738ccChris Craik // by a single drag gesture. 30cef7893435aa41160dd1255c43cb8498279738ccChris Craik function DragAction(opt_callback) { 31cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.beginMeasuringHook = function() {} 32cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.endMeasuringHook = function() {} 33cef7893435aa41160dd1255c43cb8498279738ccChris Craik 34cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.callback_ = opt_callback; 35cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 36cef7893435aa41160dd1255c43cb8498279738ccChris Craik 37cef7893435aa41160dd1255c43cb8498279738ccChris Craik DragAction.prototype.start = function(opt_options) { 38cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.options_ = new DragGestureOptions(opt_options); 39cef7893435aa41160dd1255c43cb8498279738ccChris Craik requestAnimationFrame(this.startGesture_.bind(this)); 40cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 41cef7893435aa41160dd1255c43cb8498279738ccChris Craik 42cef7893435aa41160dd1255c43cb8498279738ccChris Craik DragAction.prototype.startGesture_ = function() { 43cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.beginMeasuringHook(); 44cef7893435aa41160dd1255c43cb8498279738ccChris Craik 45cef7893435aa41160dd1255c43cb8498279738ccChris Craik var rect = __GestureCommon_GetBoundingVisibleRect(this.options_.element_); 46cef7893435aa41160dd1255c43cb8498279738ccChris Craik var start_left = 47cef7893435aa41160dd1255c43cb8498279738ccChris Craik rect.left + (rect.width * this.options_.left_start_ratio_); 48cef7893435aa41160dd1255c43cb8498279738ccChris Craik var start_top = 49cef7893435aa41160dd1255c43cb8498279738ccChris Craik rect.top + (rect.height * this.options_.top_start_ratio_); 50cef7893435aa41160dd1255c43cb8498279738ccChris Craik var end_left = 51cef7893435aa41160dd1255c43cb8498279738ccChris Craik rect.left + (rect.width * this.options_.left_end_ratio_); 52cef7893435aa41160dd1255c43cb8498279738ccChris Craik var end_top = 53cef7893435aa41160dd1255c43cb8498279738ccChris Craik rect.top + (rect.height * this.options_.top_end_ratio_); 54cef7893435aa41160dd1255c43cb8498279738ccChris Craik chrome.gpuBenchmarking.smoothDrag( 55cef7893435aa41160dd1255c43cb8498279738ccChris Craik start_left, start_top, end_left, end_top, 56cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.onGestureComplete_.bind(this), this.options_.gesture_source_type_, 57cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.options_.speed_); 58cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 59cef7893435aa41160dd1255c43cb8498279738ccChris Craik 60cef7893435aa41160dd1255c43cb8498279738ccChris Craik DragAction.prototype.onGestureComplete_ = function() { 61cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.endMeasuringHook(); 62cef7893435aa41160dd1255c43cb8498279738ccChris Craik 63cef7893435aa41160dd1255c43cb8498279738ccChris Craik // We're done. 64cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (this.callback_) 65cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.callback_(); 66cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 67cef7893435aa41160dd1255c43cb8498279738ccChris Craik 68cef7893435aa41160dd1255c43cb8498279738ccChris Craik window.__DragAction = DragAction; 69cef7893435aa41160dd1255c43cb8498279738ccChris Craik window.__DragAction_SupportedByBrowser = supportedByBrowser; 70cef7893435aa41160dd1255c43cb8498279738ccChris Craik})(); 71