Stop using the source-object when sending "GetDocRequest"

Looking at the code on the worker-thread, there doesn't appear to be any particular reason for placing *some* of the properties in a `source`-object when sending them with "GetDocRequest".
As is often the case the explanation for this structure is rather "for historical reasons", since originally we simply sent the `source`-object as-is. Doing that was obviously a bad idea, for a couple of reasons:
 - It makes it less clear what is/isn't actually needed on the worker-thread.
 - Sending unused properties will unnecessarily increase memory usage.
 - The `source`-object may contain unclonable data, which would break the library.
This commit is contained in:
Jonas Jenwald 2022-10-09 11:30:24 +02:00
parent c84b717773
commit 8a4f6aca97
2 changed files with 29 additions and 26 deletions

View File

@ -97,7 +97,7 @@ class WorkerMessageHandler {
const WorkerTasks = [];
const verbosity = getVerbosityLevel();
const apiVersion = docParams.apiVersion;
const { docId, apiVersion } = docParams;
const workerVersion =
typeof PDFJSDev !== "undefined" && !PDFJSDev.test("TESTING")
? PDFJSDev.eval("BUNDLE_VERSION")
@ -142,10 +142,7 @@ class WorkerMessageHandler {
throw new Error(partialMsg + "please update to a supported browser.");
}
}
const docId = docParams.docId;
const docBaseUrl = docParams.docBaseUrl;
const workerHandlerName = docParams.docId + "_worker";
const workerHandlerName = docId + "_worker";
let handler = new MessageHandler(workerHandlerName, docId, port);
function ensureNotTerminated() {
@ -204,17 +201,25 @@ class WorkerMessageHandler {
return { numPages, fingerprints, htmlForXfa };
}
function getPdfManager(data, evaluatorOptions, enableXfa) {
function getPdfManager({
data,
password,
disableAutoFetch,
rangeChunkSize,
length,
docBaseUrl,
enableXfa,
evaluatorOptions,
}) {
const pdfManagerCapability = createPromiseCapability();
let newPdfManager;
const source = data.source;
if (source.data) {
if (data) {
try {
newPdfManager = new LocalPdfManager(
docId,
source.data,
source.password,
data,
password,
handler,
evaluatorOptions,
enableXfa,
@ -242,19 +247,19 @@ class WorkerMessageHandler {
if (!fullRequest.isRangeSupported) {
return;
}
// We don't need auto-fetch when streaming is enabled.
const disableAutoFetch =
source.disableAutoFetch || fullRequest.isStreamingSupported;
disableAutoFetch =
disableAutoFetch || fullRequest.isStreamingSupported;
newPdfManager = new NetworkPdfManager(
docId,
pdfStream,
{
msgHandler: handler,
password: source.password,
password,
length: fullRequest.contentLength,
disableAutoFetch,
rangeChunkSize: source.rangeChunkSize,
rangeChunkSize,
},
evaluatorOptions,
enableXfa,
@ -279,7 +284,7 @@ class WorkerMessageHandler {
let loaded = 0;
const flushChunks = function () {
const pdfFile = arraysToBytes(cachedChunks);
if (source.length && pdfFile.length !== source.length) {
if (length && pdfFile.length !== length) {
warn("reported HTTP length is different from actual");
}
// the data is array, instantiating directly from it
@ -287,7 +292,7 @@ class WorkerMessageHandler {
newPdfManager = new LocalPdfManager(
docId,
pdfFile,
source.password,
password,
handler,
evaluatorOptions,
enableXfa,
@ -405,7 +410,7 @@ class WorkerMessageHandler {
ensureNotTerminated();
getPdfManager(data, data.evaluatorOptions, data.enableXfa)
getPdfManager(data)
.then(function (newPdfManager) {
if (terminated) {
// We were in a process of setting up the manager, but it got

View File

@ -503,20 +503,18 @@ async function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
}
const workerId = await worker.messageHandler.sendWithPromise(
"GetDocRequest",
// Only send the required properties, and *not* the entire `source` object.
{
docId,
apiVersion:
typeof PDFJSDev !== "undefined" && !PDFJSDev.test("TESTING")
? PDFJSDev.eval("BUNDLE_VERSION")
: null,
// Only send the required properties, and *not* the entire object.
source: {
data: source.data,
password: source.password,
disableAutoFetch: source.disableAutoFetch,
rangeChunkSize: source.rangeChunkSize,
length: source.length,
},
data: source.data,
password: source.password,
disableAutoFetch: source.disableAutoFetch,
rangeChunkSize: source.rangeChunkSize,
length: source.length,
docBaseUrl: source.docBaseUrl,
enableXfa: source.enableXfa,
evaluatorOptions: {