pdf.js/web
Jonas Jenwald 4a9994b54c Trigger cleanup, once rendering has finished, in PDFThumbnailView.draw
This patch will help reduce memory usage, especially for longer documents, when the user scrolls around in the thumbnailView (in the sidebar).

Note how the `PDFPageProxy.cleanup` method will, assuming it's safe to do so, release main-thread resources associated with the page. These include things such as e.g. image data (which can be arbitrarily large), and also the operatorList (which can also be quite large).
Hence when pages are evicted from the `PDFPageViewBuffer`, on the `BaseViewer`-instance, the `PDFPageView.destroy` method is invoked which will (among other things) call `PDFPageProxy.cleanup` in the API.

However, looking at the `PDFThumbnailViewer`/`PDFThumbnailView` classes you'll notice that there's no attempt to ever call `PDFPageProxy.cleanup`, which implies that in certain circumstances we'll essentially keep all resources allocated permanently on the `PDFPageProxy`-instances in the API.
In particular, this happens when the users opens the sidebar and starts scrolling around in the thumbnails. Generally speaking you obviously need to keep all thumbnail *images* around, since otherwise the thumbnailView is useless, but there's still room for improvement here.

Please note that the case where a *rendered page* is used to create the thumbnail is (obviously) completely unaffected by the issues described above, and this rather only applies to thumbnails being explicitly rendered by the `PDFThumbnailView.draw` method.
For the latter case, we can fix these issues simply by calling `PDFPageProxy.cleanup` once rendering has finished. To prevent *accidentally* pulling the rug out from under `PDFPageViewBuffer` in the viewer, which expects data to be available, this required adding a couple of new methods[1] to enable checking that it's indeed safe to call `PDFPageProxy.cleanup` from the `PDFThumbnailView.draw` method.

It's really quite fascinating that no one has noticed this issue before, since it's been around since basically "forever".

---
[1] While it should be *very* rare for `PDFThumbnailView.draw` to be called for a pageView that's also in the `PDFPageViewBuffer`, given that pages are rendered before thumbnails and that the *rendered page* is used to create the thumbnail, it can still happen since rendering is asynchronous.
Furthermore, it's also possible for `PDFThumbnailView.setImage` to be disabled, in which case checking the `PDFPageViewBuffer` for active pageViews *really* matters.
2020-11-12 17:09:47 +01:00
..
images [api-minor] Add support for toggling of Optional Content in the viewer (issue 12096) 2020-08-30 16:28:40 +02:00
.eslintrc Enable the ESLint prefer-const rule globally (PR 11450 follow-up) 2020-01-25 00:20:22 +01:00
.gitignore Remove obselete file from .gitignore 2015-01-26 16:44:45 +01:00
annotation_layer_builder.css Re-format all web/*.css files using Stylelint/Prettier 2020-08-30 21:49:08 +02:00
annotation_layer_builder.js JS -- Add listener for sandbox events only if there are some actions 2020-11-09 18:37:59 +01:00
app_options.js JS - Add the basic architecture to be able to execute embedded js 2020-10-21 19:00:56 +02:00
app.js JS -- Implement doc object 2020-11-10 16:16:42 +01:00
base_tree_viewer.js Extract common methods from PDFOutlineViewer/PDFAttachmentViewer into a new abstract BaseTreeViewer class 2020-08-05 23:08:06 +02:00
base_viewer.js Trigger cleanup, once rendering has finished, in PDFThumbnailView.draw 2020-11-12 17:09:47 +01:00
chrome-i18n-allow-access-to-file-urls.json Add translations of "Allow access to file URLs" 2015-08-14 18:59:55 +02:00
chromecom.js Fix some static static analyzer warnings (issue 11965) 2020-11-01 12:08:38 +01:00
compressed.tracemonkey-pldi-09.pdf Add Makefile. Move some files around to make building the website easier. 2011-07-05 10:53:57 -07:00
debugger.js Enable the ESLint no-useless-escape rule (PR 12551 follow-up) 2020-11-07 13:06:24 +01:00
download_manager.js Remove code-paths only relevant for IE 11/Edge (non-Chromium based) from the web/ folder 2020-09-05 17:18:15 +02:00
firefox_print_service.js [Firefox] Stop logging RenderingCancelledExceptions as errors when printing 2020-10-04 20:25:31 +02:00
firefoxcom.js Fix some static static analyzer warnings (issue 11965) 2020-11-01 12:08:38 +01:00
genericcom.js Fix some static static analyzer warnings (issue 11965) 2020-11-01 12:08:38 +01:00
genericl10n.js Enable import/extensions of ESlint plugin to enforce all import have a .js file extension. 2020-01-18 10:53:01 +09:00
grab_to_pan.js Remove some code/comments relevant for old (pre-Chromium) versions of Opera 2020-09-08 12:54:51 +02:00
interfaces.js Trigger cleanup, once rendering has finished, in PDFThumbnailView.draw 2020-11-12 17:09:47 +01:00
overlay_manager.js Fix the linting errors, from the Prettier auto-formatting, that ESLint --fix couldn't handle 2019-12-26 12:35:12 +01:00
password_prompt.js Ensure that all import and require statements, in the entire code-base, have a .js file extension 2020-01-04 13:01:43 +01:00
pdf_attachment_viewer.js Revert "Download, rather than opening, PDF attachments in Firefox (bug 1661259, PR 12286 follow-up)" 2020-09-04 12:07:34 +02:00
pdf_cursor_tools.js Re-factor the EventBus to allow servicing of "external" event listeners *after* the viewer components have updated 2020-02-27 19:38:13 +01:00
pdf_document_properties.js Remove unnecessary empty string fallback from the getPDFFileNameFromURL call in web/pdf_document_properties.js (PR 10114 follow-up) 2020-05-20 12:09:04 +02:00
pdf_find_bar.js [api-minor] Remove the getGlobalEventBus viewer functionality (PR 11631 follow-up) 2020-03-29 12:20:23 +02:00
pdf_find_controller.js Return the query with the findcontrols 2020-08-20 11:18:43 +01:00
pdf_find_utils.js Enable auto-formatting of the entire code-base using Prettier (issue 11444) 2019-12-26 12:34:24 +01:00
pdf_history.js Use optional chaining in web/pdf_history.js 2020-11-02 11:36:17 +01:00
pdf_layer_viewer.js [api-minor] Add support for toggling of Optional Content in the viewer (issue 12096) 2020-08-30 16:28:40 +02:00
pdf_link_service.js Trigger cleanup, once rendering has finished, in PDFThumbnailView.draw 2020-11-12 17:09:47 +01:00
pdf_outline_viewer.js Re-name and re-factor the PDFLinkService.navigateTo method 2020-10-18 14:29:59 +02:00
pdf_page_view.js JS -- Add listener for sandbox events only if there are some actions 2020-11-09 18:37:59 +01:00
pdf_presentation_mode.js Remove code-paths only relevant for IE 11/Edge (non-Chromium based) from the web/ folder 2020-09-05 17:18:15 +02:00
pdf_print_service.js Remove code-paths only relevant for IE 11/Edge (non-Chromium based) from the web/ folder 2020-09-05 17:18:15 +02:00
pdf_rendering_queue.js Ignore RenderingCancelledException when logging errors in PDFRenderingQueue.renderView 2020-09-25 14:21:05 +02:00
pdf_sidebar_resizer.js Remove CSS variables feature-testing from PDFSidebarResizer 2020-09-09 22:26:08 +02:00
pdf_sidebar.js [api-minor] Add support for toggling of Optional Content in the viewer (issue 12096) 2020-08-30 16:28:40 +02:00
pdf_single_page_viewer.js Rename BaseViewer._setDocumentViewerElement to BaseViewer._viewerElement 2020-03-24 16:54:37 +01:00
pdf_thumbnail_view.js Trigger cleanup, once rendering has finished, in PDFThumbnailView.draw 2020-11-12 17:09:47 +01:00
pdf_thumbnail_viewer.js Change the getVisibleElements helper function to take a parameter object 2020-11-04 12:15:04 +01:00
pdf_viewer.component.js [api-minor] Deprecate getGlobalEventBus and update the "viewer components" examples accordingly 2020-02-27 14:44:48 +01:00
pdf_viewer.css Remove code-paths only relevant for IE 11/Edge (non-Chromium based) from the web/ folder 2020-09-05 17:18:15 +02:00
pdf_viewer.js Rename BaseViewer._setDocumentViewerElement to BaseViewer._viewerElement 2020-03-24 16:54:37 +01:00
pdfjs.js Enable auto-formatting of the entire code-base using Prettier (issue 11444) 2019-12-26 12:34:24 +01:00
preferences.js Remove the SystemJS dependency from the web/preferences.js file 2020-05-16 16:22:15 +02:00
secondary_toolbar.js Update Prettier to version 2.0 2020-04-14 12:28:14 +02:00
text_layer_builder.css Re-format all web/*.css files using Stylelint/Prettier 2020-08-30 21:49:08 +02:00
text_layer_builder.js Update Prettier to version 2.0 2020-04-14 12:28:14 +02:00
toolbar.js Update the zoom dropdown width calculation to work better in locales with long zoom-strings (PR 11077 follow-up) 2020-08-20 09:57:42 +02:00
ui_utils.js JS -- Add listener for sandbox events only if there are some actions 2020-11-09 18:37:59 +01:00
view_history.js Add a bit more validation in the ViewHistory constructor 2020-03-21 13:55:06 +01:00
viewer_compatibility.js Remove code-paths only relevant for IE 11/Edge (non-Chromium based) from the web/ folder 2020-09-05 17:18:15 +02:00
viewer-snippet-chrome-extension.html Wraps mozL10n to async calls; splits firefox and generic l10n libs. 2017-05-31 09:22:25 -05:00
viewer-snippet-chrome-overlays.html [CRX] Add file chooser as fallback (fixes #9411) 2018-03-21 18:21:46 +01:00
viewer-snippet-firefox-extension.html Stop bundling the ReadableStream polyfill in MOZCENTRAL builds (PR 10470 follow-up) 2019-01-23 20:33:20 +01:00
viewer-snippet-minified.html Remove XHTML leftovers from the viewer HTML files 2016-02-14 13:23:34 +01:00
viewer-snippet.html Wraps mozL10n to async calls; splits firefox and generic l10n libs. 2017-05-31 09:22:25 -05:00
viewer.css Let the loadingBar have the same width as the viewerContainer 2020-09-10 17:16:24 +02:00
viewer.html Let the loadingBar have the same width as the viewerContainer 2020-09-10 17:16:24 +02:00
viewer.js Use standard import statements when loading PDFViewerApplication/AppOptions in web/viewer 2020-10-11 14:06:47 +02:00