From 0daf51c340718429774ef93a2be47dcf5242c297 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 23 Dec 2020 11:13:43 +0100 Subject: [PATCH] [Scripting] Try to ensure that the `WillPrint`/`DidPrint` respectively `DidSave` events are always dispatched Note that currently the `DidSave` event is not *guaranteed* to actually be dispatched if there's any errors during saving, which is easily fixed by simply moving it to occur in the `finally`-handler in `PDFViewerApplication.save` method. For the `WillPrint`/`DidPrint` events, things are unfortunately more complicated. Currently these events will *only* be dispatched iff the printing request comes from within the viewer itself (e.g. by the user clicking on the "Print" toolbar button), however printing can be triggered in a few additional ways: - In the GENERIC viewer: - By the Ctrl+P keyboard shortcut. - In the MOZCENTRAL viewer, i.e. the Firefox built-in viewer: - By the Ctrl+P keyboard shortcut. - By the "Print" item, as found in either the Firefox "Hamburger menu" or in the browser-window menu. In either of the cases described above, no `WillPrint`/`DidPrint` events will be dispatched. In order to *guarantee* that things work in the general case, we thus have to move the `dispatchEventInSandbox` calls to the "beforeprint"/"afterprint" event handlers instead. --- web/app.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/web/app.js b/web/app.js index c2ddd2b48..6040dc854 100644 --- a/web/app.js +++ b/web/app.js @@ -1047,16 +1047,16 @@ const PDFViewerApplication = { .then(data => { const blob = new Blob([data], { type: "application/pdf" }); downloadManager.download(blob, url, filename, sourceEventType); - - this._scriptingInstance?.scripting.dispatchEventInSandbox({ - id: "doc", - name: "DidSave", - }); }) .catch(() => { this.download({ sourceEventType }); }) .finally(() => { + this._scriptingInstance?.scripting.dispatchEventInSandbox({ + id: "doc", + name: "DidSave", + }); + this._saveInProgress = false; }); }, @@ -1967,6 +1967,11 @@ const PDFViewerApplication = { }, beforePrint() { + this._scriptingInstance?.scripting.dispatchEventInSandbox({ + id: "doc", + name: "WillPrint", + }); + if (this.printService) { // There is no way to suppress beforePrint/afterPrint events, // but PDFPrintService may generate double events -- this will ignore @@ -2028,6 +2033,11 @@ const PDFViewerApplication = { }, afterPrint() { + this._scriptingInstance?.scripting.dispatchEventInSandbox({ + id: "doc", + name: "DidPrint", + }); + if (this.printService) { this.printService.destroy(); this.printService = null; @@ -2060,17 +2070,7 @@ const PDFViewerApplication = { if (!this.supportsPrinting) { return; } - this._scriptingInstance?.scripting.dispatchEventInSandbox({ - id: "doc", - name: "WillPrint", - }); - window.print(); - - this._scriptingInstance?.scripting.dispatchEventInSandbox({ - id: "doc", - name: "DidPrint", - }); }, bindEvents() {