Commit e7afbcec authored by rbpotter's avatar rbpotter Committed by Commit Bot

PDF Viewer: Confirm zoom value only on enter/blur

Bug: 1136703
Change-Id: If1370e61db35049f12e22beb6219651056b326ee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2461801
Commit-Queue: Rebekah Potter <rbpotter@chromium.org>
Reviewed-by: default avatardpapad <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#815768}
parent a56646c5
...@@ -190,8 +190,8 @@ ...@@ -190,8 +190,8 @@
</cr-icon-button> </cr-icon-button>
<input type="text" value="100%" <input type="text" value="100%"
aria-label="$i18n{zoomTextInputAriaLabel}" aria-label="$i18n{zoomTextInputAriaLabel}"
on-input="onZoomInput_" on-pointerup="onZoomInputPointerup_" on-change="onZoomChange_" on-pointerup="onZoomInputPointerup_"
on-blur="onZoomInputBlur_"> on-blur="onZoomChange_">
</input> </input>
<cr-icon-button iron-icon="pdf:add" title="$i18n{tooltipZoomIn}" <cr-icon-button iron-icon="pdf:add" title="$i18n{tooltipZoomIn}"
aria-label="$i18n{tooltipZoomIn}" on-click="onZoomInClick_"> aria-label="$i18n{tooltipZoomIn}" on-click="onZoomInClick_">
......
...@@ -76,6 +76,8 @@ export class ViewerPdfToolbarNewElement extends PolymerElement { ...@@ -76,6 +76,8 @@ export class ViewerPdfToolbarNewElement extends PolymerElement {
type: Number, type: Number,
observer: 'viewportZoomChanged_', observer: 'viewportZoomChanged_',
}, },
/** @type {!{min: number, max: number}} */
zoomBounds: Object,
sidenavCollapsed: Boolean, sidenavCollapsed: Boolean,
twoUpViewEnabled: Boolean, twoUpViewEnabled: Boolean,
...@@ -127,9 +129,6 @@ export class ViewerPdfToolbarNewElement extends PolymerElement { ...@@ -127,9 +129,6 @@ export class ViewerPdfToolbarNewElement extends PolymerElement {
/** @private {boolean} */ /** @private {boolean} */
this.moreMenuOpen_ = false; this.moreMenuOpen_ = false;
/** @private {?number} */
this.zoomTimeout_ = null;
} }
/** /**
...@@ -293,20 +292,25 @@ export class ViewerPdfToolbarNewElement extends PolymerElement { ...@@ -293,20 +292,25 @@ export class ViewerPdfToolbarNewElement extends PolymerElement {
} }
/** @private */ /** @private */
onZoomInput_() { onZoomChange_() {
if (this.zoomTimeout_) { const input = this.getZoomInput_();
clearTimeout(this.zoomTimeout_); let value = Number.parseInt(input.value, 10);
value = Math.max(Math.min(value, this.zoomBounds.max), this.zoomBounds.min);
if (this.sendZoomChanged_(value)) {
return;
} }
this.zoomTimeout_ = setTimeout(() => this.sendZoomChanged_(), 250);
const zoom = Math.round(this.viewportZoom * 100);
const zoomString = `${zoom}%`;
input.value = zoomString;
} }
/** /**
* @param {number} value The new zoom value
* @return {boolean} Whether the zoom-changed event was sent. * @return {boolean} Whether the zoom-changed event was sent.
* @private * @private
*/ */
sendZoomChanged_() { sendZoomChanged_(value) {
this.zoomTimeout_ = null;
const value = Number.parseInt(this.getZoomInput_().value, 10);
if (Number.isNaN(value)) { if (Number.isNaN(value)) {
return false; return false;
} }
...@@ -320,21 +324,6 @@ export class ViewerPdfToolbarNewElement extends PolymerElement { ...@@ -320,21 +324,6 @@ export class ViewerPdfToolbarNewElement extends PolymerElement {
return true; return true;
} }
/** @private */
onZoomInputBlur_() {
if (this.zoomTimeout_) {
clearTimeout(this.zoomTimeout_);
}
if (this.sendZoomChanged_()) {
return;
}
const zoom = Math.round(this.viewportZoom * 100);
const zoomString = `${zoom}%`;
this.getZoomInput_().value = zoomString;
}
/** /**
* @param {!Event} e * @param {!Event} e
* @private * @private
......
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
is-form-field-focused="[[isFormFieldFocused_]]" is-form-field-focused="[[isFormFieldFocused_]]"
sidenav-collapsed="[[sidenavCollapsed_]]" sidenav-collapsed="[[sidenavCollapsed_]]"
two-up-view-enabled="[[twoUpViewEnabled_]]" two-up-view-enabled="[[twoUpViewEnabled_]]"
viewport-zoom="[[viewportZoom_]]" viewport-zoom="[[viewportZoom_]]" zoom-bounds="[[zoomBounds_]]"
<if expr="chromeos"> <if expr="chromeos">
annotation-available="[[annotationAvailable_]]" annotation-available="[[annotationAvailable_]]"
ink-controller="[[inkController_]]" ink-controller="[[inkController_]]"
......
...@@ -181,6 +181,7 @@ export class PDFViewerElement extends PDFViewerBaseElement { ...@@ -181,6 +181,7 @@ export class PDFViewerElement extends PDFViewerBaseElement {
pdfAnnotationsEnabled_: Boolean, pdfAnnotationsEnabled_: Boolean,
printingEnabled_: Boolean, printingEnabled_: Boolean,
viewportZoom_: Number, viewportZoom_: Number,
zoomBounds_: Object,
}; };
} }
...@@ -244,6 +245,9 @@ export class PDFViewerElement extends PDFViewerBaseElement { ...@@ -244,6 +245,9 @@ export class PDFViewerElement extends PDFViewerBaseElement {
/** @private {number} */ /** @private {number} */
this.viewportZoom_ = 1; this.viewportZoom_ = 1;
/** @private {!{ min: number, max: number }} */
this.zoomBounds_ = {min: 0, max: 0};
// Non-Polymer properties // Non-Polymer properties
/** @type {number} */ /** @type {number} */
...@@ -763,6 +767,10 @@ export class PDFViewerElement extends PDFViewerBaseElement { ...@@ -763,6 +767,10 @@ export class PDFViewerElement extends PDFViewerBaseElement {
loadTimeData.getBoolean('pdfAnnotationsEnabled'); loadTimeData.getBoolean('pdfAnnotationsEnabled');
this.pdfFormSaveEnabled_ = loadTimeData.getBoolean('pdfFormSaveEnabled'); this.pdfFormSaveEnabled_ = loadTimeData.getBoolean('pdfFormSaveEnabled');
this.printingEnabled_ = loadTimeData.getBoolean('printingEnabled'); this.printingEnabled_ = loadTimeData.getBoolean('printingEnabled');
const presetZoomFactors = this.viewport.presetZoomFactors;
this.zoomBounds_.min = Math.round(presetZoomFactors[0] * 100);
this.zoomBounds_.max =
Math.round(presetZoomFactors[presetZoomFactors.length - 1] * 100);
} }
/** @override */ /** @override */
......
...@@ -501,6 +501,11 @@ export class Viewport { ...@@ -501,6 +501,11 @@ export class Viewport {
return this.zoomManager_.applyBrowserZoom(this.internalZoom_); return this.zoomManager_.applyBrowserZoom(this.internalZoom_);
} }
/** @return {!Array<number>} The preset zoom factors. */
get presetZoomFactors() {
return this.presetZoomFactors_;
}
/** @param {!ZoomManager} manager */ /** @param {!ZoomManager} manager */
setZoomManager(manager) { setZoomManager(manager) {
this.resetTracker(); this.resetTracker();
......
...@@ -141,6 +141,7 @@ const tests = [ ...@@ -141,6 +141,7 @@ const tests = [
function testZoomField() { function testZoomField() {
const toolbar = createToolbar(); const toolbar = createToolbar();
toolbar.viewportZoom = .8; toolbar.viewportZoom = .8;
toolbar.zoomBounds = {min: 25, max: 500};
const zoomField = toolbar.shadowRoot.querySelector('#zoom-controls input'); const zoomField = toolbar.shadowRoot.querySelector('#zoom-controls input');
chrome.test.assertEq('80%', zoomField.value); chrome.test.assertEq('80%', zoomField.value);
...@@ -148,15 +149,50 @@ const tests = [ ...@@ -148,15 +149,50 @@ const tests = [
toolbar.viewportZoom = .533; toolbar.viewportZoom = .533;
chrome.test.assertEq('53%', zoomField.value); chrome.test.assertEq('53%', zoomField.value);
// Setting a new value sends the value in a zoom-changed event. // Setting a non-number value resets to viewport zoom.
let sentValue = -1; zoomField.value = 'abc';
toolbar.addEventListener('zoom-changed', e => { zoomField.dispatchEvent(new CustomEvent('change'));
sentValue = e.detail; chrome.test.assertEq('53%', zoomField.value);
chrome.test.assertEq(110, sentValue);
chrome.test.succeed(); // Setting a value that is over the max zoom clips to the max value.
}); const whenSent = eventToPromise('zoom-changed', toolbar);
zoomField.value = '110%'; zoomField.value = '90000%';
zoomField.dispatchEvent(new CustomEvent('input')); zoomField.dispatchEvent(new CustomEvent('change'));
whenSent
.then(e => {
chrome.test.assertEq(500, e.detail);
// This happens in the parent.
toolbar.viewportZoom = 5;
chrome.test.assertEq('500%', zoomField.value);
// Setting a value that is over the maximum again restores the max
// value, even though no event is sent.
zoomField.value = '80000%';
zoomField.dispatchEvent(new CustomEvent('change'));
chrome.test.assertEq('500%', zoomField.value);
// Setting a new value sends the value in a zoom-changed event.
const whenSentNew = eventToPromise('zoom-changed', toolbar);
zoomField.value = '110%';
zoomField.dispatchEvent(new CustomEvent('change'));
return whenSentNew;
})
.then(e => {
chrome.test.assertEq(110, e.detail);
// Setting a new value and blurring sends the value in a zoom-changed
// event. If the value is below the minimum, this sends the minimum
// zoom.
const whenSentFromBlur = eventToPromise('zoom-changed', toolbar);
zoomField.value = '18%';
zoomField.dispatchEvent(new CustomEvent('blur'));
return whenSentFromBlur;
})
.then(e => {
chrome.test.assertEq(25, e.detail);
chrome.test.succeed();
});
}, },
// Test that the overflow menu closes when an action is triggered. // Test that the overflow menu closes when an action is triggered.
......
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