diff --git a/scripts/electron-repros/printpdf-page-range/index.html b/scripts/electron-repros/printpdf-page-range/index.html new file mode 100644 index 0000000000..fcb93cd9e6 --- /dev/null +++ b/scripts/electron-repros/printpdf-page-range/index.html @@ -0,0 +1,68 @@ + + + + printToPDF Repro + + + +

Electron printToPDF — Page Range State Corruption Repro

+

Click Run Test Sequence to reproduce the bug. It will:

+
    +
  1. Print with no page range (should succeed)
  2. +
  3. Print with page range "999" (should fail — page doesn't exist)
  4. +
  5. Print with no page range again (does it still work?)
  6. +
+ + +
+ + + + diff --git a/scripts/electron-repros/printpdf-page-range/main.js b/scripts/electron-repros/printpdf-page-range/main.js new file mode 100644 index 0000000000..7c7a283d88 --- /dev/null +++ b/scripts/electron-repros/printpdf-page-range/main.js @@ -0,0 +1,53 @@ +const { app, BrowserWindow, ipcMain } = require("electron"); + +let mainWindow; + +app.whenReady().then(() => { + mainWindow = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + }, + }); + mainWindow.loadFile("index.html"); +}); + +ipcMain.handle("print-test", async (_e, { pageRanges, step }) => { + const printWindow = new BrowserWindow({ + show: false, + width: 1, + height: 1, + webPreferences: { offscreen: process.platform !== "linux" }, + }); + + await printWindow.loadFile("print-page.html"); + + // Wait for content to be ready. + await printWindow.webContents.executeJavaScript( + `new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))` + ); + + const opts = { + landscape: false, + pageSize: "A4", + scale: 1, + printBackground: true, + // Only include pageRanges if truthy (non-empty string). + ...(pageRanges ? { pageRanges } : {}), + }; + + console.log(`[Step ${step}] printToPDF called with:`, JSON.stringify(opts)); + + try { + const buffer = await printWindow.webContents.printToPDF(opts); + console.log(`[Step ${step}] SUCCESS - buffer size: ${buffer.length}`); + printWindow.destroy(); + return { ok: true, size: buffer.length }; + } catch (err) { + console.error(`[Step ${step}] FAILED: ${err.message}`); + printWindow.destroy(); + return { ok: false, error: err.message }; + } +}); diff --git a/scripts/electron-repros/printpdf-page-range/package.json b/scripts/electron-repros/printpdf-page-range/package.json new file mode 100644 index 0000000000..5c380d9a96 --- /dev/null +++ b/scripts/electron-repros/printpdf-page-range/package.json @@ -0,0 +1,13 @@ +{ + "name": "electron-printpdf-page-range-repro", + "version": "1.0.0", + "private": true, + "description": "Minimal repro for Electron printToPDF state corruption after an invalid pageRanges failure", + "main": "main.js", + "scripts": { + "start": "electron ." + }, + "devDependencies": { + "electron": "^35.0.0" + } +} diff --git a/scripts/electron-repros/printpdf-page-range/print-page.html b/scripts/electron-repros/printpdf-page-range/print-page.html new file mode 100644 index 0000000000..04eb11623d --- /dev/null +++ b/scripts/electron-repros/printpdf-page-range/print-page.html @@ -0,0 +1,8 @@ + + +Print Test + +

Test Page

+

This is a single-page document used to reproduce the printToPDF bug.

+ +