mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-08-02 12:27:21 +02:00
Compare commits
8 Commits
f72f240699
...
60574fb7e3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
60574fb7e3 | ||
|
|
393e799e49 | ||
|
|
819671d42f | ||
|
|
6355dd7ded | ||
|
|
f6e4b1cf4a | ||
|
|
30bba5f165 | ||
|
|
a882195e9b | ||
|
|
99b23ea1f6 |
@ -462,32 +462,14 @@ function getDocument(src = {}) {
|
||||
if (!url) {
|
||||
throw new Error("getDocument - no `url` parameter provided.");
|
||||
}
|
||||
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
|
||||
// eslint-disable-next-line no-nested-ternary
|
||||
const NetworkStream = isValidFetchUrl(url)
|
||||
? PDFFetchStream
|
||||
: typeof PDFJSDev !== "undefined" &&
|
||||
PDFJSDev.test("GENERIC") &&
|
||||
isNodeJS
|
||||
? PDFNodeStream
|
||||
: PDFNetworkStream;
|
||||
}
|
||||
|
||||
networkStream = new NetworkStream({
|
||||
url,
|
||||
@ -722,6 +704,16 @@ 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
|
||||
@ -738,40 +730,34 @@ 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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -779,7 +765,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);
|
||||
}
|
||||
}
|
||||
@ -789,8 +775,8 @@ class PDFDataRangeTransport {
|
||||
* @param {number|undefined} total
|
||||
*/
|
||||
onDataProgress(loaded, total) {
|
||||
this._readyCapability.promise.then(() => {
|
||||
for (const listener of this._progressListeners) {
|
||||
this.#capability.promise.then(() => {
|
||||
for (const listener of this.#progressListeners) {
|
||||
listener(loaded, total);
|
||||
}
|
||||
});
|
||||
@ -800,23 +786,23 @@ class PDFDataRangeTransport {
|
||||
* @param {Uint8Array|null} chunk
|
||||
*/
|
||||
onDataProgressiveRead(chunk) {
|
||||
this._readyCapability.promise.then(() => {
|
||||
for (const listener of this._progressiveReadListeners) {
|
||||
this.#capability.promise.then(() => {
|
||||
for (const listener of this.#progressiveReadListeners) {
|
||||
listener(chunk);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onDataProgressiveDone() {
|
||||
this._readyCapability.promise.then(() => {
|
||||
for (const listener of this._progressiveDoneListeners) {
|
||||
this.#capability.promise.then(() => {
|
||||
for (const listener of this.#progressiveDoneListeners) {
|
||||
listener();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
transportReady() {
|
||||
this._readyCapability.resolve();
|
||||
this.#capability.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -669,7 +669,7 @@ describe("FreeText Editor", () => {
|
||||
}
|
||||
);
|
||||
|
||||
page.evaluate(() => {
|
||||
await page.evaluate(() => {
|
||||
window.PDFViewerApplication.eventBus.dispatch(
|
||||
"switchannotationeditorparams",
|
||||
{
|
||||
@ -1290,7 +1290,7 @@ describe("FreeText Editor", () => {
|
||||
".selectedEditor .internal"
|
||||
);
|
||||
|
||||
page.evaluate(() => {
|
||||
await page.evaluate(() => {
|
||||
window.PDFViewerApplication.eventBus.dispatch(
|
||||
"switchannotationeditorparams",
|
||||
{
|
||||
|
||||
@ -626,7 +626,7 @@ describe("Highlight Editor", () => {
|
||||
const { width: prevWidth } = await getRect(page, editorSelector);
|
||||
|
||||
value = 24;
|
||||
page.evaluate(val => {
|
||||
await page.evaluate(val => {
|
||||
window.PDFViewerApplication.eventBus.dispatch(
|
||||
"switchannotationeditorparams",
|
||||
{
|
||||
@ -763,7 +763,7 @@ describe("Highlight Editor", () => {
|
||||
|
||||
const { width: prevWidth } = await getRect(page, editorSelector);
|
||||
|
||||
page.evaluate(val => {
|
||||
await page.evaluate(val => {
|
||||
window.PDFViewerApplication.eventBus.dispatch(
|
||||
"switchannotationeditorparams",
|
||||
{
|
||||
|
||||
@ -302,7 +302,7 @@ describe("Ink Editor", () => {
|
||||
await page.mouse.up();
|
||||
await awaitPromise(clickHandle);
|
||||
|
||||
page.mouse.click(rect.x - 10, rect.y + 10);
|
||||
await 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";
|
||||
page.evaluate(value => {
|
||||
await page.evaluate(value => {
|
||||
window.PDFViewerApplication.eventBus.dispatch(
|
||||
"switchannotationeditorparams",
|
||||
{
|
||||
@ -763,7 +763,7 @@ describe("Ink Editor", () => {
|
||||
await selectEditor(page, pdfjsA);
|
||||
|
||||
const red = "#ff0000";
|
||||
page.evaluate(value => {
|
||||
await page.evaluate(value => {
|
||||
window.PDFViewerApplication.eventBus.dispatch(
|
||||
"switchannotationeditorparams",
|
||||
{
|
||||
|
||||
@ -631,6 +631,7 @@ 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();
|
||||
@ -1592,86 +1593,80 @@ describe("Stamp Editor", () => {
|
||||
});
|
||||
|
||||
it("must check that deleting an image can be undone using the undo button", async () => {
|
||||
await Promise.all(
|
||||
pages.map(async ([browserName, page]) => {
|
||||
await switchToStamp(page);
|
||||
// Run sequentially to avoid clipboard issues.
|
||||
for (const [, page] of pages) {
|
||||
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 () => {
|
||||
await Promise.all(
|
||||
pages.map(async ([browserName, page]) => {
|
||||
await switchToStamp(page);
|
||||
// Run sequentially to avoid clipboard issues.
|
||||
for (const [, page] of pages) {
|
||||
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"
|
||||
);
|
||||
return messageElement && messageElement.textContent.trim() !== "";
|
||||
});
|
||||
const message = await page.waitForSelector("#editorUndoBarMessage");
|
||||
const messageText = await page.evaluate(
|
||||
el => el.textContent,
|
||||
message
|
||||
await page.waitForFunction(() => {
|
||||
const messageElement = document.querySelector(
|
||||
"#editorUndoBarMessage"
|
||||
);
|
||||
expect(messageText).toContain("Image removed");
|
||||
})
|
||||
);
|
||||
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");
|
||||
}
|
||||
});
|
||||
|
||||
it("must check that the popup disappears when a new image is inserted", async () => {
|
||||
await Promise.all(
|
||||
pages.map(async ([browserName, page]) => {
|
||||
await switchToStamp(page);
|
||||
// Run sequentially to avoid clipboard issues.
|
||||
for (const [, page] of pages) {
|
||||
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 });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user