From 86d1272d1bb9b41061bcfdac73bc1860f25316bb Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 17 Oct 2024 18:27:12 +0200 Subject: [PATCH] When changing a property on a radio button then change it for the siblings (bug 1922766) --- src/scripting_api/field.js | 6 ++++ src/scripting_api/initialization.js | 19 +++++------- test/integration/scripting_spec.mjs | 43 ++++++++++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/bug1922766.pdf | Bin 0 -> 13634 bytes 5 files changed, 57 insertions(+), 12 deletions(-) create mode 100755 test/pdfs/bug1922766.pdf diff --git a/src/scripting_api/field.js b/src/scripting_api/field.js index 816824ce980e4..0188d484492f6 100644 --- a/src/scripting_api/field.js +++ b/src/scripting_api/field.js @@ -587,6 +587,12 @@ class RadioButtonField extends Field { this._value = data.value || ""; } + get _siblings() { + return this._radioIds.filter(id => id !== this._id); + } + + set _siblings(_) {} + get value() { return this._value; } diff --git a/src/scripting_api/initialization.js b/src/scripting_api/initialization.js index be941ed0cd715..946e6804862c7 100644 --- a/src/scripting_api/initialization.js +++ b/src/scripting_api/initialization.js @@ -96,27 +96,22 @@ function initSandbox(params) { obj.fieldPath = name; obj.appObjects = appObjects; + const otherFields = annotations.slice(1); + let field; switch (obj.type) { case "radiobutton": { - const otherButtons = annotations.slice(1); - field = new RadioButtonField(otherButtons, obj); + field = new RadioButtonField(otherFields, obj); break; } case "checkbox": { - const otherButtons = annotations.slice(1); - field = new CheckboxField(otherButtons, obj); + field = new CheckboxField(otherFields, obj); break; } - case "text": - if (annotations.length <= 1) { - field = new Field(obj); - break; - } - obj.siblings = annotations.map(x => x.id).slice(1); - field = new Field(obj); - break; default: + if (otherFields.length > 0) { + obj.siblings = otherFields.map(x => x.id); + } field = new Field(obj); } diff --git a/test/integration/scripting_spec.mjs b/test/integration/scripting_spec.mjs index 1de6f2195a254..715857f7022f3 100644 --- a/test/integration/scripting_spec.mjs +++ b/test/integration/scripting_spec.mjs @@ -2499,4 +2499,47 @@ describe("Interaction", () => { ); }); }); + + describe("Change radio property", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("bug1922766.pdf", "[data-annotation-id='44R']"); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that a change on a radio implies the change on all the radio in the group", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForScripting(page); + + const checkColor = async color => { + await waitForSandboxTrip(page); + for (const i of [40, 41, 42, 43]) { + const bgColor = await page.$eval( + `[data-element-id='${i}R']`, + el => getComputedStyle(el).backgroundColor + ); + expect(bgColor) + .withContext(`In ${browserName}`) + .toEqual(`rgb(${color.join(", ")})`); + } + }; + await checkColor([255, 0, 0]); + await page.click("[data-annotation-id='44R']"); + await checkColor([0, 0, 255]); + await page.click("[data-annotation-id='44R']"); + await checkColor([255, 0, 0]); + + await page.click("[data-annotation-id='43R']"); + await waitForSandboxTrip(page); + await page.click("[data-annotation-id='44R']"); + await checkColor([0, 0, 255]); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 65914dcf14e5d..7af1f403d887e 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -678,3 +678,4 @@ !issue15096.pdf !issue18036.pdf !issue18894.pdf +!bug1922766.pdf diff --git a/test/pdfs/bug1922766.pdf b/test/pdfs/bug1922766.pdf new file mode 100755 index 0000000000000000000000000000000000000000..f6aeed980df910b9912f29cf0f71b50068a77004 GIT binary patch literal 13634 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 F{10Y*5qAIp literal 0 HcmV?d00001