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