diff --git a/test/integration/copy_paste_spec.mjs b/test/integration/copy_paste_spec.mjs index 6c18929d913a0..cb5ae3ab9b906 100644 --- a/test/integration/copy_paste_spec.mjs +++ b/test/integration/copy_paste_spec.mjs @@ -15,7 +15,7 @@ import { closePages, - kbCopy, + copy, kbSelectAll, loadAndWait, mockClipboard, @@ -23,9 +23,11 @@ import { } from "./test_utils.mjs"; const selectAll = async page => { - const promise = waitForEvent(page, "selectionchange"); - await kbSelectAll(page); - await promise; + await waitForEvent({ + page, + eventName: "selectionchange", + action: () => kbSelectAll(page), + }); await page.waitForFunction(() => { const selection = document.getSelection(); @@ -55,10 +57,7 @@ describe("Copy and paste", () => { ); await selectAll(page); - const promise = waitForEvent(page, "copy"); - await kbCopy(page); - await promise; - + await copy(page); await page.waitForFunction( `document.querySelector('#viewerContainer').style.cursor !== "wait"` ); @@ -159,10 +158,7 @@ describe("Copy and paste", () => { ); await selectAll(page); - const promise = waitForEvent(page, "copy"); - await kbCopy(page); - await promise; - + await copy(page); await page.waitForFunction( `document.querySelector('#viewerContainer').style.cursor !== "wait"` ); diff --git a/test/integration/freetext_editor_spec.mjs b/test/integration/freetext_editor_spec.mjs index d7afe96ab52c4..6427ac28c72b6 100644 --- a/test/integration/freetext_editor_spec.mjs +++ b/test/integration/freetext_editor_spec.mjs @@ -16,6 +16,8 @@ import { awaitPromise, closePages, + copy, + copyToClipboard, createPromise, dragAndDropAnnotation, firstPageOnTop, @@ -30,21 +32,19 @@ import { kbBigMoveLeft, kbBigMoveRight, kbBigMoveUp, - kbCopy, kbGoToBegin, kbGoToEnd, kbModifierDown, kbModifierUp, - kbPaste, kbRedo, kbSelectAll, kbUndo, loadAndWait, + paste, pasteFromClipboard, scrollIntoView, switchToEditor, waitForAnnotationEditorLayer, - waitForEvent, waitForSelectedEditor, waitForSerialized, waitForStorageEntries, @@ -53,16 +53,6 @@ import { } from "./test_utils.mjs"; import { PNG } from "pngjs"; -const copyPaste = async page => { - let promise = waitForEvent(page, "copy"); - await kbCopy(page); - await promise; - - promise = waitForEvent(page, "paste"); - await kbPaste(page); - await promise; -}; - const selectAll = async page => { await kbSelectAll(page); await page.waitForFunction( @@ -187,7 +177,8 @@ describe("FreeText Editor", () => { ); await waitForSelectedEditor(page, getEditorSelector(0)); - await copyPaste(page); + await copy(page); + await paste(page); await page.waitForSelector(getEditorSelector(1), { visible: true, }); @@ -203,7 +194,8 @@ describe("FreeText Editor", () => { expect(pastedContent).withContext(`In ${browserName}`).toEqual(content); - await copyPaste(page); + await copy(page); + await paste(page); await page.waitForSelector(getEditorSelector(2), { visible: true, }); @@ -263,7 +255,8 @@ describe("FreeText Editor", () => { ); await waitForSelectedEditor(page, getEditorSelector(3)); - await copyPaste(page); + await copy(page); + await paste(page); await page.waitForSelector(getEditorSelector(4), { visible: true, }); @@ -276,9 +269,7 @@ describe("FreeText Editor", () => { ); for (let i = 0; i < 2; i++) { - const promise = waitForEvent(page, "paste"); - await kbPaste(page); - await promise; + await paste(page); await page.waitForSelector(getEditorSelector(5 + i)); } @@ -597,7 +588,8 @@ describe("FreeText Editor", () => { .withContext(`In ${browserName}`) .toEqual([0, 1, 3]); - await copyPaste(page); + await copy(page); + await paste(page); await page.waitForSelector(getEditorSelector(6), { visible: true, }); @@ -1275,7 +1267,8 @@ describe("FreeText Editor", () => { ); await waitForSelectedEditor(page, getEditorSelector(1)); - await copyPaste(page); + await copy(page); + await paste(page); await page.waitForSelector(getEditorSelector(6), { visible: true, }); @@ -3425,14 +3418,11 @@ describe("FreeText Editor", () => { ); await select(0); - await pasteFromClipboard( - page, - { - "text/html": "Bold Foo", - "text/plain": "Foo", - }, - `${editorSelector} .internal` - ); + await copyToClipboard(page, { + "text/html": "Bold Foo", + "text/plain": "Foo", + }); + await pasteFromClipboard(page, `${editorSelector} .internal`); let lastText = data; @@ -3442,14 +3432,11 @@ describe("FreeText Editor", () => { expect(text).withContext(`In ${browserName}`).toEqual(lastText); await select(3); - await pasteFromClipboard( - page, - { - "text/html": "Bold Bar
Oof", - "text/plain": "Bar\nOof", - }, - `${editorSelector} .internal` - ); + await copyToClipboard(page, { + "text/html": "Bold Bar
Oof", + "text/plain": "Bar\nOof", + }); + await pasteFromClipboard(page, `${editorSelector} .internal`); await waitForTextChange(lastText, editorSelector); text = await getText(editorSelector); @@ -3457,13 +3444,8 @@ describe("FreeText Editor", () => { expect(text).withContext(`In ${browserName}`).toEqual(lastText); await select(0); - await pasteFromClipboard( - page, - { - "text/html": "basic html", - }, - `${editorSelector} .internal` - ); + await copyToClipboard(page, { "text/html": "basic html" }); + await pasteFromClipboard(page, `${editorSelector} .internal`); // Nothing should change, so it's hard to wait on something. // eslint-disable-next-line no-restricted-syntax @@ -3477,15 +3459,12 @@ describe("FreeText Editor", () => { const prevHTML = await getHTML(); // Try to paste an image. - await pasteFromClipboard( - page, - { - "image/png": - // 1x1 transparent png. - "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==", - }, - `${editorSelector} .internal` - ); + await copyToClipboard(page, { + "image/png": + // 1x1 transparent png. + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==", + }); + await pasteFromClipboard(page, `${editorSelector} .internal`); // Nothing should change, so it's hard to wait on something. // eslint-disable-next-line no-restricted-syntax @@ -3505,14 +3484,11 @@ describe("FreeText Editor", () => { }); const fooBar = "Foo\nBar\nOof"; - await pasteFromClipboard( - page, - { - "text/html": "html", - "text/plain": fooBar, - }, - `${editorSelector} .internal` - ); + await copyToClipboard(page, { + "text/html": "html", + "text/plain": fooBar, + }); + await pasteFromClipboard(page, `${editorSelector} .internal`); await waitForTextChange("", editorSelector); text = await getText(editorSelector); diff --git a/test/integration/stamp_editor_spec.mjs b/test/integration/stamp_editor_spec.mjs index b8243f17ea037..66b2735bcfdb9 100644 --- a/test/integration/stamp_editor_spec.mjs +++ b/test/integration/stamp_editor_spec.mjs @@ -17,6 +17,8 @@ import { applyFunctionToEditor, awaitPromise, closePages, + copy, + copyToClipboard, getEditorDimensions, getEditorSelector, getFirstSerialized, @@ -24,11 +26,10 @@ import { getSerialized, kbBigMoveDown, kbBigMoveRight, - kbCopy, - kbPaste, kbSelectAll, kbUndo, loadAndWait, + paste, pasteFromClipboard, scrollIntoView, serializeBitmapDimensions, @@ -78,12 +79,10 @@ const copyImage = async (page, imagePath, number) => { const data = fs .readFileSync(path.join(__dirname, imagePath)) .toString("base64"); - await pasteFromClipboard( - page, - { "image/png": `data:image/png;base64,${data}` }, - "", - 500 - ); + + await copyToClipboard(page, { "image/png": `data:image/png;base64,${data}` }); + await pasteFromClipboard(page); + await waitForImage(page, getEditorSelector(number)); }; @@ -570,13 +569,13 @@ describe("Stamp Editor", () => { await page1.click("#editorStamp"); await copyImage(page1, "../images/firefox_logo.png", 0); - await kbCopy(page1); + await copy(page1); const [, page2] = pages2[i]; await page2.bringToFront(); await page2.click("#editorStamp"); - await kbPaste(page2); + await paste(page2); await waitForImage(page2, getEditorSelector(0)); } @@ -831,8 +830,8 @@ describe("Stamp Editor", () => { ); await page.waitForSelector(`${getEditorSelector(0)} .altText.done`); - await kbCopy(page); - await kbPaste(page); + await copy(page); + await paste(page); await page.waitForSelector(`${getEditorSelector(1)} .altText.done`); await waitForSerialized(page, 2); diff --git a/test/integration/test_utils.mjs b/test/integration/test_utils.mjs index 39fe88bd4c1e3..1c8d39d0de64b 100644 --- a/test/integration/test_utils.mjs +++ b/test/integration/test_utils.mjs @@ -186,13 +186,14 @@ async function getSpanRectFromText(page, pageNumber, text) { ); } -async function waitForEvent( +async function waitForEvent({ page, eventName, + action, selector = null, validator = null, - timeout = 5000 -) { + timeout = 5000, +}) { const handle = await page.evaluateHandle( (name, sel, validate, timeOut) => { let callback = null, @@ -227,13 +228,15 @@ async function waitForEvent( validator ? validator.toString() : null, timeout ); + + await action(); + const success = await awaitPromise(handle); if (success === null) { console.log(`waitForEvent: ${eventName} didn't trigger within the timeout`); } else if (!success) { console.log(`waitForEvent: ${eventName} triggered, but validation failed`); } - return success; } async function waitForStorageEntries(page, nEntries) { @@ -292,7 +295,15 @@ async function mockClipboard(pages) { ); } -async function pasteFromClipboard(page, data, selector, timeout = 100) { +async function copy(page) { + await waitForEvent({ + page, + eventName: "copy", + action: () => kbCopy(page), + }); +} + +async function copyToClipboard(page, data) { await page.evaluate(async dat => { const items = Object.create(null); for (const [type, value] of Object.entries(dat)) { @@ -305,15 +316,25 @@ async function pasteFromClipboard(page, data, selector, timeout = 100) { } await navigator.clipboard.write([new ClipboardItem(items)]); }, data); +} +async function paste(page) { + await waitForEvent({ + page, + eventName: "paste", + action: () => kbPaste(page), + }); +} + +async function pasteFromClipboard(page, selector = null) { const validator = e => e.clipboardData.items.length !== 0; - let hasPasteEvent = false; - while (!hasPasteEvent) { - // We retry to paste if nothing has been pasted before the timeout. - const promise = waitForEvent(page, "paste", selector, validator); - await kbPaste(page); - hasPasteEvent = await promise; - } + await waitForEvent({ + page, + eventName: "paste", + action: () => kbPaste(page), + selector, + validator, + }); } async function getSerialized(page, filter = undefined) { @@ -634,6 +655,8 @@ export { clearInput, closePages, closeSinglePage, + copy, + copyToClipboard, createPromise, dragAndDropAnnotation, firstPageOnTop, @@ -654,7 +677,6 @@ export { kbBigMoveLeft, kbBigMoveRight, kbBigMoveUp, - kbCopy, kbDeleteLastWord, kbFocusNext, kbFocusPrevious, @@ -662,12 +684,12 @@ export { kbGoToEnd, kbModifierDown, kbModifierUp, - kbPaste, kbRedo, kbSelectAll, kbUndo, loadAndWait, mockClipboard, + paste, pasteFromClipboard, scrollIntoView, serializeBitmapDimensions,