Merge pull request #11676 from Snuffleupagus/BaseViewer-reset-PromiseCapability

Slightly improve the `BaseViewer.{firstPagePromise, onePageRendered, pagesPromise}` functionality
This commit is contained in:
Tim van der Meij 2020-03-09 22:56:46 +01:00 committed by GitHub
commit 6dfa10fe97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 28 deletions

View File

@ -1057,9 +1057,7 @@ const PDFViewerApplication = {
const pdfViewer = this.pdfViewer;
pdfViewer.setDocument(pdfDocument);
const firstPagePromise = pdfViewer.firstPagePromise;
const pagesPromise = pdfViewer.pagesPromise;
const onePageRendered = pdfViewer.onePageRendered;
const { firstPagePromise, onePageRendered, pagesPromise } = pdfViewer;
const pdfThumbnailViewer = this.pdfThumbnailViewer;
pdfThumbnailViewer.setDocument(pdfDocument);

View File

@ -198,13 +198,13 @@ class BaseViewer {
* @type {boolean} - True if all {PDFPageView} objects are initialized.
*/
get pageViewsReady() {
if (!this._pageViewsReady) {
if (!this._pagesCapability.settled) {
return false;
}
// Prevent printing errors when 'disableAutoFetch' is set, by ensuring
// that *all* pages have in fact been completely loaded.
return this._pages.every(function(pageView) {
return !!(pageView && pageView.pdfPage);
return pageView && pageView.pdfPage;
});
}
@ -376,6 +376,21 @@ class BaseViewer {
}
}
get firstPagePromise() {
return this.pdfDocument ? this._firstPageCapability.promise : null;
}
get onePageRendered() {
return this.pdfDocument ? this._onePageRenderedCapability.promise : null;
}
get pagesPromise() {
return this.pdfDocument ? this._pagesCapability.promise : null;
}
/**
* @private
*/
get _setDocumentViewerElement() {
// In most viewers, e.g. `PDFViewer`, this should return `this.viewer`.
throw new Error("Not implemented: _setDocumentViewerElement");
@ -399,24 +414,15 @@ class BaseViewer {
return;
}
const pagesCount = pdfDocument.numPages;
const firstPagePromise = pdfDocument.getPage(1);
const pagesCapability = createPromiseCapability();
this.pagesPromise = pagesCapability.promise;
pagesCapability.promise.then(() => {
this._pageViewsReady = true;
this._pagesCapability.promise.then(() => {
this.eventBus.dispatch("pagesloaded", {
source: this,
pagesCount,
});
});
const onePageRenderedCapability = createPromiseCapability();
this.onePageRendered = onePageRenderedCapability.promise;
const firstPagePromise = pdfDocument.getPage(1);
this.firstPagePromise = firstPagePromise;
this._onBeforeDraw = evt => {
const pageView = this._pages[evt.pageNumber - 1];
if (!pageView) {
@ -429,10 +435,10 @@ class BaseViewer {
this.eventBus._on("pagerender", this._onBeforeDraw);
this._onAfterDraw = evt => {
if (evt.cssTransform || onePageRenderedCapability.settled) {
if (evt.cssTransform || this._onePageRenderedCapability.settled) {
return;
}
onePageRenderedCapability.resolve();
this._onePageRenderedCapability.resolve();
this.eventBus._off("pagerendered", this._onAfterDraw);
this._onAfterDraw = null;
@ -443,13 +449,14 @@ class BaseViewer {
// viewport for all pages
firstPagePromise
.then(firstPdfPage => {
this._firstPageCapability.resolve(firstPdfPage);
const scale = this.currentScale;
const viewport = firstPdfPage.getViewport({ scale: scale * CSS_UNITS });
const textLayerFactory =
this.textLayerMode !== TextLayerMode.DISABLE ? this : null;
for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
let textLayerFactory = null;
if (this.textLayerMode !== TextLayerMode.DISABLE) {
textLayerFactory = this;
}
const pageView = new PDFPageView({
container: this._setDocumentViewerElement,
eventBus: this.eventBus,
@ -485,7 +492,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.
onePageRenderedCapability.promise.then(() => {
this._onePageRenderedCapability.promise.then(() => {
if (this.findController) {
this.findController.setDocument(pdfDocument); // Enable searching.
}
@ -497,13 +504,13 @@ class BaseViewer {
pagesCount > 7500
) {
// XXX: Printing is semi-broken with auto fetch disabled.
pagesCapability.resolve();
this._pagesCapability.resolve();
return;
}
let getPagesLeft = pagesCount - 1; // The first page was already loaded.
if (getPagesLeft <= 0) {
pagesCapability.resolve();
this._pagesCapability.resolve();
return;
}
for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) {
@ -515,7 +522,7 @@ class BaseViewer {
}
this.linkService.cachePageRef(pageNum, pdfPage.ref);
if (--getPagesLeft === 0) {
pagesCapability.resolve();
this._pagesCapability.resolve();
}
},
reason => {
@ -524,7 +531,7 @@ class BaseViewer {
reason
);
if (--getPagesLeft === 0) {
pagesCapability.resolve();
this._pagesCapability.resolve();
}
}
);
@ -577,7 +584,9 @@ class BaseViewer {
this._location = null;
this._pagesRotation = 0;
this._pagesRequests = new WeakMap();
this._pageViewsReady = false;
this._firstPageCapability = createPromiseCapability();
this._onePageRenderedCapability = createPromiseCapability();
this._pagesCapability = createPromiseCapability();
this._scrollMode = ScrollMode.VERTICAL;
this._spreadMode = SpreadMode.NONE;