mirror of
https://github.com/zen-browser/pdf.js.git
synced 2025-07-09 09:45:42 +02:00
[api-minor] Immediately release the font.data
property once the font been attached to the DOM (PR 11777 follow-up)
*This patch implements https://github.com/mozilla/pdf.js/pull/11777#issuecomment-609741348* This extends the work from PR 11773 and 11777 further, by immediately releasing the `font.data` property once the font been attached to the DOM. By not unnecessarily holding onto this data on the main-thread, we'll thus reduce the memory usage of fonts even further (especially beneficial in longer documents with composite fonts). The new behaviour is controlled by the recently added `fontExtraProperties` API option (adding a new option just for this patch didn't seem necessary), since there's one edge-case in the SVG renderer where the `font.data` property is necessary (see the `pdf2svg` example). Note that while the default viewer does run clean-up with an idle timeout, that timeout will be reset whenever rendering occurs *or* when scrolling happens in the viewer. In practice this means that unless the user doesn't interact with the viewer in *any* way during an extended period of time, currently set to 30 seconds, the `PDFDocumentProxy.cleanup` method will never be called and font resources will thus not be cleaned-up.
This commit is contained in:
parent
c8feea6990
commit
c355f91d2e
4 changed files with 24 additions and 15 deletions
|
@ -2244,20 +2244,22 @@ class WorkerTransport {
|
|||
fontRegistry,
|
||||
});
|
||||
|
||||
this.fontLoader.bind(font).then(
|
||||
() => {
|
||||
this.fontLoader
|
||||
.bind(font)
|
||||
.catch(reason => {
|
||||
return messageHandler.sendWithPromise("FontFallback", { id });
|
||||
})
|
||||
.finally(() => {
|
||||
if (!params.fontExtraProperties && font.data) {
|
||||
// Immediately release the `font.data` property once the font
|
||||
// has been attached to the DOM, since it's no longer needed,
|
||||
// rather than waiting for a `PDFDocumentProxy.cleanup` call.
|
||||
// Since `font.data` could be very large, e.g. in some cases
|
||||
// multiple megabytes, this will help reduce memory usage.
|
||||
font.data = null;
|
||||
}
|
||||
this.commonObjs.resolve(id, font);
|
||||
},
|
||||
reason => {
|
||||
messageHandler
|
||||
.sendWithPromise("FontFallback", {
|
||||
id,
|
||||
})
|
||||
.finally(() => {
|
||||
this.commonObjs.resolve(id, font);
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
break;
|
||||
case "FontPath":
|
||||
case "FontType3Res":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue