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; const pdfViewer = this.pdfViewer;
pdfViewer.setDocument(pdfDocument); pdfViewer.setDocument(pdfDocument);
const firstPagePromise = pdfViewer.firstPagePromise; const { firstPagePromise, onePageRendered, pagesPromise } = pdfViewer;
const pagesPromise = pdfViewer.pagesPromise;
const onePageRendered = pdfViewer.onePageRendered;
const pdfThumbnailViewer = this.pdfThumbnailViewer; const pdfThumbnailViewer = this.pdfThumbnailViewer;
pdfThumbnailViewer.setDocument(pdfDocument); pdfThumbnailViewer.setDocument(pdfDocument);

View File

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