Commit d88f8d8d authored by Kevin McNee's avatar Kevin McNee Committed by Commit Bot

PDF Viewer: Unset page fitting on pinch zoom

When the user manually zooms, any page fitting (e.g. fit-to-width) is
unset and subsequent window resizes do not change zoom. This was not
being done for the PDF viewer's internal pinch zoom mechanism.

Bug: 1123976
Change-Id: Ifcc2b14fb05b7a339a7463d89f9a00c00739a43a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2392700Reviewed-by: default avatarRebekah Potter <rbpotter@chromium.org>
Commit-Queue: Kevin McNee <mcnee@chromium.org>
Cr-Commit-Position: refs/heads/master@{#804447}
parent 460deb76
...@@ -1428,6 +1428,8 @@ export class Viewport { ...@@ -1428,6 +1428,8 @@ export class Viewport {
this.keepContentCentered_ = false; this.keepContentCentered_ = false;
} }
this.fittingType_ = FittingType.NONE;
this.setPinchZoomInternal_( this.setPinchZoomInternal_(
scaleDelta, this.frameToPluginCoordinate_(center)); scaleDelta, this.frameToPluginCoordinate_(center));
this.updateViewport_(); this.updateViewport_();
...@@ -1484,6 +1486,11 @@ export class Viewport { ...@@ -1484,6 +1486,11 @@ export class Viewport {
this.firstPinchCenterInFrame_ = e.detail.center; this.firstPinchCenterInFrame_ = e.detail.center;
}); });
} }
/** @return {!GestureDetector} */
getGestureDetectorForTesting() {
return this.gestureDetector_;
}
} }
/** /**
......
...@@ -311,6 +311,10 @@ export function getZoomableViewport( ...@@ -311,6 +311,10 @@ export function getZoomableViewport(
const dummyContent = const dummyContent =
/** @type {!HTMLDivElement} */ (document.createElement('div')); /** @type {!HTMLDivElement} */ (document.createElement('div'));
document.body.appendChild(dummyContent); document.body.appendChild(dummyContent);
const dummyPlugin =
/** @type {!HTMLEmbedElement} */ (document.createElement('embed'));
dummyPlugin.id = 'plugin';
dummyContent.appendChild(dummyPlugin);
const viewport = new Viewport( const viewport = new Viewport(
/** @type {!HTMLElement} */ (scrollParent), /** @type {!HTMLElement} */ (scrollParent),
/** @type {!HTMLDivElement} */ (sizer), dummyContent, scrollbarWidth, /** @type {!HTMLDivElement} */ (sizer), dummyContent, scrollbarWidth,
......
...@@ -620,6 +620,56 @@ const tests = [ ...@@ -620,6 +620,56 @@ const tests = [
chrome.test.succeed(); chrome.test.succeed();
}, },
// Regression test for https://crbug.com/1123976
function testPinchZoomingUnsetsPageFitting() {
const mockWindow = new MockElement(100, 100, null);
const viewport = getZoomableViewport(mockWindow, new MockSizer(), 0, 1, 0);
const documentDimensions = new MockDocumentDimensions();
documentDimensions.addPage(50, 100);
viewport.setDocumentDimensions(documentDimensions);
viewport.fitToWidth();
chrome.test.assertEq(FittingType.FIT_TO_WIDTH, viewport.fittingType);
chrome.test.assertEq(2, viewport.getZoom());
// Change the zoom using the viewer's pinch zooming mechanism.
const gestureEventTarget =
viewport.getGestureDetectorForTesting().getEventTarget();
const pinchCenter = {x: 25, y: 25};
const scaleChange = 0.5;
gestureEventTarget.dispatchEvent(
new CustomEvent('pinchstart', {detail: {center: pinchCenter}}));
gestureEventTarget.dispatchEvent(new CustomEvent('pinchupdate', {
detail: {
scaleRatio: scaleChange,
direction: 'out',
startScaleRatio: scaleChange,
center: pinchCenter,
}
}));
gestureEventTarget.dispatchEvent(new CustomEvent('pinchend', {
detail: {
startScaleRatio: scaleChange,
center: pinchCenter,
}
}));
// Pinch updates are throttled by rAF, so we schedule the rest of the test
// after the pinch takes effect.
window.requestAnimationFrame(() => {
chrome.test.assertEq(1, viewport.getZoom());
// Changing the zoom using a pinch should unset the page fitting as it
// would with other zooming mechanisms.
chrome.test.assertEq(FittingType.NONE, viewport.fittingType);
// A subsequent window resize should not cause a zoom change.
mockWindow.setSize(101, 100);
chrome.test.assertEq(1, viewport.getZoom());
chrome.test.succeed();
});
},
function testGoToNextPage() { function testGoToNextPage() {
const mockWindow = new MockElement(100, 100, null); const mockWindow = new MockElement(100, 100, null);
const mockSizer = new MockSizer(); const mockSizer = new MockSizer();
......
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