Compare commits

..

No commits in common. "60574fb7e30748140bcec4137043a3e8ebf22887" and "f72f240699a84b348895a0f1d44c6a0b706e3915" have entirely different histories.

5 changed files with 114 additions and 95 deletions

View File

@ -462,14 +462,32 @@ function getDocument(src = {}) {
if (!url) {
throw new Error("getDocument - no `url` parameter provided.");
}
// eslint-disable-next-line no-nested-ternary
const NetworkStream = isValidFetchUrl(url)
? PDFFetchStream
: typeof PDFJSDev !== "undefined" &&
PDFJSDev.test("GENERIC") &&
isNodeJS
? PDFNodeStream
let NetworkStream;
if (
typeof PDFJSDev !== "undefined" &&
PDFJSDev.test("GENERIC") &&
isNodeJS
) {
if (isValidFetchUrl(url)) {
if (
typeof fetch === "undefined" ||
typeof Response === "undefined" ||
!("body" in Response.prototype)
) {
throw new Error(
"getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`."
);
}
NetworkStream = PDFFetchStream;
} else {
NetworkStream = PDFNodeStream;
}
} else {
NetworkStream = isValidFetchUrl(url)
? PDFFetchStream
: PDFNetworkStream;
}
networkStream = new NetworkStream({
url,
@ -704,16 +722,6 @@ class PDFDocumentLoadingTask {
* main-thread memory usage, however it will take ownership of the TypedArrays.
*/
class PDFDataRangeTransport {
#capability = Promise.withResolvers();
#progressiveDoneListeners = [];
#progressiveReadListeners = [];
#progressListeners = [];
#rangeListeners = [];
/**
* @param {number} length
* @param {Uint8Array|null} initialData
@ -730,34 +738,40 @@ class PDFDataRangeTransport {
this.initialData = initialData;
this.progressiveDone = progressiveDone;
this.contentDispositionFilename = contentDispositionFilename;
this._rangeListeners = [];
this._progressListeners = [];
this._progressiveReadListeners = [];
this._progressiveDoneListeners = [];
this._readyCapability = Promise.withResolvers();
}
/**
* @param {function} listener
*/
addRangeListener(listener) {
this.#rangeListeners.push(listener);
this._rangeListeners.push(listener);
}
/**
* @param {function} listener
*/
addProgressListener(listener) {
this.#progressListeners.push(listener);
this._progressListeners.push(listener);
}
/**
* @param {function} listener
*/
addProgressiveReadListener(listener) {
this.#progressiveReadListeners.push(listener);
this._progressiveReadListeners.push(listener);
}
/**
* @param {function} listener
*/
addProgressiveDoneListener(listener) {
this.#progressiveDoneListeners.push(listener);
this._progressiveDoneListeners.push(listener);
}
/**
@ -765,7 +779,7 @@ class PDFDataRangeTransport {
* @param {Uint8Array|null} chunk
*/
onDataRange(begin, chunk) {
for (const listener of this.#rangeListeners) {
for (const listener of this._rangeListeners) {
listener(begin, chunk);
}
}
@ -775,8 +789,8 @@ class PDFDataRangeTransport {
* @param {number|undefined} total
*/
onDataProgress(loaded, total) {
this.#capability.promise.then(() => {
for (const listener of this.#progressListeners) {
this._readyCapability.promise.then(() => {
for (const listener of this._progressListeners) {
listener(loaded, total);
}
});
@ -786,23 +800,23 @@ class PDFDataRangeTransport {
* @param {Uint8Array|null} chunk
*/
onDataProgressiveRead(chunk) {
this.#capability.promise.then(() => {
for (const listener of this.#progressiveReadListeners) {
this._readyCapability.promise.then(() => {
for (const listener of this._progressiveReadListeners) {
listener(chunk);
}
});
}
onDataProgressiveDone() {
this.#capability.promise.then(() => {
for (const listener of this.#progressiveDoneListeners) {
this._readyCapability.promise.then(() => {
for (const listener of this._progressiveDoneListeners) {
listener();
}
});
}
transportReady() {
this.#capability.resolve();
this._readyCapability.resolve();
}
/**

View File

@ -669,7 +669,7 @@ describe("FreeText Editor", () => {
}
);
await page.evaluate(() => {
page.evaluate(() => {
window.PDFViewerApplication.eventBus.dispatch(
"switchannotationeditorparams",
{
@ -1290,7 +1290,7 @@ describe("FreeText Editor", () => {
".selectedEditor .internal"
);
await page.evaluate(() => {
page.evaluate(() => {
window.PDFViewerApplication.eventBus.dispatch(
"switchannotationeditorparams",
{

View File

@ -626,7 +626,7 @@ describe("Highlight Editor", () => {
const { width: prevWidth } = await getRect(page, editorSelector);
value = 24;
await page.evaluate(val => {
page.evaluate(val => {
window.PDFViewerApplication.eventBus.dispatch(
"switchannotationeditorparams",
{
@ -763,7 +763,7 @@ describe("Highlight Editor", () => {
const { width: prevWidth } = await getRect(page, editorSelector);
await page.evaluate(val => {
page.evaluate(val => {
window.PDFViewerApplication.eventBus.dispatch(
"switchannotationeditorparams",
{

View File

@ -302,7 +302,7 @@ describe("Ink Editor", () => {
await page.mouse.up();
await awaitPromise(clickHandle);
await page.mouse.click(rect.x - 10, rect.y + 10);
page.mouse.click(rect.x - 10, rect.y + 10);
await page.waitForSelector(`${getEditorSelector(0)}.disabled`);
})
);
@ -583,7 +583,7 @@ describe("Ink Editor", () => {
}
const red = "#ff0000";
await page.evaluate(value => {
page.evaluate(value => {
window.PDFViewerApplication.eventBus.dispatch(
"switchannotationeditorparams",
{
@ -763,7 +763,7 @@ describe("Ink Editor", () => {
await selectEditor(page, pdfjsA);
const red = "#ff0000";
await page.evaluate(value => {
page.evaluate(value => {
window.PDFViewerApplication.eventBus.dispatch(
"switchannotationeditorparams",
{

View File

@ -631,7 +631,6 @@ describe("Stamp Editor", () => {
});
it("must check that the alt-text button is here when pasting in the second tab", async () => {
// Run sequentially to avoid clipboard issues.
for (let i = 0; i < pages1.length; i++) {
const [, page1] = pages1[i];
await page1.bringToFront();
@ -1593,80 +1592,86 @@ describe("Stamp Editor", () => {
});
it("must check that deleting an image can be undone using the undo button", async () => {
// Run sequentially to avoid clipboard issues.
for (const [, page] of pages) {
await switchToStamp(page);
await Promise.all(
pages.map(async ([browserName, page]) => {
await switchToStamp(page);
const editorSelector = getEditorSelector(0);
await copyImage(page, "../images/firefox_logo.png", editorSelector);
await page.waitForSelector(editorSelector);
await waitForSerialized(page, 1);
const editorSelector = getEditorSelector(0);
await copyImage(page, "../images/firefox_logo.png", editorSelector);
await page.waitForSelector(editorSelector);
await waitForSerialized(page, 1);
await page.waitForSelector(`${editorSelector} button.delete`);
await page.click(`${editorSelector} button.delete`);
await waitForSerialized(page, 0);
await page.waitForSelector("#editorUndoBar", { visible: true });
await page.waitForSelector(`${editorSelector} button.delete`);
await page.click(`${editorSelector} button.delete`);
await waitForSerialized(page, 0);
await page.waitForSelector("#editorUndoBar", { visible: true });
await page.waitForSelector("#editorUndoBarUndoButton", {
visible: true,
});
await page.click("#editorUndoBarUndoButton");
await waitForSerialized(page, 1);
await page.waitForSelector(editorSelector);
await page.waitForSelector(`${editorSelector} canvas`);
}
await page.waitForSelector("#editorUndoBarUndoButton", {
visible: true,
});
await page.click("#editorUndoBarUndoButton");
await waitForSerialized(page, 1);
await page.waitForSelector(editorSelector);
await page.waitForSelector(`${editorSelector} canvas`);
})
);
});
it("must check that the undo deletion popup displays the correct message", async () => {
// Run sequentially to avoid clipboard issues.
for (const [, page] of pages) {
await switchToStamp(page);
await Promise.all(
pages.map(async ([browserName, page]) => {
await switchToStamp(page);
const editorSelector = getEditorSelector(0);
await copyImage(page, "../images/firefox_logo.png", editorSelector);
await page.waitForSelector(editorSelector);
await waitForSerialized(page, 1);
const editorSelector = getEditorSelector(0);
await copyImage(page, "../images/firefox_logo.png", editorSelector);
await page.waitForSelector(editorSelector);
await waitForSerialized(page, 1);
await page.waitForSelector(`${editorSelector} button.delete`);
await page.click(`${editorSelector} button.delete`);
await waitForSerialized(page, 0);
await page.waitForSelector(`${editorSelector} button.delete`);
await page.click(`${editorSelector} button.delete`);
await waitForSerialized(page, 0);
await page.waitForFunction(() => {
const messageElement = document.querySelector(
"#editorUndoBarMessage"
await page.waitForFunction(() => {
const messageElement = document.querySelector(
"#editorUndoBarMessage"
);
return messageElement && messageElement.textContent.trim() !== "";
});
const message = await page.waitForSelector("#editorUndoBarMessage");
const messageText = await page.evaluate(
el => el.textContent,
message
);
return messageElement && messageElement.textContent.trim() !== "";
});
const message = await page.waitForSelector("#editorUndoBarMessage");
const messageText = await page.evaluate(el => el.textContent, message);
expect(messageText).toContain("Image removed");
}
expect(messageText).toContain("Image removed");
})
);
});
it("must check that the popup disappears when a new image is inserted", async () => {
// Run sequentially to avoid clipboard issues.
for (const [, page] of pages) {
await switchToStamp(page);
await Promise.all(
pages.map(async ([browserName, page]) => {
await switchToStamp(page);
const editorSelector = getEditorSelector(0);
await copyImage(page, "../images/firefox_logo.png", editorSelector);
await page.waitForSelector(editorSelector);
await waitForSerialized(page, 1);
const editorSelector = getEditorSelector(0);
await copyImage(page, "../images/firefox_logo.png", editorSelector);
await page.waitForSelector(editorSelector);
await waitForSerialized(page, 1);
await page.waitForSelector(`${editorSelector} button.delete`);
await page.click(`${editorSelector} button.delete`);
await waitForSerialized(page, 0);
await page.waitForSelector(`${editorSelector} button.delete`);
await page.click(`${editorSelector} button.delete`);
await waitForSerialized(page, 0);
await page.waitForSelector("#editorUndoBar", { visible: true });
await page.click("#editorStampAddImage");
const newInput = await page.$("#stampEditorFileInput");
await newInput.uploadFile(
`${path.join(__dirname, "../images/firefox_logo.png")}`
);
await waitForImage(page, getEditorSelector(1));
await waitForSerialized(page, 1);
await page.waitForSelector("#editorUndoBar", { hidden: true });
}
await page.waitForSelector("#editorUndoBar", { visible: true });
await page.click("#editorStampAddImage");
const newInput = await page.$("#stampEditorFileInput");
await newInput.uploadFile(
`${path.join(__dirname, "../images/firefox_logo.png")}`
);
await waitForImage(page, getEditorSelector(1));
await waitForSerialized(page, 1);
await page.waitForSelector("#editorUndoBar", { hidden: true });
})
);
});
});