Commit 4ad0ec9f authored by raymes@chromium.org's avatar raymes@chromium.org

Hookup the PDF extension to the chrome extensions zoom API

BUG=303491

Review URL: https://codereview.chromium.org/392533002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@283225 0039d316-1c4b-4281-b951-d872f2087c98
parent 2cd924df
......@@ -134,6 +134,20 @@ function PDFViewer() {
// Setup the keyboard event listener.
document.onkeydown = this.handleKeyEvent_.bind(this);
// Set up the zoom API.
chrome.tabs.setZoomSettings({mode: 'manual', scope: 'per-tab'},
this.afterZoom_.bind(this));
chrome.tabs.onZoomChange.addListener(function(zoomChangeInfo) {
// 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 to to
// floating point error.
var MIN_ZOOM_DELTA = 0.01;
var zoomDelta = Math.abs(this.viewport_.zoom -
zoomChangeInfo.newZoomFactor);
if (zoomDelta > MIN_ZOOM_DELTA)
this.viewport_.setZoom(zoomChangeInfo.newZoomFactor);
}.bind(this));
}
PDFViewer.prototype = {
......@@ -205,22 +219,6 @@ PDFViewer.prototype = {
this.viewport.position = position;
}
return;
case 187: // +/= key.
case 107: // Numpad + key.
if (e.ctrlKey || e.metaKey) {
this.viewport_.zoomIn();
// Since we do the zooming of the page.
e.preventDefault();
}
return;
case 189: // -/_ key.
case 109: // Numpad - key.
if (e.ctrlKey || e.metaKey) {
this.viewport_.zoomOut();
// Since we do the zooming of the page.
e.preventDefault();
}
return;
case 83: // s key.
if (e.ctrlKey || e.metaKey) {
// Simulate a click on the button so that the <a download ...>
......@@ -381,6 +379,10 @@ PDFViewer.prototype = {
afterZoom_: function() {
var position = this.viewport_.position;
var zoom = this.viewport_.zoom;
if (!this.setZoomInProgress_) {
this.setZoomInProgress_ = true;
chrome.tabs.setZoom(zoom, this.setZoomComplete_.bind(this, zoom));
}
this.plugin_.postMessage({
type: 'viewport',
zoom: zoom,
......@@ -389,6 +391,22 @@ PDFViewer.prototype = {
});
},
/**
* @private
* A callback that's called after chrome.tabs.setZoom is complete. This will
* call chrome.tabs.setZoom again if the zoom level has changed since it was
* last called.
* @param {number} lastZoom the zoom level that chrome.tabs.setZoom was called
* with.
*/
setZoomComplete_: function(lastZoom) {
var zoom = this.viewport_.zoom;
if (zoom != lastZoom)
chrome.tabs.setZoom(zoom, this.setZoomComplete_.bind(this, zoom));
else
this.setZoomInProgress_ = false;
},
/**
* @private
* A callback that's called after the viewport changes.
......
......@@ -206,9 +206,11 @@ Viewport.prototype = {
* Sets the zoom of the viewport.
* @param {number} newZoom the zoom level to zoom to.
*/
setZoom_: function(newZoom) {
if (!this.allowedToChangeZoom_)
throw 'Called Viewport.setZoom_ without calling Viewport.mightZoom_.';
setZoomInternal_: function(newZoom) {
if (!this.allowedToChangeZoom_) {
throw 'Called Viewport.setZoomInternal_ without calling ' +
'Viewport.mightZoom_.';
}
var oldZoom = this.zoom_;
this.zoom_ = newZoom;
// Record the scroll position (relative to the middle of the window).
......@@ -224,12 +226,13 @@ Viewport.prototype = {
},
/**
* @private
* Sets the zoom for testing purposes.
* Sets the zoom to the given zoom level.
* @param {number} newZoom the zoom level to zoom to.
*/
setZoomForTest_: function(newZoom) {
setZoom: function(newZoom) {
this.mightZoom_(function() {
this.setZoom_(newZoom);
this.setZoomInternal_(newZoom);
this.updateViewport_();
}.bind(this));
},
......@@ -381,7 +384,8 @@ Viewport.prototype = {
var oldY = this.window_.pageYOffset / this.zoom_;
// When computing fit-to-width, the maximum width of a page in the
// document is used, which is equal to the size of the document width.
this.setZoom_(this.computeFittingZoom_(this.documentDimensions_, true));
this.setZoomInternal_(this.computeFittingZoom_(this.documentDimensions_,
true));
var page = this.getMostVisiblePage();
this.window_.scrollTo(0, oldY * this.zoom_);
this.updateViewport_();
......@@ -398,7 +402,7 @@ Viewport.prototype = {
if (!this.documentDimensions_)
return;
var page = this.getMostVisiblePage();
this.setZoom_(this.computeFittingZoom_(
this.setZoomInternal_(this.computeFittingZoom_(
this.pageDimensions_[page], false));
// Center the document in the page by scrolling by the amount of empty
// space to the left of the document.
......@@ -422,7 +426,7 @@ Viewport.prototype = {
if (Viewport.ZOOM_FACTORS[i] < this.zoom_)
nextZoom = Viewport.ZOOM_FACTORS[i];
}
this.setZoom_(nextZoom);
this.setZoomInternal_(nextZoom);
this.updateViewport_();
}.bind(this));
},
......@@ -438,7 +442,7 @@ Viewport.prototype = {
if (Viewport.ZOOM_FACTORS[i] > this.zoom_)
nextZoom = Viewport.ZOOM_FACTORS[i];
}
this.setZoom_(nextZoom);
this.setZoomInternal_(nextZoom);
this.updateViewport_();
}.bind(this));
},
......@@ -472,9 +476,10 @@ Viewport.prototype = {
this.documentDimensions_ = documentDimensions;
this.pageDimensions_ = this.documentDimensions_.pageDimensions;
if (initialDimensions) {
this.setZoom_(this.computeFittingZoom_(this.documentDimensions_, true));
this.setZoomInternal_(this.computeFittingZoom_(this.documentDimensions_,
true));
if (this.zoom_ > 1)
this.setZoom_(1);
this.setZoomInternal_(1);
this.window_.scrollTo(0, 0);
}
this.contentSizeChanged_();
......
......@@ -13,7 +13,7 @@ var tests = [
// Verify that the initial zoom is less than or equal to 100%.
chrome.test.assertTrue(viewer.viewport.zoom <= 1);
viewer.viewport.setZoomForTest_(1);
viewer.viewport.setZoom(1);
var sizer = document.getElementById('sizer');
chrome.test.assertEq(826, sizer.offsetWidth);
chrome.test.assertEq(1066, sizer.offsetHeight);
......
......@@ -113,7 +113,7 @@ var tests = [
// Test setting the zoom without the document dimensions set. The sizer
// shouldn't change size.
mockCallback.reset();
viewport.setZoomForTest_(0.5);
viewport.setZoom(0.5);
chrome.test.assertEq(0.5, viewport.zoom);
chrome.test.assertTrue(mockCallback.wasCalled);
chrome.test.assertEq('0px', mockSizer.style.width);
......@@ -121,12 +121,12 @@ var tests = [
chrome.test.assertEq(0, mockWindow.pageXOffset);
chrome.test.assertEq(0, mockWindow.pageYOffset);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
viewport.setDocumentDimensions(new MockDocumentDimensions(200, 200));
// Test zooming out.
mockCallback.reset();
viewport.setZoomForTest_(0.5);
viewport.setZoom(0.5);
chrome.test.assertEq(0.5, viewport.zoom);
chrome.test.assertTrue(mockCallback.wasCalled);
chrome.test.assertEq('100px', mockSizer.style.width);
......@@ -134,7 +134,7 @@ var tests = [
// Test zooming in.
mockCallback.reset();
viewport.setZoomForTest_(2);
viewport.setZoom(2);
chrome.test.assertEq(2, viewport.zoom);
chrome.test.assertTrue(mockCallback.wasCalled);
chrome.test.assertEq('400px', mockSizer.style.width);
......@@ -142,10 +142,10 @@ var tests = [
// Test that the scroll position scales correctly. It scales relative to the
// center of the page.
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockWindow.pageXOffset = 50;
mockWindow.pageYOffset = 50;
viewport.setZoomForTest_(2);
viewport.setZoom(2);
chrome.test.assertEq('400px', mockSizer.style.width);
chrome.test.assertEq('400px', mockSizer.style.height);
chrome.test.assertEq(150, mockWindow.pageXOffset);
......@@ -163,7 +163,7 @@ var tests = [
documentDimensions.addPage(150, 100);
documentDimensions.addPage(100, 200);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
// Scrolled to the start of the first page.
mockWindow.scrollTo(0, 0);
......@@ -186,7 +186,7 @@ var tests = [
chrome.test.assertEq(2, viewport.getMostVisiblePage());
// Scrolled just over half way through the first page with 2x zoom.
viewport.setZoomForTest_(2);
viewport.setZoom(2);
mockWindow.scrollTo(0, 151);
chrome.test.assertEq(1, viewport.getMostVisiblePage());
chrome.test.succeed();
......@@ -203,7 +203,7 @@ var tests = [
// Test with a document width which matches the window width.
documentDimensions.addPage(100, 100);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(0.1);
viewport.setZoom(0.1);
mockCallback.reset();
viewport.fitToWidth();
chrome.test.assertTrue(mockCallback.wasCalled);
......@@ -235,7 +235,7 @@ var tests = [
documentDimensions.reset();
documentDimensions.addPage(50, 400);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockWindow.scrollTo(0, 100);
mockCallback.reset();
viewport.fitToWidth();
......@@ -271,7 +271,7 @@ var tests = [
// Test with a page size which matches the window size.
documentDimensions.addPage(100, 100);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(0.1);
viewport.setZoom(0.1);
mockCallback.reset();
viewport.fitToPage();
chrome.test.assertTrue(mockCallback.wasCalled);
......@@ -307,7 +307,7 @@ var tests = [
documentDimensions.addPage(200, 100);
documentDimensions.addPage(100, 400);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockWindow.scrollTo(0, 0);
mockCallback.reset();
viewport.fitToPage();
......@@ -315,7 +315,7 @@ var tests = [
chrome.test.assertEq('100px', mockSizer.style.width);
chrome.test.assertEq('250px', mockSizer.style.height);
chrome.test.assertEq(0.5, viewport.zoom);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockWindow.scrollTo(0, 100);
mockCallback.reset();
viewport.fitToPage();
......@@ -329,13 +329,13 @@ var tests = [
documentDimensions.addPage(200, 200);
documentDimensions.addPage(100, 400);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockWindow.scrollTo(0, 0);
viewport.fitToPage();
chrome.test.assertEq(0.5, viewport.zoom);
chrome.test.assertEq(0, viewport.position.x);
chrome.test.assertEq(0, viewport.position.y);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockWindow.scrollTo(0, 175);
viewport.fitToPage();
chrome.test.assertEq(0.25, viewport.zoom);
......@@ -357,7 +357,7 @@ var tests = [
documentDimensions.addPage(200, 200);
documentDimensions.addPage(100, 400);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
mockCallback.reset();
viewport.goToPage(0);
......@@ -377,7 +377,7 @@ var tests = [
chrome.test.assertEq(0, viewport.position.x);
chrome.test.assertEq(300, viewport.position.y);
viewport.setZoomForTest_(0.5);
viewport.setZoom(0.5);
mockCallback.reset();
viewport.goToPage(2);
chrome.test.assertTrue(mockCallback.wasCalled);
......@@ -396,7 +396,7 @@ var tests = [
documentDimensions.addPage(100, 100);
documentDimensions.addPage(200, 200);
viewport.setDocumentDimensions(documentDimensions);
viewport.setZoomForTest_(1);
viewport.setZoom(1);
// Test that the rect of the first page is positioned/sized correctly.
mockWindow.scrollTo(0, 0);
......@@ -447,7 +447,7 @@ var tests = [
};
viewport = new Viewport(mockWindow, mockSizer, function() {},
beforeZoom, afterZoom, 0);
viewport.setZoomForTest_(0.5);
viewport.setZoom(0.5);
chrome.test.succeed();
}
];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment