84 lines
2.8 KiB
JavaScript
84 lines
2.8 KiB
JavaScript
|
// 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;
|
||
|
}
|
||
|
};
|