diff --git a/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-PDF-browser-regressions.pdf b/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-PDF-browser-regressions.pdf index e7efd7124..36deaa343 100644 Binary files a/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-PDF-browser-regressions.pdf and b/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-PDF-browser-regressions.pdf differ diff --git a/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-regressions.pdf b/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-regressions.pdf index 0ce2a6c56..32fdd97f1 100644 Binary files a/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-regressions.pdf and b/src/frontend/apps/e2e/__tests__/app-impress/assets/doc-export-regressions.pdf differ diff --git a/src/frontend/apps/e2e/__tests__/app-impress/assets/issue-860-complex-image.png b/src/frontend/apps/e2e/__tests__/app-impress/assets/issue-860-complex-image.png new file mode 100644 index 000000000..a1853b3f6 Binary files /dev/null and b/src/frontend/apps/e2e/__tests__/app-impress/assets/issue-860-complex-image.png differ diff --git a/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts b/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts index ba614ac5c..63cb3fb35 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/doc-export.spec.ts @@ -247,46 +247,6 @@ test.describe('Doc Export', () => { expect(pdfText.text).toContain('Hello World'); }); - /** - * Regression test for https://github.com/suitenumerique/docs/issues/860 - * - * PNG images were silently dropped from the exported PDF because the raw - * Blob was passed directly to @react-pdf/renderer's , which - * triggered a WASM "too many arguments" error internally and caused the - * image to be omitted. SVG images were unaffected because they were already - * converted to a data URL string before being passed to . - */ - test('it includes PNG images in the exported PDF', async ({ - page, - browserName, - }) => { - // overrideDocContent uploads both an SVG and a PNG image into the editor. - await overrideDocContent({ page, browserName }); - - await clickInEditorMenu(page, 'Download'); - - const downloadPromise = page.waitForEvent('download', (download) => - download.suggestedFilename().endsWith('.pdf'), - ); - - void page.getByTestId('doc-export-download-button').click(); - - const download = await downloadPromise; - await page.waitForTimeout(1000); - - const pdfBuffer = await cs.toBuffer(await download.createReadStream()); - - // Each embedded image in a PDF is stored as an XObject stream whose - // dictionary contains /Width . Emoji images are 64px - // wide, the SVG (test.svg, 100×100) becomes 100px. The uploaded PNG - // (logo-suite-numerique.png) is 756px wide — a value that won't appear - // for page sizes (A4 = 595 pt) or emoji. With the bug the PNG is silently - // dropped and /Width 756 is absent; after the fix it appears twice (image - // data stream + alpha-mask stream). - const pdfString = pdfBuffer.toString('latin1'); - expect(pdfString).toMatch(/\/Width 756/); - }); - test('it injects the correct language attribute into PDF export', async ({ page, browserName, diff --git a/src/frontend/apps/e2e/__tests__/app-impress/utils-export.ts b/src/frontend/apps/e2e/__tests__/app-impress/utils-export.ts index 87411bfcb..12ece0a19 100644 --- a/src/frontend/apps/e2e/__tests__/app-impress/utils-export.ts +++ b/src/frontend/apps/e2e/__tests__/app-impress/utils-export.ts @@ -57,16 +57,14 @@ export const overrideDocContent = async ({ const fileChooser = await fileChooserPromise; await fileChooser.setFiles(path.join(__dirname, 'assets/test.svg')); const image = page - .locator('.--docs--editor-container img.bn-visual-media[src$=".svg"]') - .first(); - await expect(image).toBeVisible({ - timeout: 10000, - }); + .locator('.--docs--editor-container') + .getByRole('img', { name: 'test.svg' }); + await expect(image).toBeVisible(); await page.keyboard.press('Enter'); await page.waitForTimeout(1000); - // Add Image PNG + // Add a simple Image PNG (1 IDAT chunk) await openSuggestionMenu({ page, suggestion: 'Resizable image with caption', @@ -78,12 +76,30 @@ export const overrideDocContent = async ({ path.join(__dirname, 'assets/logo-suite-numerique.png'), ); const imagePng = page - .locator('.--docs--editor-container img.bn-visual-media[src$=".png"]') - .first(); + .locator('.--docs--editor-container') + .getByRole('img', { name: 'logo-suite-numerique.png' }); await expect(imagePng).toBeVisible(); await page.waitForTimeout(1000); + // Add a more complex Image PNG (45 IDAT chunks) + await openSuggestionMenu({ + page, + suggestion: 'Resizable image with caption', + }); + const fileChooserComplexPNGPromise = page.waitForEvent('filechooser'); + await page.getByText('Upload image').click(); + const fileChooserComplexPNG = await fileChooserComplexPNGPromise; + await fileChooserComplexPNG.setFiles( + path.join(__dirname, 'assets/issue-860-complex-image.png'), + ); + const complexImagePng = page + .locator('.--docs--editor-container') + .getByRole('img', { name: 'issue-860-complex-image.png' }); + await expect(complexImagePng).toBeVisible(); + + await page.waitForTimeout(1000); + return randomDoc; };