| // Copyright 2014 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. |
| |
| 'use strict'; |
| |
| (function() { |
| function supportedByBrowser() { |
| return !!(window.chrome && |
| chrome.gpuBenchmarking && |
| chrome.gpuBenchmarking.scrollBounce); |
| } |
| |
| function ScrollBounceAction(opt_callback) { |
| var self = this; |
| |
| this.beginMeasuringHook = function() {} |
| this.endMeasuringHook = function() {} |
| |
| this.callback_ = opt_callback; |
| } |
| |
| ScrollBounceAction.prototype.start = function(options) { |
| this.options_ = options; |
| // Assign this.element_ here instead of constructor, because the constructor |
| // ensures this method will be called after the document is loaded. |
| this.element_ = this.options_.element; |
| requestAnimationFrame(this.startGesture_.bind(this)); |
| }; |
| |
| ScrollBounceAction.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; |
| chrome.gpuBenchmarking.scrollBounce(this.options_.direction, |
| this.options_.distance, |
| this.options_.overscroll, |
| this.options_.repeat_count, |
| this.onGestureComplete_.bind(this), |
| start_left, start_top, |
| this.options_.speed); |
| }; |
| |
| ScrollBounceAction.prototype.onGestureComplete_ = function() { |
| this.endMeasuringHook(); |
| |
| // We're done. |
| if (this.callback_) |
| this.callback_(); |
| }; |
| |
| window.__ScrollBounceAction = ScrollBounceAction; |
| window.__ScrollBounceAction_SupportedByBrowser = supportedByBrowser; |
| })(); |