// Copyright 2015 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'; /** * A class that manages updating the browser with zoom changes. */ class ZoomManager { /** * Constructs a ZoomManager * @param {!Viewport} viewport A Viewport for which to manage zoom. * @param {Function} setBrowserZoomFunction A function that sets the browser * zoom to the provided value. * @param {number} initialZoom The initial browser zoom level. */ constructor(viewport, setBrowserZoomFunction, initialZoom) { this.viewport_ = viewport; this.setBrowserZoomFunction_ = setBrowserZoomFunction; this.browserZoom_ = initialZoom; this.changingBrowserZoom_ = null; } /** * Invoked when a browser-initiated zoom-level change occurs. * @param {number} newZoom the zoom level to zoom to. */ onBrowserZoomChange(newZoom) { // If we are changing the browser zoom level, ignore any browser zoom level // change events. Either, the change occurred before our update and will be // overwritten, or the change being reported is the change we are making, // which we have already handled. if (this.changingBrowserZoom_) return; if (this.floatingPointEquals(this.browserZoom_, newZoom)) return; this.browserZoom_ = newZoom; this.viewport_.setZoom(newZoom); } /** * Invoked when an extension-initiated zoom-level change occurs. */ onPdfZoomChange() { // If we are already changing the browser zoom level in response to a // previous extension-initiated zoom-level change, ignore this zoom change. // Once the browser zoom level is changed, we check whether the extension's // zoom level matches the most recently sent zoom level. if (this.changingBrowserZoom_) return; let zoom = this.viewport_.zoom; if (this.floatingPointEquals(this.browserZoom_, zoom)) return; this.changingBrowserZoom_ = this.setBrowserZoomFunction_(zoom).then( function() { this.browserZoom_ = zoom; this.changingBrowserZoom_ = null; // The extension's zoom level may have changed while the browser zoom // change was in progress. We call back into onPdfZoomChange to ensure the // browser zoom is up to date. this.onPdfZoomChange(); }.bind(this)); } /** * Returns whether two numbers are approximately equal. * @param {number} a The first number. * @param {number} b The second number. */ floatingPointEquals(a, b) { let MIN_ZOOM_DELTA = 0.01; // If the zoom level is close enough to the current zoom level, don't // change it. This avoids us getting into an infinite loop of zoom changes // due to floating point error. return Math.abs(a - b) <= MIN_ZOOM_DELTA; } };