Merge pull request #18250 from Snuffleupagus/api-misc-fixes

Improve some old code in the `src/display/api.js` file
This commit is contained in:
Tim van der Meij 2024-06-15 15:46:44 +02:00 committed by GitHub
commit 2effc96021
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -229,7 +229,7 @@ const DefaultStandardFontDataFactory =
* already populated with data, or a parameter object. * already populated with data, or a parameter object.
* @returns {PDFDocumentLoadingTask} * @returns {PDFDocumentLoadingTask}
*/ */
function getDocument(src) { function getDocument(src = {}) {
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) {
if (typeof src === "string" || src instanceof URL) { if (typeof src === "string" || src instanceof URL) {
src = { url: src }; src = { url: src };
@ -237,14 +237,6 @@ function getDocument(src) {
src = { data: src }; src = { data: src };
} }
} }
if (typeof src !== "object") {
throw new Error("Invalid parameter in getDocument, need parameter object.");
}
if (!src.url && !src.data && !src.range) {
throw new Error(
"Invalid parameter object: need either .data, .range or .url"
);
}
const task = new PDFDocumentLoadingTask(); const task = new PDFDocumentLoadingTask();
const { docId } = task; const { docId } = task;
@ -423,6 +415,9 @@ function getDocument(src) {
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
throw new Error("Not implemented: createPDFNetworkStream"); throw new Error("Not implemented: createPDFNetworkStream");
} }
if (!url) {
throw new Error("getDocument - no `url` parameter provided.");
}
const createPDFNetworkStream = params => { const createPDFNetworkStream = params => {
if ( if (
typeof PDFJSDev !== "undefined" && typeof PDFJSDev !== "undefined" &&
@ -2091,6 +2086,14 @@ class PDFWorker {
return this._readyCapability.promise; return this._readyCapability.promise;
} }
#resolve() {
this._readyCapability.resolve();
// Send global setting, e.g. verbosity level.
this._messageHandler.send("configure", {
verbosity: this.verbosity,
});
}
/** /**
* The current `workerPort`, when it exists. * The current `workerPort`, when it exists.
* @type {Worker} * @type {Worker}
@ -2117,11 +2120,7 @@ class PDFWorker {
// Ignoring "ready" event -- MessageHandler should already be initialized // Ignoring "ready" event -- MessageHandler should already be initialized
// and ready to accept messages. // and ready to accept messages.
}); });
this._readyCapability.resolve(); this.#resolve();
// Send global setting, e.g. verbosity level.
this._messageHandler.send("configure", {
verbosity: this.verbosity,
});
} }
_initialize() { _initialize() {
@ -2129,11 +2128,14 @@ 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
) { ) {
this._setupFakeWorker();
return;
}
let { workerSrc } = PDFWorker; let { workerSrc } = PDFWorker;
try { try {
@ -2152,7 +2154,7 @@ class PDFWorker {
const worker = new Worker(workerSrc, { type: "module" }); const worker = new Worker(workerSrc, { type: "module" });
const messageHandler = new MessageHandler("main", "worker", worker); const messageHandler = new MessageHandler("main", "worker", worker);
const terminateEarly = () => { const terminateEarly = () => {
worker.removeEventListener("error", onWorkerError); ac.abort();
messageHandler.destroy(); messageHandler.destroy();
worker.terminate(); worker.terminate();
if (this.destroyed) { if (this.destroyed) {
@ -2164,43 +2166,37 @@ class PDFWorker {
} }
}; };
const onWorkerError = () => { const ac = new AbortController();
worker.addEventListener(
"error",
() => {
if (!this._webWorker) { if (!this._webWorker) {
// Worker failed to initialize due to an error. Clean up and fall // Worker failed to initialize due to an error. Clean up and fall
// back to the fake worker. // back to the fake worker.
terminateEarly(); terminateEarly();
} }
}; },
worker.addEventListener("error", onWorkerError); { signal: ac.signal }
);
messageHandler.on("test", data => { messageHandler.on("test", data => {
worker.removeEventListener("error", onWorkerError); ac.abort();
if (this.destroyed) { if (this.destroyed || !data) {
terminateEarly(); terminateEarly();
return; // worker was destroyed return;
} }
if (data) {
this._messageHandler = messageHandler; this._messageHandler = messageHandler;
this._port = worker; this._port = worker;
this._webWorker = worker; this._webWorker = worker;
this._readyCapability.resolve(); this.#resolve();
// Send global setting, e.g. verbosity level.
messageHandler.send("configure", {
verbosity: this.verbosity,
});
} else {
this._setupFakeWorker();
messageHandler.destroy();
worker.terminate();
}
}); });
messageHandler.on("ready", data => { messageHandler.on("ready", data => {
worker.removeEventListener("error", onWorkerError); ac.abort();
if (this.destroyed) { if (this.destroyed) {
terminateEarly(); terminateEarly();
return; // worker was destroyed return;
} }
try { try {
sendTest(); sendTest();
@ -2224,8 +2220,7 @@ class PDFWorker {
} catch { } catch {
info("The worker has been disabled."); info("The worker has been disabled.");
} }
} // Either workers are not supported or have thrown an exception.
// Either workers are disabled, 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();
} }
@ -2253,13 +2248,8 @@ class PDFWorker {
const workerHandler = new MessageHandler(id + "_worker", id, port); const workerHandler = new MessageHandler(id + "_worker", id, port);
WorkerMessageHandler.setup(workerHandler, port); WorkerMessageHandler.setup(workerHandler, port);
const messageHandler = new MessageHandler(id, id + "_worker", port); this._messageHandler = new MessageHandler(id, id + "_worker", port);
this._messageHandler = messageHandler; this.#resolve();
this._readyCapability.resolve();
// Send global setting, e.g. verbosity level.
messageHandler.send("configure", {
verbosity: this.verbosity,
});
}) })
.catch(reason => { .catch(reason => {
this._readyCapability.reject( this._readyCapability.reject(