blob: 4abb66e6431620ec2f4db92cefed3eb091bc2dee [file] [log] [blame]
// 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;
})();