Skip to content

Commit 70fc30d

Browse files
Merge pull request #14295 from Snuffleupagus/rm-viewer-_pagesRequests
Remove the `{BaseViewer, PDFThumbnailViewer}._pagesRequests` caches
2 parents aabd4e5 + 58a2728 commit 70fc30d

File tree

3 files changed

+45
-50
lines changed

3 files changed

+45
-50
lines changed

test/unit/api_spec.js

+14
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,20 @@ describe("api", function () {
660660
await loadingTask.destroy();
661661
});
662662

663+
it("gets page multiple time, with working caches", async function () {
664+
const promiseA = pdfDocument.getPage(1);
665+
const promiseB = pdfDocument.getPage(1);
666+
667+
expect(promiseA instanceof Promise).toEqual(true);
668+
expect(promiseA).toBe(promiseB);
669+
670+
const pageA = await promiseA;
671+
const pageB = await promiseB;
672+
673+
expect(pageA instanceof PDFPageProxy).toEqual(true);
674+
expect(pageA).toBe(pageB);
675+
});
676+
663677
it("gets page index", async function () {
664678
const ref = { num: 17, gen: 0 }; // Reference to second page.
665679
const pageIndex = await pdfDocument.getPageIndex(ref);

web/base_viewer.js

+17-25
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ class BaseViewer {
601601
}
602602
// Set the first `pdfPage` immediately, since it's already loaded,
603603
// rather than having to repeat the `PDFDocumentProxy.getPage` call in
604-
// the `this._ensurePdfPageLoaded` method before rendering can start.
604+
// the `this.#ensurePdfPageLoaded` method before rendering can start.
605605
const firstPageView = this._pages[0];
606606
if (firstPageView) {
607607
firstPageView.setPdfPage(firstPdfPage);
@@ -708,7 +708,6 @@ class BaseViewer {
708708
this._location = null;
709709
this._pagesRotation = 0;
710710
this._optionalContentConfigPromise = null;
711-
this._pagesRequests = new WeakMap();
712711
this._firstPageCapability = createPromiseCapability();
713712
this._onePageRenderedCapability = createPromiseCapability();
714713
this._pagesCapability = createPromiseCapability();
@@ -1356,32 +1355,25 @@ class BaseViewer {
13561355

13571356
/**
13581357
* @param {PDFPageView} pageView
1359-
* @returns {Promise} Returns a promise containing a {PDFPageProxy} object.
1360-
* @private
1358+
* @returns {Promise<PDFPageProxy | null>}
13611359
*/
1362-
_ensurePdfPageLoaded(pageView) {
1360+
async #ensurePdfPageLoaded(pageView) {
13631361
if (pageView.pdfPage) {
1364-
return Promise.resolve(pageView.pdfPage);
1362+
return pageView.pdfPage;
13651363
}
1366-
if (this._pagesRequests.has(pageView)) {
1367-
return this._pagesRequests.get(pageView);
1364+
try {
1365+
const pdfPage = await this.pdfDocument.getPage(pageView.id);
1366+
if (!pageView.pdfPage) {
1367+
pageView.setPdfPage(pdfPage);
1368+
}
1369+
if (!this.linkService._cachedPageNumber(pdfPage.ref)) {
1370+
this.linkService.cachePageRef(pageView.id, pdfPage.ref);
1371+
}
1372+
return pdfPage;
1373+
} catch (reason) {
1374+
console.error("Unable to get page for page view", reason);
1375+
return null; // Page error -- there is nothing that can be done.
13681376
}
1369-
const promise = this.pdfDocument
1370-
.getPage(pageView.id)
1371-
.then(pdfPage => {
1372-
if (!pageView.pdfPage) {
1373-
pageView.setPdfPage(pdfPage);
1374-
}
1375-
this._pagesRequests.delete(pageView);
1376-
return pdfPage;
1377-
})
1378-
.catch(reason => {
1379-
console.error("Unable to get page for page view", reason);
1380-
// Page error -- there is nothing that can be done.
1381-
this._pagesRequests.delete(pageView);
1382-
});
1383-
this._pagesRequests.set(pageView, promise);
1384-
return promise;
13851377
}
13861378

13871379
#getScrollAhead(visible) {
@@ -1432,7 +1424,7 @@ class BaseViewer {
14321424
this.#toggleLoadingIconSpinner(visiblePages.ids);
14331425

14341426
if (pageView) {
1435-
this._ensurePdfPageLoaded(pageView).then(() => {
1427+
this.#ensurePdfPageLoaded(pageView).then(() => {
14361428
this.renderingQueue.renderView(pageView);
14371429
});
14381430
return true;

web/pdf_thumbnail_viewer.js

+14-25
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@ class PDFThumbnailViewer {
166166
this._pageLabels = null;
167167
this._pagesRotation = 0;
168168
this._optionalContentConfigPromise = null;
169-
this._pagesRequests = new WeakMap();
170169
this._setImageDisabled = false;
171170

172171
// Remove the thumbnails from the DOM.
@@ -211,7 +210,7 @@ class PDFThumbnailViewer {
211210
}
212211
// Set the first `pdfPage` immediately, since it's already loaded,
213212
// rather than having to repeat the `PDFDocumentProxy.getPage` call in
214-
// the `this._ensurePdfPageLoaded` method before rendering can start.
213+
// the `this.#ensurePdfPageLoaded` method before rendering can start.
215214
const firstThumbnailView = this._thumbnails[0];
216215
if (firstThumbnailView) {
217216
firstThumbnailView.setPdfPage(firstPdfPage);
@@ -262,32 +261,22 @@ class PDFThumbnailViewer {
262261

263262
/**
264263
* @param {PDFThumbnailView} thumbView
265-
* @returns {PDFPage}
266-
* @private
264+
* @returns {Promise<PDFPageProxy | null>}
267265
*/
268-
_ensurePdfPageLoaded(thumbView) {
266+
async #ensurePdfPageLoaded(thumbView) {
269267
if (thumbView.pdfPage) {
270-
return Promise.resolve(thumbView.pdfPage);
268+
return thumbView.pdfPage;
271269
}
272-
if (this._pagesRequests.has(thumbView)) {
273-
return this._pagesRequests.get(thumbView);
270+
try {
271+
const pdfPage = await this.pdfDocument.getPage(thumbView.id);
272+
if (!thumbView.pdfPage) {
273+
thumbView.setPdfPage(pdfPage);
274+
}
275+
return pdfPage;
276+
} catch (reason) {
277+
console.error("Unable to get page for thumb view", reason);
278+
return null; // Page error -- there is nothing that can be done.
274279
}
275-
const promise = this.pdfDocument
276-
.getPage(thumbView.id)
277-
.then(pdfPage => {
278-
if (!thumbView.pdfPage) {
279-
thumbView.setPdfPage(pdfPage);
280-
}
281-
this._pagesRequests.delete(thumbView);
282-
return pdfPage;
283-
})
284-
.catch(reason => {
285-
console.error("Unable to get page for thumb view", reason);
286-
// Page error -- there is nothing that can be done.
287-
this._pagesRequests.delete(thumbView);
288-
});
289-
this._pagesRequests.set(thumbView, promise);
290-
return promise;
291280
}
292281

293282
#getScrollAhead(visible) {
@@ -308,7 +297,7 @@ class PDFThumbnailViewer {
308297
scrollAhead
309298
);
310299
if (thumbView) {
311-
this._ensurePdfPageLoaded(thumbView).then(() => {
300+
this.#ensurePdfPageLoaded(thumbView).then(() => {
312301
this.renderingQueue.renderView(thumbView);
313302
});
314303
return true;

0 commit comments

Comments
 (0)