diff options
Diffstat (limited to 'catapult/telemetry/telemetry/internal/actions/pinch.js')
-rw-r--r-- | catapult/telemetry/telemetry/internal/actions/pinch.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/catapult/telemetry/telemetry/internal/actions/pinch.js b/catapult/telemetry/telemetry/internal/actions/pinch.js new file mode 100644 index 00000000..4abb66e6 --- /dev/null +++ b/catapult/telemetry/telemetry/internal/actions/pinch.js @@ -0,0 +1,77 @@ +// Copyright 2013 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 PinchAction object, which zooms into or out of a +// page by a given scale factor: +// 1. var action = new __PinchAction(callback) +// 2. action.start(pinch_options) +'use strict'; + +(function() { + + function PinchGestureOptions(opt_options) { + if (opt_options) { + this.element_ = opt_options.element; + this.left_anchor_ratio_ = opt_options.left_anchor_ratio; + this.top_anchor_ratio_ = opt_options.top_anchor_ratio; + this.scale_factor_ = opt_options.scale_factor; + this.speed_ = opt_options.speed; + } else { + this.element_ = document.body; + this.left_anchor_ratio_ = 0.5; + this.top_anchor_ratio_ = 0.5; + this.scale_factor_ = 2.0; + this.speed_ = 800; + } + } + + function supportedByBrowser() { + return !!(window.chrome && + chrome.gpuBenchmarking && + chrome.gpuBenchmarking.pinchBy && + chrome.gpuBenchmarking.visualViewportHeight && + chrome.gpuBenchmarking.visualViewportWidth); + } + + // This class zooms into or out of a page, given a number of pixels for + // the synthetic pinch gesture to cover. + function PinchAction(opt_callback) { + var self = this; + + this.beginMeasuringHook = function() {}; + this.endMeasuringHook = function() {}; + + this.callback_ = opt_callback; + }; + + PinchAction.prototype.start = function(opt_options) { + this.options_ = new PinchGestureOptions(opt_options); + + requestAnimationFrame(this.startPass_.bind(this)); + }; + + PinchAction.prototype.startPass_ = function() { + this.beginMeasuringHook(); + + var rect = __GestureCommon_GetBoundingVisibleRect(this.options_.element_); + var anchor_left = + rect.left + rect.width * this.options_.left_anchor_ratio_; + var anchor_top = + rect.top + rect.height * this.options_.top_anchor_ratio_; + chrome.gpuBenchmarking.pinchBy(this.options_.scale_factor_, + anchor_left, anchor_top, + this.onGestureComplete_.bind(this), + this.options_.speed_); + }; + + PinchAction.prototype.onGestureComplete_ = function() { + this.endMeasuringHook(); + + if (this.callback_) + this.callback_(); + }; + + window.__PinchAction = PinchAction; + window.__PinchAction_SupportedByBrowser = supportedByBrowser; +})(); |