From 71f5050ed299b56613f75b76c477198261375990 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 10 Aug 2023 18:02:27 +0200 Subject: [PATCH] [Editor] Avoid to unselect when a new page is rendered --- src/display/editor/annotation_editor_layer.js | 1 - src/display/editor/tools.js | 1 + test/integration/freetext_editor_spec.js | 79 +++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/display/editor/annotation_editor_layer.js b/src/display/editor/annotation_editor_layer.js index b1b9a0201..7c4121440 100644 --- a/src/display/editor/annotation_editor_layer.js +++ b/src/display/editor/annotation_editor_layer.js @@ -129,7 +129,6 @@ class AnnotationEditorLayer { } else { this.enableClick(); } - this.#uiManager.unselectAll(); if (mode !== AnnotationEditorType.NONE) { this.div.classList.toggle( diff --git a/src/display/editor/tools.js b/src/display/editor/tools.js index 1dce7f0f5..380c12e69 100644 --- a/src/display/editor/tools.js +++ b/src/display/editor/tools.js @@ -1104,6 +1104,7 @@ class AnnotationEditorUIManager { } this.setEditingState(true); this.#enableAll(); + this.unselectAll(); for (const layer of this.#allLayers.values()) { layer.updateMode(mode); } diff --git a/test/integration/freetext_editor_spec.js b/test/integration/freetext_editor_spec.js index 45707987b..6f582bf11 100644 --- a/test/integration/freetext_editor_spec.js +++ b/test/integration/freetext_editor_spec.js @@ -2265,4 +2265,83 @@ describe("FreeText Editor", () => { ); }); }); + + describe("Don't unselect all when scrolling", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".annotationEditorLayer", + 100, + async page => { + await page.waitForFunction(async () => { + await window.PDFViewerApplication.initializedPromise; + return true; + }); + await page.evaluate(() => { + window.PDFViewerApplication.eventBus.on( + "annotationeditorstateschanged", + ({ details }) => { + window.editingEvents?.push(details); + } + ); + }); + } + ); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that selected editor stay selected", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.click("#editorFreeText"); + + const rect = await page.$eval(".annotationEditorLayer", el => { + const { x, y } = el.getBoundingClientRect(); + return { x, y }; + }); + + const data = "Hello PDF.js World !!"; + await page.mouse.click(rect.x + 100, rect.y + 100); + await page.waitForTimeout(10); + await page.type(`${getEditorSelector(0)} .internal`, data); + // Commit. + await page.keyboard.press("Escape"); + await page.waitForTimeout(10); + + await page.evaluate(() => { + window.editingEvents = []; + }); + await page.waitForTimeout(10); + + for (let pageNumber = 1; pageNumber <= 4; pageNumber++) { + const pageSelector = `.page[data-page-number = "${pageNumber}"]`; + await page.evaluate(selector => { + const element = window.document.querySelector(selector); + element.scrollIntoView(); + }, pageSelector); + + const annotationLayerSelector = `${pageSelector} > .annotationEditorLayer`; + await page.waitForSelector(annotationLayerSelector, { + visible: true, + timeout: 0, + }); + } + + const editingEvents = await page.evaluate(() => { + const e = window.editingEvents; + delete window.editingEvents; + return e; + }); + expect(editingEvents.length) + .withContext(`In ${browserName}`) + .toEqual(0); + }) + ); + }); + }); });