15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)'use strict';
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)(function() {
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function SwipeGestureOptions(opt_options) {
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (opt_options) {
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.element_ = opt_options.element;
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this.left_start_ratio_ = opt_options.left_start_ratio;
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this.top_start_ratio_ = opt_options.top_start_ratio;
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.direction_ = opt_options.direction;
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.distance_ = opt_options.distance;
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.speed_ = opt_options.speed;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.element_ = document.body;
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this.left_start_ratio_ = 0.5;
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      this.top_start_ratio_ = 0.5;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.direction_ = 'left';
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.distance_ = 0;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.speed_ = 800;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function supportedByBrowser() {
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return !!(window.chrome &&
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              chrome.gpuBenchmarking &&
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              chrome.gpuBenchmarking.swipe);
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This class swipes a page for a specified distance.
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  function SwipeAction(opt_callback) {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var self = this;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.beginMeasuringHook = function() {}
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.endMeasuringHook = function() {}
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.callback_ = opt_callback;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SwipeAction.prototype.start = function(opt_options) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.options_ = new SwipeGestureOptions(opt_options);
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Assign this.element_ here instead of constructor, because the constructor
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // ensures this method will be called after the document is loaded.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.element_ = this.options_.element_;
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    requestAnimationFrame(this.startGesture_.bind(this));
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SwipeAction.prototype.startGesture_ = function() {
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.beginMeasuringHook();
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var rect = __GestureCommon_GetBoundingVisibleRect(this.options_.element_);
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var start_left =
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        rect.left + rect.width * this.options_.left_start_ratio_;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var start_top =
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        rect.top + rect.height * this.options_.top_start_ratio_;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    chrome.gpuBenchmarking.swipe(this.options_.direction_,
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 this.options_.distance_,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 this.onGestureComplete_.bind(this),
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 start_left, start_top,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 this.options_.speed_);
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SwipeAction.prototype.onGestureComplete_ = function() {
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.endMeasuringHook();
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // We're done.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (this.callback_)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.callback_();
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window.__SwipeAction = SwipeAction;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window.__SwipeAction_SupportedByBrowser = supportedByBrowser;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)})();
76