Use an early return in PDFWorker.prototype._initialize when workers are disabled

This helps reduce overall indentation in the method, thus leading to slightly less code.
Also, remove an old comment referring to Chrome 15 since that's no longer relevant now.
This commit is contained in:
Jonas Jenwald 2024-06-15 13:17:55 +02:00
parent d6612b3427
commit 0a36b667e4

View File

@ -2124,103 +2124,105 @@ class PDFWorker {
// support, create a new web worker and test if it/the browser fulfills // support, create a new web worker and test if it/the browser fulfills
// all requirements to run parts of pdf.js in a web worker. // all requirements to run parts of pdf.js in a web worker.
// Right now, the requirement is, that an Uint8Array is still an // Right now, the requirement is, that an Uint8Array is still an
// Uint8Array as it arrives on the worker. (Chrome added this with v.15.) // Uint8Array as it arrives on the worker.
if ( if (
!PDFWorkerUtil.isWorkerDisabled && PDFWorkerUtil.isWorkerDisabled ||
!PDFWorker.#mainThreadWorkerMessageHandler PDFWorker.#mainThreadWorkerMessageHandler
) { ) {
let { workerSrc } = PDFWorker; this._setupFakeWorker();
return;
}
let { workerSrc } = PDFWorker;
try { try {
// Wraps workerSrc path into blob URL, if the former does not belong // Wraps workerSrc path into blob URL, if the former does not belong
// to the same origin. // to the same origin.
if ( if (
typeof PDFJSDev !== "undefined" && typeof PDFJSDev !== "undefined" &&
PDFJSDev.test("GENERIC") && PDFJSDev.test("GENERIC") &&
!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc) !PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)
) { ) {
workerSrc = PDFWorkerUtil.createCDNWrapper( workerSrc = PDFWorkerUtil.createCDNWrapper(
new URL(workerSrc, window.location).href new URL(workerSrc, window.location).href
); );
}
const worker = new Worker(workerSrc, { type: "module" });
const messageHandler = new MessageHandler("main", "worker", worker);
const terminateEarly = () => {
worker.removeEventListener("error", onWorkerError);
messageHandler.destroy();
worker.terminate();
if (this.destroyed) {
this._readyCapability.reject(new Error("Worker was destroyed"));
} else {
// Fall back to fake worker if the termination is caused by an
// error (e.g. NetworkError / SecurityError).
this._setupFakeWorker();
} }
};
const worker = new Worker(workerSrc, { type: "module" }); const onWorkerError = () => {
const messageHandler = new MessageHandler("main", "worker", worker); if (!this._webWorker) {
const terminateEarly = () => { // Worker failed to initialize due to an error. Clean up and fall
worker.removeEventListener("error", onWorkerError); // back to the fake worker.
terminateEarly();
}
};
worker.addEventListener("error", onWorkerError);
messageHandler.on("test", data => {
worker.removeEventListener("error", onWorkerError);
if (this.destroyed) {
terminateEarly();
return; // worker was destroyed
}
if (data) {
this._messageHandler = messageHandler;
this._port = worker;
this._webWorker = worker;
this._readyCapability.resolve();
// Send global setting, e.g. verbosity level.
messageHandler.send("configure", {
verbosity: this.verbosity,
});
} else {
this._setupFakeWorker();
messageHandler.destroy(); messageHandler.destroy();
worker.terminate(); worker.terminate();
if (this.destroyed) { }
this._readyCapability.reject(new Error("Worker was destroyed")); });
} else {
// Fall back to fake worker if the termination is caused by an
// error (e.g. NetworkError / SecurityError).
this._setupFakeWorker();
}
};
const onWorkerError = () => { messageHandler.on("ready", data => {
if (!this._webWorker) { worker.removeEventListener("error", onWorkerError);
// Worker failed to initialize due to an error. Clean up and fall if (this.destroyed) {
// back to the fake worker. terminateEarly();
terminateEarly(); return; // worker was destroyed
} }
}; try {
worker.addEventListener("error", onWorkerError); sendTest();
} catch {
// We need fallback to a faked worker.
this._setupFakeWorker();
}
});
messageHandler.on("test", data => { const sendTest = () => {
worker.removeEventListener("error", onWorkerError); const testObj = new Uint8Array();
if (this.destroyed) { // Ensure that we can use `postMessage` transfers.
terminateEarly(); messageHandler.send("test", testObj, [testObj.buffer]);
return; // worker was destroyed };
}
if (data) {
this._messageHandler = messageHandler;
this._port = worker;
this._webWorker = worker;
this._readyCapability.resolve(); // It might take time for the worker to initialize. We will try to send
// Send global setting, e.g. verbosity level. // the "test" message immediately, and once the "ready" message arrives.
messageHandler.send("configure", { // The worker shall process only the first received "test" message.
verbosity: this.verbosity, sendTest();
}); return;
} else { } catch {
this._setupFakeWorker(); info("The worker has been disabled.");
messageHandler.destroy();
worker.terminate();
}
});
messageHandler.on("ready", data => {
worker.removeEventListener("error", onWorkerError);
if (this.destroyed) {
terminateEarly();
return; // worker was destroyed
}
try {
sendTest();
} catch {
// We need fallback to a faked worker.
this._setupFakeWorker();
}
});
const sendTest = () => {
const testObj = new Uint8Array();
// Ensure that we can use `postMessage` transfers.
messageHandler.send("test", testObj, [testObj.buffer]);
};
// It might take time for the worker to initialize. We will try to send
// the "test" message immediately, and once the "ready" message arrives.
// The worker shall process only the first received "test" message.
sendTest();
return;
} catch {
info("The worker has been disabled.");
}
} }
// Either workers are disabled, not supported or have thrown an exception. // Either workers are not supported or have thrown an exception.
// Thus, we fallback to a faked worker. // Thus, we fallback to a faked worker.
this._setupFakeWorker(); this._setupFakeWorker();
} }