Merge pull request #19632 from Snuffleupagus/issue-15085
[api-minor] Attempt to support fetching the raw data of the PDF document from the `PDFDocumentLoadingTask`-instance (issue 15085)
This commit is contained in:
commit
d86045eacb
@ -629,39 +629,48 @@ const isValidExplicitDest = _isValidExplicitDest.bind(
|
|||||||
class PDFDocumentLoadingTask {
|
class PDFDocumentLoadingTask {
|
||||||
static #docId = 0;
|
static #docId = 0;
|
||||||
|
|
||||||
constructor() {
|
/**
|
||||||
this._capability = Promise.withResolvers();
|
* @private
|
||||||
this._transport = null;
|
*/
|
||||||
this._worker = null;
|
_capability = Promise.withResolvers();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unique identifier for the document loading task.
|
* @private
|
||||||
* @type {string}
|
*/
|
||||||
*/
|
_transport = null;
|
||||||
this.docId = `d${PDFDocumentLoadingTask.#docId++}`;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the loading task is destroyed or not.
|
* @private
|
||||||
* @type {boolean}
|
*/
|
||||||
*/
|
_worker = null;
|
||||||
this.destroyed = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback to request a password if a wrong or no password was provided.
|
* Unique identifier for the document loading task.
|
||||||
* The callback receives two parameters: a function that should be called
|
* @type {string}
|
||||||
* with the new password, and a reason (see {@link PasswordResponses}).
|
*/
|
||||||
* @type {function}
|
docId = `d${PDFDocumentLoadingTask.#docId++}`;
|
||||||
*/
|
|
||||||
this.onPassword = null;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback to be able to monitor the loading progress of the PDF file
|
* Whether the loading task is destroyed or not.
|
||||||
* (necessary to implement e.g. a loading bar).
|
* @type {boolean}
|
||||||
* The callback receives an {@link OnProgressParameters} argument.
|
*/
|
||||||
* @type {function}
|
destroyed = false;
|
||||||
*/
|
|
||||||
this.onProgress = null;
|
/**
|
||||||
}
|
* Callback to request a password if a wrong or no password was provided.
|
||||||
|
* The callback receives two parameters: a function that should be called
|
||||||
|
* with the new password, and a reason (see {@link PasswordResponses}).
|
||||||
|
* @type {function}
|
||||||
|
*/
|
||||||
|
onPassword = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to be able to monitor the loading progress of the PDF file
|
||||||
|
* (necessary to implement e.g. a loading bar).
|
||||||
|
* The callback receives an {@link OnProgressParameters} argument.
|
||||||
|
* @type {function}
|
||||||
|
*/
|
||||||
|
onProgress = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Promise for document loading task completion.
|
* Promise for document loading task completion.
|
||||||
@ -699,6 +708,16 @@ class PDFDocumentLoadingTask {
|
|||||||
this._worker?.destroy();
|
this._worker?.destroy();
|
||||||
this._worker = null;
|
this._worker = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to fetch the raw data of the PDF document, when e.g.
|
||||||
|
* - An exception was thrown during document initialization.
|
||||||
|
* - An `onPassword` callback is delaying initialization.
|
||||||
|
* @returns {Promise<Uint8Array>}
|
||||||
|
*/
|
||||||
|
async getData() {
|
||||||
|
return this._transport.getData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -828,6 +828,47 @@ describe("api", function () {
|
|||||||
|
|
||||||
await loadingTask.destroy();
|
await loadingTask.destroy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("gets data, on failure, from `PDFDocumentLoadingTask`-instance", async function () {
|
||||||
|
const typedArrayPdf = await DefaultFileReaderFactory.fetch({
|
||||||
|
path: TEST_PDFS_PATH + "issue6010_1.pdf",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sanity check to make sure that we fetched the entire PDF file.
|
||||||
|
expect(typedArrayPdf instanceof Uint8Array).toEqual(true);
|
||||||
|
expect(typedArrayPdf.length).toEqual(1116);
|
||||||
|
|
||||||
|
const loadingTask = getDocument(typedArrayPdf.slice());
|
||||||
|
expect(loadingTask instanceof PDFDocumentLoadingTask).toEqual(true);
|
||||||
|
|
||||||
|
let passwordData = null;
|
||||||
|
// Attach the callback that is used to request a password;
|
||||||
|
// similarly to how the default viewer handles passwords.
|
||||||
|
loadingTask.onPassword = async (updatePassword, reason) => {
|
||||||
|
passwordData = await loadingTask.getData();
|
||||||
|
|
||||||
|
updatePassword(new Error("Should reject the loadingTask."));
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
await loadingTask.promise;
|
||||||
|
|
||||||
|
// Shouldn't get here.
|
||||||
|
expect(false).toEqual(true);
|
||||||
|
} catch (ex) {
|
||||||
|
expect(ex instanceof PasswordException).toEqual(true);
|
||||||
|
expect(ex.code).toEqual(PasswordResponses.NEED_PASSWORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that the raw PDF document can be fetched while
|
||||||
|
// an `onPassword` callback is delaying initialization...
|
||||||
|
expect(passwordData).toEqual(typedArrayPdf);
|
||||||
|
// ... and once an exception has stopped initialization.
|
||||||
|
const data = await loadingTask.getData();
|
||||||
|
expect(data).toEqual(typedArrayPdf);
|
||||||
|
|
||||||
|
await loadingTask.destroy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("PDFWorker", function () {
|
describe("PDFWorker", function () {
|
||||||
|
|||||||
@ -1153,7 +1153,9 @@ const PDFViewerApplication = {
|
|||||||
async download() {
|
async download() {
|
||||||
let data;
|
let data;
|
||||||
try {
|
try {
|
||||||
data = await this.pdfDocument.getData();
|
data = await (this.pdfDocument
|
||||||
|
? this.pdfDocument.getData()
|
||||||
|
: this.pdfLoadingTask.getData());
|
||||||
} catch {
|
} catch {
|
||||||
// When the PDF document isn't ready, simply download using the URL.
|
// When the PDF document isn't ready, simply download using the URL.
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user