Merge pull request #16470 from Snuffleupagus/thumbnailrendered-event

Introduce a "thumbnailrendered" event to simplify cleanup after thumbnail rendering (PR 12613 follow-up)
This commit is contained in:
Tim van der Meij 2023-05-28 14:15:24 +02:00 committed by GitHub
commit 60feb2d5b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 31 additions and 47 deletions

View File

@ -533,6 +533,7 @@ const PDFViewerApplication = {
if (appConfig.sidebar?.thumbnailView) { if (appConfig.sidebar?.thumbnailView) {
this.pdfThumbnailViewer = new PDFThumbnailViewer({ this.pdfThumbnailViewer = new PDFThumbnailViewer({
container: appConfig.sidebar.thumbnailView, container: appConfig.sidebar.thumbnailView,
eventBus,
renderingQueue: pdfRenderingQueue, renderingQueue: pdfRenderingQueue,
linkService: pdfLinkService, linkService: pdfLinkService,
l10n: this.l10n, l10n: this.l10n,

View File

@ -112,11 +112,6 @@ class IPDFLinkService {
* @param {Object} pageRef - reference to the page. * @param {Object} pageRef - reference to the page.
*/ */
cachePageRef(pageNum, pageRef) {} cachePageRef(pageNum, pageRef) {}
/**
* @param {number} pageNumber
*/
isPageCached(pageNumber) {}
} }
/** /**

View File

@ -569,13 +569,6 @@ class PDFLinkService {
return this.#pagesRefCache.get(refStr) || null; return this.#pagesRefCache.get(refStr) || null;
} }
/**
* @param {number} pageNumber
*/
isPageCached(pageNumber) {
return this.pdfViewer.isPageCached(pageNumber);
}
static #isValidExplicitDestination(dest) { static #isValidExplicitDestination(dest) {
if (!Array.isArray(dest)) { if (!Array.isArray(dest)) {
return false; return false;
@ -737,13 +730,6 @@ class SimpleLinkService {
* @param {Object} pageRef - reference to the page. * @param {Object} pageRef - reference to the page.
*/ */
cachePageRef(pageNum, pageRef) {} cachePageRef(pageNum, pageRef) {}
/**
* @param {number} pageNumber
*/
isPageCached(pageNumber) {
return true;
}
} }
export { LinkTarget, PDFLinkService, SimpleLinkService }; export { LinkTarget, PDFLinkService, SimpleLinkService };

View File

@ -13,6 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
/** @typedef {import("./event_utils").EventBus} EventBus */
/** @typedef {import("./interfaces").IL10n} IL10n */ /** @typedef {import("./interfaces").IL10n} IL10n */
/** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */ /** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */
/** @typedef {import("./interfaces").IRenderableView} IRenderableView */ /** @typedef {import("./interfaces").IRenderableView} IRenderableView */
@ -29,6 +30,7 @@ const THUMBNAIL_WIDTH = 98; // px
/** /**
* @typedef {Object} PDFThumbnailViewOptions * @typedef {Object} PDFThumbnailViewOptions
* @property {HTMLDivElement} container - The viewer element. * @property {HTMLDivElement} container - The viewer element.
* @property {EventBus} eventBus - The application event bus.
* @property {number} id - The thumbnail's unique ID (normally its number). * @property {number} id - The thumbnail's unique ID (normally its number).
* @property {PageViewport} defaultViewport - The page viewport. * @property {PageViewport} defaultViewport - The page viewport.
* @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] - * @property {Promise<OptionalContentConfig>} [optionalContentConfigPromise] -
@ -81,6 +83,7 @@ class PDFThumbnailView {
*/ */
constructor({ constructor({
container, container,
eventBus,
id, id,
defaultViewport, defaultViewport,
optionalContentConfigPromise, optionalContentConfigPromise,
@ -100,6 +103,7 @@ class PDFThumbnailView {
this._optionalContentConfigPromise = optionalContentConfigPromise || null; this._optionalContentConfigPromise = optionalContentConfigPromise || null;
this.pageColors = pageColors || null; this.pageColors = pageColors || null;
this.eventBus = eventBus;
this.linkService = linkService; this.linkService = linkService;
this.renderingQueue = renderingQueue; this.renderingQueue = renderingQueue;
@ -314,12 +318,11 @@ class PDFThumbnailView {
canvas.width = 0; canvas.width = 0;
canvas.height = 0; canvas.height = 0;
// Only trigger cleanup, once rendering has finished, when the current this.eventBus.dispatch("thumbnailrendered", {
// pageView is *not* cached on the `BaseViewer`-instance. source: this,
const pageCached = this.linkService.isPageCached(this.id); pageNumber: this.id,
if (!pageCached) { pdfPage: this.pdfPage,
this.pdfPage?.cleanup(); });
}
}); });
return resultPromise; return resultPromise;

View File

@ -14,6 +14,7 @@
*/ */
/** @typedef {import("../src/display/api").PDFDocumentProxy} PDFDocumentProxy */ /** @typedef {import("../src/display/api").PDFDocumentProxy} PDFDocumentProxy */
/** @typedef {import("./event_utils").EventBus} EventBus */
/** @typedef {import("./interfaces").IL10n} IL10n */ /** @typedef {import("./interfaces").IL10n} IL10n */
/** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */ /** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
@ -35,6 +36,7 @@ const THUMBNAIL_SELECTED_CLASS = "selected";
* @typedef {Object} PDFThumbnailViewerOptions * @typedef {Object} PDFThumbnailViewerOptions
* @property {HTMLDivElement} container - The container for the thumbnail * @property {HTMLDivElement} container - The container for the thumbnail
* elements. * elements.
* @property {EventBus} eventBus - The application event bus.
* @property {IPDFLinkService} linkService - The navigation/linking service. * @property {IPDFLinkService} linkService - The navigation/linking service.
* @property {PDFRenderingQueue} renderingQueue - The rendering queue object. * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
* @property {IL10n} l10n - Localization service. * @property {IL10n} l10n - Localization service.
@ -50,8 +52,16 @@ class PDFThumbnailViewer {
/** /**
* @param {PDFThumbnailViewerOptions} options * @param {PDFThumbnailViewerOptions} options
*/ */
constructor({ container, linkService, renderingQueue, l10n, pageColors }) { constructor({
container,
eventBus,
linkService,
renderingQueue,
l10n,
pageColors,
}) {
this.container = container; this.container = container;
this.eventBus = eventBus;
this.linkService = linkService; this.linkService = linkService;
this.renderingQueue = renderingQueue; this.renderingQueue = renderingQueue;
this.l10n = l10n; this.l10n = l10n;
@ -209,6 +219,7 @@ class PDFThumbnailViewer {
for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
const thumbnail = new PDFThumbnailView({ const thumbnail = new PDFThumbnailView({
container: this.container, container: this.container,
eventBus: this.eventBus,
id: pageNum, id: pageNum,
defaultViewport: viewport.clone(), defaultViewport: viewport.clone(),
optionalContentConfigPromise, optionalContentConfigPromise,

View File

@ -322,6 +322,15 @@ class PDFViewer {
} }
this.#updateContainerHeightCss(); this.#updateContainerHeightCss();
// Trigger API-cleanup, once thumbnail rendering has finished,
// if the relevant pageView is *not* cached in the buffer.
this.eventBus._on("thumbnailrendered", ({ pageNumber, pdfPage }) => {
const pageView = this._pages[pageNumber - 1];
if (!this.#buffer.has(pageView)) {
pdfPage?.cleanup();
}
});
} }
get pagesCount() { get pagesCount() {
@ -1645,27 +1654,6 @@ class PDFViewer {
}); });
} }
/**
* @param {number} pageNumber
*/
isPageCached(pageNumber) {
if (!this.pdfDocument) {
return false;
}
if (
!(
Number.isInteger(pageNumber) &&
pageNumber > 0 &&
pageNumber <= this.pagesCount
)
) {
console.error(`isPageCached: "${pageNumber}" is not a valid page.`);
return false;
}
const pageView = this._pages[pageNumber - 1];
return this.#buffer.has(pageView);
}
cleanup() { cleanup() {
for (const pageView of this._pages) { for (const pageView of this._pages) {
if (pageView.renderingState !== RenderingStates.FINISHED) { if (pageView.renderingState !== RenderingStates.FINISHED) {