From 20fd9099f8319a9272ac57342317172048e95c72 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Tue, 29 Nov 2022 16:37:02 +0100 Subject: [PATCH] [Annotation] Send correctly the updated values to the JS sandbox --- src/display/annotation_layer.js | 16 ++++++--- test/integration/scripting_spec.js | 53 +++++++++++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue15753.pdf | Bin 0 -> 11637 bytes 4 files changed, 65 insertions(+), 5 deletions(-) create mode 100755 test/pdfs/issue15753.pdf diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 2d311fafb..2dc3a5ea8 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -1065,7 +1065,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { const elementData = { userValue: textContent, formattedValue: null, - valueOnFocus: "", + lastCommittedValue: null, }; if (this.data.multiLine) { @@ -1122,10 +1122,11 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { if (this.enableScripting && this.hasJSActions) { element.addEventListener("focus", event => { + const { target } = event; if (elementData.userValue) { - event.target.value = elementData.userValue; + target.value = elementData.userValue; } - elementData.valueOnFocus = event.target.value; + elementData.lastCommittedValue = target.value; }); element.addEventListener("updatefromsandbox", jsEvent => { @@ -1207,9 +1208,10 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { return; } const { value } = event.target; - if (elementData.valueOnFocus === value) { + if (elementData.lastCommittedValue === value) { return; } + elementData.lastCommittedValue = value; // Save the entered value elementData.userValue = value; this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { @@ -1230,7 +1232,10 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { element.addEventListener("blur", event => { const { value } = event.target; elementData.userValue = value; - if (this._mouseState.isDown && elementData.valueOnFocus !== value) { + if ( + this._mouseState.isDown && + elementData.lastCommittedValue !== value + ) { // Focus out using the mouse: data are committed this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { source: this, @@ -1250,6 +1255,7 @@ class TextWidgetAnnotationElement extends WidgetAnnotationElement { if (this.data.actions?.Keystroke) { element.addEventListener("beforeinput", event => { + elementData.lastCommittedValue = null; const { data, target } = event; const { value, selectionStart, selectionEnd } = target; diff --git a/test/integration/scripting_spec.js b/test/integration/scripting_spec.js index 81afb33d7..e63063abb 100644 --- a/test/integration/scripting_spec.js +++ b/test/integration/scripting_spec.js @@ -1598,4 +1598,57 @@ describe("Interaction", () => { ); }); }); + + describe("in issue15753.pdf", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("issue15753.pdf", getSelector("27R")); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check field value is correctly updated when committed with ENTER key", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await page.waitForFunction( + "window.PDFViewerApplication.scriptingReady === true" + ); + + await page.type(getSelector("27R"), "abc", { + delay: 10, + }); + await page.keyboard.press("Enter"); + await page.waitForFunction(`${getQuerySelector("28R")}.value !== ""`); + let value = await page.$eval(getSelector("28R"), el => el.value); + expect(value).withContext(`In ${browserName}`).toEqual("abc"); + + await page.type(getSelector("27R"), "def", { + delay: 10, + }); + + await page.keyboard.press("Enter"); + await page.waitForFunction( + `${getQuerySelector("28R")}.value !== "abc"` + ); + value = await page.$eval(getSelector("28R"), el => el.value); + expect(value).withContext(`In ${browserName}`).toEqual("abcdef"); + + await page.keyboard.down("Control"); + await page.keyboard.press("A"); + await page.keyboard.up("Control"); + await page.keyboard.press("Backspace"); + + await page.keyboard.press("Enter"); + await page.waitForFunction( + `${getQuerySelector("28R")}.value !== "abcdef"` + ); + value = await page.$eval(getSelector("28R"), el => el.value); + expect(value).withContext(`In ${browserName}`).toEqual(""); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index dd1ed3356..d7c000a7d 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -558,3 +558,4 @@ !issue15690.pdf !bug1802888.pdf !issue15759.pdf +!issue15753.pdf diff --git a/test/pdfs/issue15753.pdf b/test/pdfs/issue15753.pdf new file mode 100755 index 0000000000000000000000000000000000000000..5c4acc42e253a6229ffa60ca566b5fec6dceab48 GIT binary patch literal 11637 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 O>?_tKR!{#?uKPd0qvDGI literal 0 HcmV?d00001