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:
commit
2effc96021
@ -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(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user