Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2778)

Unified Diff: chrome/browser/resources/pdf/zoom_manager.js

Issue 2503633002: Propagate browser zoom changes to embedded PDFs. (Closed)
Patch Set: Use American spelling of behaviour. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/resources/pdf/viewport.js ('k') | chrome/test/data/pdf/zoom_manager_test.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/resources/pdf/zoom_manager.js
diff --git a/chrome/browser/resources/pdf/zoom_manager.js b/chrome/browser/resources/pdf/zoom_manager.js
index 2b52c54aba365b95ecfc84ddfbc38ced89971912..25086938e3679e9082722cf07f78b0a1f75218bd 100644
--- a/chrome/browser/resources/pdf/zoom_manager.js
+++ b/chrome/browser/resources/pdf/zoom_manager.js
@@ -5,20 +5,109 @@
'use strict';
/**
- * A class that manages updating the browser with zoom changes.
+ * Abstract parent of classes that manage updating the browser
+ * with zoom changes and/or updating the viewer's zoom when
+ * the browser zoom changes.
*/
class ZoomManager {
/**
- * Constructs a ZoomManager
+ * Constructs a ZoomManager.
+ * @param {!Viewport} viewport A Viewport for which to manage zoom.
+ * @param {number} initialZoom The initial browser zoom level.
+ */
+ constructor(viewport, initialZoom) {
+ if (this.constructor === ZoomManager) {
+ throw new TypeError('Instantiated abstract class: ZoomManager');
+ }
+ this.viewport_ = viewport;
+ this.browserZoom_ = initialZoom;
+ }
+
+ /**
+ * Creates the appropriate kind of zoom manager given the zoom behavior.
+ * @param {BrowserApi.ZoomBehavior} zoomBehavior How to manage zoom.
+ * @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.
+ */
+ static create(zoomBehavior, viewport, setBrowserZoomFunction, initialZoom) {
+ switch (zoomBehavior) {
+ case BrowserApi.ZoomBehavior.MANAGE:
+ return new ActiveZoomManager(
+ viewport, setBrowserZoomFunction, initialZoom);
+ case BrowserApi.ZoomBehavior.PROPAGATE_PARENT:
+ return new EmbeddedZoomManager(viewport, initialZoom);
+ default:
+ return new InactiveZoomManager(viewport, initialZoom);
+ }
+ }
+
+ /**
+ * Invoked when a browser-initiated zoom-level change occurs.
+ * @param {number} newZoom the zoom level to zoom to.
+ */
+ onBrowserZoomChange(newZoom) {}
+
+ /**
+ * Invoked when an extension-initiated zoom-level change occurs.
+ */
+ onPdfZoomChange() {}
+
+ /**
+ * Combines the internal pdf zoom and the browser zoom to
+ * produce the total zoom level for the viewer.
+ * @param {number} internalZoom the zoom level internal to the viewer.
+ * @return {number} the total zoom level.
+ */
+ applyBrowserZoom(internalZoom) {
+ return this.browserZoom_ * internalZoom;
+ }
+
+ /**
+ * Given a zoom level, return the internal zoom level needed to
+ * produce that zoom level.
+ * @param {number} totalZoom the total zoom level.
+ * @return {number} the zoom level internal to the viewer.
+ */
+ internalZoomComponent(totalZoom) {
+ return totalZoom / this.browserZoom_;
+ }
+
+ /**
+ * 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;
+ }
+};
+
+/**
+ * InactiveZoomManager has no control over the browser's zoom
+ * and does not respond to browser zoom changes.
+ */
+class InactiveZoomManager extends ZoomManager {};
+
+/**
+ * ActiveZoomManager controls the browser's zoom.
+ */
+class ActiveZoomManager extends ZoomManager {
+ /**
+ * Constructs a ActiveZoomManager.
* @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;
+ super(viewport, initialZoom);
this.setBrowserZoomFunction_ = setBrowserZoomFunction;
- this.browserZoom_ = initialZoom;
this.changingBrowserZoom_ = null;
}
@@ -69,15 +158,42 @@ class ZoomManager {
}
/**
- * Returns whether two numbers are approximately equal.
- * @param {number} a The first number.
- * @param {number} b The second number.
+ * Combines the internal pdf zoom and the browser zoom to
+ * produce the total zoom level for the viewer.
+ * @param {number} internalZoom the zoom level internal to the viewer.
+ * @return {number} the total zoom level.
*/
- 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;
+ applyBrowserZoom(internalZoom) {
+ // The internal zoom and browser zoom are changed together, so the
+ // browser zoom is already applied.
+ return internalZoom;
+ }
+
+ /**
+ * Given a zoom level, return the internal zoom level needed to
+ * produce that zoom level.
+ * @param {number} totalZoom the total zoom level.
+ * @return {number} the zoom level internal to the viewer.
+ */
+ internalZoomComponent(totalZoom) {
+ // The internal zoom and browser zoom are changed together, so the
+ // internal zoom is the total zoom.
+ return totalZoom;
+ }
+};
+
+/**
+ * This EmbeddedZoomManager responds to changes in the browser zoom,
+ * but does not control the browser zoom.
+ */
+class EmbeddedZoomManager extends ZoomManager {
+ /**
+ * Invoked when a browser-initiated zoom-level change occurs.
+ * @param {number} newZoom the new browser zoom level.
+ */
+ onBrowserZoomChange(newZoom) {
+ let oldZoom = this.browserZoom_;
+ this.browserZoom_ = newZoom;
+ this.viewport_.updateZoomFromBrowserChange(oldZoom);
}
};
« no previous file with comments | « chrome/browser/resources/pdf/viewport.js ('k') | chrome/test/data/pdf/zoom_manager_test.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698