diff --git a/test/integration/copy_paste_spec.js b/test/integration/copy_paste_spec.js index 721cfe585100e9..1e64c402270e3d 100644 --- a/test/integration/copy_paste_spec.js +++ b/test/integration/copy_paste_spec.js @@ -145,6 +145,7 @@ describe("Copy and paste", () => { ); }); }); + describe("Copy/paste and ligatures", () => { let pages; @@ -197,4 +198,52 @@ describe("Copy and paste", () => { ); }); }); + + describe("Copy event", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".textLayer .endOfContent", + 100, + async page => { + await page.waitForFunction( + () => !!window.PDFViewerApplication.eventBus + ); + await waitForTextLayer(page); + } + ); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that the copy event is not stolen (bug 1857823)", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.evaluate(async () => { + const promise = new Promise(resolve => { + document.addEventListener("selectionchange", resolve, { + once: true, + }); + }); + const range = document.createRange(); + const span = document.querySelector(".textLayer span"); + range.selectNode(span); + const selection = window.getSelection(); + selection.addRange(range); + await promise; + }); + + const promise = waitForEvent(page, "copy", 300000); + await page.keyboard.down("Control"); + await page.keyboard.press("c"); + await page.keyboard.up("Control"); + await promise; + }) + ); + }); + }); }); diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index e9db36e949bf19..5e36593d101e00 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -218,17 +218,21 @@ class TextLayerBuilder { end.classList.remove("active"); }); - div.addEventListener("copy", event => { - if (!this.#enablePermissions) { - const selection = document.getSelection(); - event.clipboardData.setData( - "text/plain", - removeNullCharacters(normalizeUnicode(selection.toString())) - ); - } - event.preventDefault(); - event.stopPropagation(); - }); + div.addEventListener( + "copy", + event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData( + "text/plain", + removeNullCharacters(normalizeUnicode(selection.toString())) + ); + } + }, + // Capture the event in order to be sure that the copy event has the + // correct value. + { capture: true, passive: true } + ); } }