1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// This file provides the PinchAction object, which zooms into or out of a 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// page by a given scale factor: 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 1. var action = new __PinchAction(callback) 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// 2. action.start(pinch_options) 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)'use strict'; 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)(function() { 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) function PinchGestureOptions(opt_options) { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (opt_options) { 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this.element_ = opt_options.element; 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.left_anchor_ratio_ = opt_options.left_anchor_ratio; 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.top_anchor_ratio_ = opt_options.top_anchor_ratio; 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.scale_factor_ = opt_options.scale_factor; 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this.speed_ = opt_options.speed; 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this.element_ = document.body; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.left_anchor_ratio_ = 0.5; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.top_anchor_ratio_ = 0.5; 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this.scale_factor_ = 2.0; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this.speed_ = 800; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) function supportedByBrowser() { 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !!(window.chrome && 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome.gpuBenchmarking && 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome.gpuBenchmarking.pinchBy); 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This class zooms into or out of a page, given a number of pixels for 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the synthetic pinch gesture to cover. 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) function PinchAction(opt_callback) { 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) var self = this; 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this.beginMeasuringHook = function() {} 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this.endMeasuringHook = function() {} 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this.callback_ = opt_callback; 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PinchAction.prototype.start = function(opt_options) { 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this.options_ = new PinchGestureOptions(opt_options); 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) requestAnimationFrame(this.startPass_.bind(this)); 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PinchAction.prototype.startPass_ = function() { 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this.beginMeasuringHook(); 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) var rect = __GestureCommon_GetBoundingVisibleRect(this.options_.element_); 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) var anchor_left = 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rect.left + rect.width * this.options_.left_anchor_ratio_; 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) var anchor_top = 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rect.top + rect.height * this.options_.top_anchor_ratio_; 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) chrome.gpuBenchmarking.pinchBy(this.options_.scale_factor_, 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) anchor_left, anchor_top, 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) this.onGestureComplete_.bind(this), 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch this.options_.speed_); 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PinchAction.prototype.onGestureComplete_ = function() { 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this.endMeasuringHook(); 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (this.callback_) 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) this.callback_(); 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) window.__PinchAction = PinchAction; 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window.__PinchAction_SupportedByBrowser = supportedByBrowser; 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)})(); 76