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,103 +2128,99 @@ 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 = () => {
ac.abort();
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 ac = new AbortController();
const messageHandler = new MessageHandler("main", "worker", worker); worker.addEventListener(
const terminateEarly = () => { "error",
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 onWorkerError = () => {
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();
} catch { } catch {
// We need fallback to a faked worker. // We need fallback to a faked worker.
this._setupFakeWorker(); this._setupFakeWorker();
} }
}); });
const sendTest = () => { const sendTest = () => {
const testObj = new Uint8Array(); const testObj = new Uint8Array();
// Ensure that we can use `postMessage` transfers. // Ensure that we can use `postMessage` transfers.
messageHandler.send("test", testObj, [testObj.buffer]); messageHandler.send("test", testObj, [testObj.buffer]);
}; };
// It might take time for the worker to initialize. We will try to send // 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 "test" message immediately, and once the "ready" message arrives.
// The worker shall process only the first received "test" message. // The worker shall process only the first received "test" message.
sendTest(); sendTest();
return; return;
} catch { } catch {
info("The worker has been disabled."); 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();
} }
@ -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(