Browse Source

fix: properly generate requestID in webContents.printToPDF() (#20769)

Milan Burda 5 years ago
parent
commit
bd5a5b3ae6
2 changed files with 17 additions and 2 deletions
  1. 4 2
      lib/browser/api/web-contents.js
  2. 13 0
      spec-main/api-web-contents-spec.ts

+ 4 - 2
lib/browser/api/web-contents.js

@@ -71,7 +71,6 @@ const defaultPrintingSetting = {
   headerFooterEnabled: false,
   marginsType: 0,
   isFirstRequest: false,
-  requestID: getNextId(),
   previewUIID: 0,
   previewModifiable: true,
   printToPDF: true,
@@ -204,7 +203,10 @@ WebContents.prototype.executeJavaScript = function (code, hasUserGesture) {
 
 // Translate the options of printToPDF.
 WebContents.prototype.printToPDF = function (options) {
-  const printingSetting = Object.assign({}, defaultPrintingSetting)
+  const printingSetting = {
+    ...defaultPrintingSetting,
+    requestID: getNextId()
+  }
   if (options.landscape) {
     printingSetting.landscape = options.landscape
   }

+ 13 - 0
spec-main/api-web-contents-spec.ts

@@ -1400,6 +1400,19 @@ describe('webContents module', () => {
       const data = await w.webContents.printToPDF({})
       expect(data).to.be.an.instanceof(Buffer).that.is.not.empty()
     })
+
+    it('does not crash when called multiple times', async () => {
+      const w = new BrowserWindow({ show: false, webPreferences: { sandbox: true } })
+      await w.loadURL('data:text/html,<h1>Hello, World!</h1>')
+      const promises = []
+      for (let i = 0; i < 2; i++) {
+        promises.push(w.webContents.printToPDF({}))
+      }
+      const results = await Promise.all(promises)
+      for (const data of results) {
+        expect(data).to.be.an.instanceof(Buffer).that.is.not.empty()
+      }
+    })
   })
 
   describe('PictureInPicture video', () => {