Skip to content

Commit

Permalink
[Scripting] Await manually triggered dispatchEventInSandbox calls i…
Browse files Browse the repository at this point in the history
…n the viewer

Given that the `dispatchEventInSandbox` method (on the scripting-classes) is asynchronous, there's a very real risk that the events won't be dispatched/handled until *after* their associated functionality has actually run (with the "Will..." events being particularily susceptible to this issue).
To reduce the likelihood of that happening, we can simply `await` the `dispatchEventInSandbox` calls as necessary. A couple of methods are now marked as `async` to support these changes, however that shouldn't be a problem as far as I can tell.

*Please note:* Given that the browser "beforeprint"/"afterprint" events are *synchronous*, we unfortunately cannot await the `WillPrint`/`DidPrint` event dispatching. To fix this properly the web-platform would need support for asynchronous printing, and we'll thus have to hope that things work correctly anyway.
  • Loading branch information
Snuffleupagus committed Dec 23, 2020
1 parent 0daf51c commit 7e35a8c
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions web/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -1013,7 +1013,7 @@ const PDFViewerApplication = {
.catch(downloadByUrl); // Error occurred, try downloading with the URL.
},

save({ sourceEventType = "download" } = {}) {
async save({ sourceEventType = "download" } = {}) {
if (this._saveInProgress) {
return;
}
Expand All @@ -1036,12 +1036,13 @@ const PDFViewerApplication = {
this.download({ sourceEventType });
return;
}
this._scriptingInstance?.scripting.dispatchEventInSandbox({
this._saveInProgress = true;

await this._scriptingInstance?.scripting.dispatchEventInSandbox({
id: "doc",
name: "WillSave",
});

this._saveInProgress = true;
this.pdfDocument
.saveDocument(this.pdfDocument.annotationStorage)
.then(data => {
Expand All @@ -1051,8 +1052,8 @@ const PDFViewerApplication = {
.catch(() => {
this.download({ sourceEventType });
})
.finally(() => {
this._scriptingInstance?.scripting.dispatchEventInSandbox({
.finally(async () => {
await this._scriptingInstance?.scripting.dispatchEventInSandbox({
id: "doc",
name: "DidSave",
});
Expand Down Expand Up @@ -1614,7 +1615,7 @@ const PDFViewerApplication = {
return;
}

scripting.dispatchEventInSandbox({
await scripting.dispatchEventInSandbox({
id: "doc",
name: "Open",
});
Expand Down Expand Up @@ -1967,6 +1968,8 @@ const PDFViewerApplication = {
},

beforePrint() {
// Given that the "beforeprint" event is synchronous, we unfortunately
// cannot await the scripting event dispatching here.
this._scriptingInstance?.scripting.dispatchEventInSandbox({
id: "doc",
name: "WillPrint",
Expand Down Expand Up @@ -2033,6 +2036,8 @@ const PDFViewerApplication = {
},

afterPrint() {
// Given that the "afterprint" event is synchronous, we unfortunately
// cannot await the scripting event dispatching here.
this._scriptingInstance?.scripting.dispatchEventInSandbox({
id: "doc",
name: "DidPrint",
Expand Down

0 comments on commit 7e35a8c

Please sign in to comment.