diff --git a/web/base_viewer.js b/web/base_viewer.js index 4b2fbe734..3b07953b2 100644 --- a/web/base_viewer.js +++ b/web/base_viewer.js @@ -396,6 +396,27 @@ class BaseViewer { throw new Error("Not implemented: _setDocumentViewerElement"); } + /** + * @private + */ + _onePageRenderedOrForceFetch() { + // Unless the viewer *and* its pages are visible, rendering won't start and + // `this._onePageRenderedCapability` thus won't be resolved. + // To ensure that automatic printing, on document load, still works even in + // those cases we force-allow fetching of all pages when: + // - The viewer is hidden in the DOM, e.g. in a `display: none` <iframe> + // element; fixes bug 1618621. + // - The viewer is visible, but none of the pages are (e.g. if the + // viewer is very small); fixes bug 1618955. + if ( + !this.container.offsetParent || + this._getVisiblePages().views.length === 0 + ) { + return Promise.resolve(); + } + return this._onePageRenderedCapability.promise; + } + /** * @param pdfDocument {PDFDocument} */ @@ -492,7 +513,7 @@ class BaseViewer { // Fetch all the pages since the viewport is needed before printing // starts to create the correct size canvas. Wait until one page is // rendered so we don't tie up too many resources early on. - this._onePageRenderedCapability.promise.then(() => { + this._onePageRenderedOrForceFetch().then(() => { if (this.findController) { this.findController.setDocument(pdfDocument); // Enable searching. } diff --git a/web/ui_utils.js b/web/ui_utils.js index e456beda3..1ef9c45ef 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -229,7 +229,7 @@ function binarySearchFirstItem(items, condition) { let minIndex = 0; let maxIndex = items.length - 1; - if (items.length === 0 || !condition(items[maxIndex])) { + if (maxIndex < 0 || !condition(items[maxIndex])) { return items.length; } if (condition(items[minIndex])) {