From 9277801493691da0f2de8b282fa3d2d4a9c0d537 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Fri, 21 Jul 2023 09:49:11 +0200 Subject: [PATCH] Text annotations must use their own canvas when their appearance is generated (bug 1844576) When a pdf has /NeedAppearances set to true, the annotation appearance must be generated from its value and we must take into account the hasOwnCanvas property. --- src/core/annotation.js | 8 +++- test/integration/scripting_spec.js | 61 +++++++++++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/bug1844576.pdf | Bin 0 -> 8034 bytes 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100755 test/pdfs/bug1844576.pdf diff --git a/src/core/annotation.js b/src/core/annotation.js index bfa9caabe..3b57c146c 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -1852,6 +1852,10 @@ class WidgetAnnotation extends Annotation { return { opList, separateForm: false, separateCanvas: false }; } + const isUsingOwnCanvas = !!( + this.data.hasOwnCanvas && intent & RenderingIntentFlag.DISPLAY + ); + const matrix = [1, 0, 0, 1, 0, 0]; const bbox = [ 0, @@ -1877,7 +1881,7 @@ class WidgetAnnotation extends Annotation { this.data.rect, transform, this.getRotationMatrix(annotationStorage), - /* isUsingOwnCanvas = */ false, + isUsingOwnCanvas, ]); const stream = new StringStream(content); @@ -1892,7 +1896,7 @@ class WidgetAnnotation extends Annotation { if (optionalContent !== undefined) { opList.addOp(OPS.endMarkedContent, []); } - return { opList, separateForm: false, separateCanvas: false }; + return { opList, separateForm: false, separateCanvas: isUsingOwnCanvas }; } _getMKDict(rotation) { diff --git a/test/integration/scripting_spec.js b/test/integration/scripting_spec.js index 5efbdb9d4..f92ebe917 100644 --- a/test/integration/scripting_spec.js +++ b/test/integration/scripting_spec.js @@ -1963,4 +1963,65 @@ describe("Interaction", () => { ); }); }); + + describe("in bug1844576.pdf", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("bug1844576.pdf", getSelector("9R")); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that a field has the correct formatted value", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const hasVisibleCanvas = await page.evaluate(_ => { + const elem = document.querySelector( + `[data-annotation-id="9R"] > canvas` + ); + return elem && !elem.hasAttribute("hidden"); + }); + expect(hasVisibleCanvas) + .withContext(`In ${browserName}`) + .toEqual(true); + + const hasHiddenInput = await page.evaluate(_ => { + const elem = document.querySelector( + `[data-annotation-id="9R"] > input` + ); + return elem?.hasAttribute("hidden"); + }); + + expect(hasHiddenInput).withContext(`In ${browserName}`).toEqual(true); + + await page.click(getSelector("12R")); + await page.waitForTimeout(10); + + const hasHiddenCanvas = await page.evaluate(_ => { + const elem = document.querySelector( + `[data-annotation-id="9R"] > canvas` + ); + return elem?.hasAttribute("hidden"); + }); + expect(hasHiddenCanvas) + .withContext(`In ${browserName}`) + .toEqual(true); + + const hasVisibleInput = await page.evaluate(_ => { + const elem = document.querySelector( + `[data-annotation-id="9R"] > input` + ); + return elem && !elem.hasAttribute("hidden"); + }); + + expect(hasVisibleInput) + .withContext(`In ${browserName}`) + .toEqual(true); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index a57c8ef4b..6f736fb1d 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -604,3 +604,4 @@ !empty.pdf !rotated_freetexts.pdf !issue16633.pdf +!bug1844576.pdf diff --git a/test/pdfs/bug1844576.pdf b/test/pdfs/bug1844576.pdf new file mode 100755 index 0000000000000000000000000000000000000000..e65ff138e13548ad7238830ece011498ed91d771 GIT binary patch literal 8034 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 literal 0 HcmV?d00001