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