Merge pull request #12822 from Snuffleupagus/scripting-contentLength
Improve the `PDFViewerApplication._contentLength` handling in the viewer, related mostly to scripting
This commit is contained in:
commit
ac5168a23f
38
web/app.js
38
web/app.js
@ -1242,7 +1242,8 @@ const PDFViewerApplication = {
|
|||||||
load(pdfDocument) {
|
load(pdfDocument) {
|
||||||
this.pdfDocument = pdfDocument;
|
this.pdfDocument = pdfDocument;
|
||||||
|
|
||||||
pdfDocument.getDownloadInfo().then(() => {
|
pdfDocument.getDownloadInfo().then(({ length }) => {
|
||||||
|
this._contentLength = length; // Ensure that the correct length is used.
|
||||||
this.downloadComplete = true;
|
this.downloadComplete = true;
|
||||||
this.loadingBar.hide();
|
this.loadingBar.hide();
|
||||||
|
|
||||||
@ -1498,6 +1499,25 @@ const PDFViewerApplication = {
|
|||||||
return; // The document was closed while the metadata resolved.
|
return; // The document was closed while the metadata resolved.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!this._contentLength) {
|
||||||
|
// Always waiting for the entire PDF document to be loaded will, most
|
||||||
|
// likely, delay sandbox-creation too much in the general case for all
|
||||||
|
// PDF documents which are not provided as binary data to the API.
|
||||||
|
// Hence we'll simply have to trust that the `contentLength` (as provided
|
||||||
|
// by the server), when it exists, is accurate enough here.
|
||||||
|
await new Promise(resolve => {
|
||||||
|
this.eventBus._on(
|
||||||
|
"documentloaded",
|
||||||
|
evt => {
|
||||||
|
resolve();
|
||||||
|
},
|
||||||
|
{ once: true }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
if (pdfDocument !== this.pdfDocument) {
|
||||||
|
return; // The document was closed while the downloadInfo resolved.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const updateFromSandbox = ({ detail }) => {
|
const updateFromSandbox = ({ detail }) => {
|
||||||
const { id, command, value } = detail;
|
const { id, command, value } = detail;
|
||||||
@ -1622,20 +1642,6 @@ const PDFViewerApplication = {
|
|||||||
window.addEventListener(name, listener);
|
window.addEventListener(name, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._contentLength) {
|
|
||||||
// Always waiting for the entire PDF document to be loaded will, most
|
|
||||||
// likely, delay sandbox-creation too much in the general case for all
|
|
||||||
// PDF documents which are not provided as binary data to the API.
|
|
||||||
// Hence we'll simply have to trust that the `contentLength` (as provided
|
|
||||||
// by the server), when it exists, is accurate enough here.
|
|
||||||
const { length } = await pdfDocument.getDownloadInfo();
|
|
||||||
|
|
||||||
if (pdfDocument !== this.pdfDocument) {
|
|
||||||
return; // The document was closed while the download info resolved.
|
|
||||||
}
|
|
||||||
this._contentLength = length;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await scripting.createSandbox({
|
await scripting.createSandbox({
|
||||||
objects,
|
objects,
|
||||||
@ -1761,7 +1767,7 @@ const PDFViewerApplication = {
|
|||||||
this.documentInfo = info;
|
this.documentInfo = info;
|
||||||
this.metadata = metadata;
|
this.metadata = metadata;
|
||||||
this._contentDispositionFilename = contentDispositionFilename;
|
this._contentDispositionFilename = contentDispositionFilename;
|
||||||
this._contentLength = contentLength;
|
this._contentLength ??= contentLength; // See `getDownloadInfo`-call above.
|
||||||
|
|
||||||
// Provides some basic debug information
|
// Provides some basic debug information
|
||||||
console.log(
|
console.log(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user