Make sure WillPrint ran before starting printing

This commit is contained in:
Calixte Denizet 2023-07-29 17:33:13 +02:00
parent 7ae5a0fef7
commit 8439e11160
4 changed files with 58 additions and 20 deletions

View File

@ -21,8 +21,14 @@ const FORMS_VERSION = 21.00720099;
const USERACTIVATION_CALLBACKID = 0; const USERACTIVATION_CALLBACKID = 0;
const USERACTIVATION_MAXTIME_VALIDITY = 5000; const USERACTIVATION_MAXTIME_VALIDITY = 5000;
function serializeError(error) {
const value = `${error.toString()}\n${error.stack}`;
return { command: "error", value };
}
export { export {
FORMS_VERSION, FORMS_VERSION,
serializeError,
USERACTIVATION_CALLBACKID, USERACTIVATION_CALLBACKID,
USERACTIVATION_MAXTIME_VALIDITY, USERACTIVATION_MAXTIME_VALIDITY,
VIEWER_TYPE, VIEWER_TYPE,

View File

@ -16,6 +16,7 @@
import { createActionsMap } from "./common.js"; import { createActionsMap } from "./common.js";
import { PDFObject } from "./pdf_object.js"; import { PDFObject } from "./pdf_object.js";
import { PrintParams } from "./print_params.js"; import { PrintParams } from "./print_params.js";
import { serializeError } from "./app_utils.js";
import { ZoomType } from "./constants.js"; import { ZoomType } from "./constants.js";
const DOC_EXTERNAL = false; const DOC_EXTERNAL = false;
@ -126,20 +127,29 @@ class Doc extends PDFObject {
} }
_dispatchDocEvent(name) { _dispatchDocEvent(name) {
if (name === "Open") { switch (name) {
this._disableSaving = true; case "Open":
this._runActions("OpenAction"); this._disableSaving = true;
this._disableSaving = false; this._runActions("OpenAction");
} else if (name === "WillPrint") { this._disableSaving = false;
this._disablePrinting = true; break;
this._runActions(name); case "WillPrint":
this._disablePrinting = false; this._disablePrinting = true;
} else if (name === "WillSave") { try {
this._disableSaving = true; this._runActions(name);
this._runActions(name); } catch (error) {
this._disableSaving = false; this._send(serializeError(error));
} else { }
this._runActions(name); this._send({ command: "WillPrintFinished" });
this._disablePrinting = false;
break;
case "WillSave":
this._disableSaving = true;
this._runActions(name);
this._disableSaving = false;
break;
default:
this._runActions(name);
} }
} }

View File

@ -34,6 +34,7 @@ import { Color } from "./color.js";
import { Console } from "./console.js"; import { Console } from "./console.js";
import { Doc } from "./doc.js"; import { Doc } from "./doc.js";
import { ProxyHandler } from "./proxy.js"; import { ProxyHandler } from "./proxy.js";
import { serializeError } from "./app_utils.js";
import { Util } from "./util.js"; import { Util } from "./util.js";
function initSandbox(params) { function initSandbox(params) {
@ -214,8 +215,7 @@ function initSandbox(params) {
try { try {
functions[name](args); functions[name](args);
} catch (error) { } catch (error) {
const value = `${error.toString()}\n${error.stack}`; send(serializeError(error));
send({ command: "error", value });
} }
}; };
} }

View File

@ -51,6 +51,8 @@ class PDFScriptingManager {
#scripting = null; #scripting = null;
#willPrintCapability = null;
/** /**
* @param {PDFScriptingManagerOptions} options * @param {PDFScriptingManagerOptions} options
*/ */
@ -203,10 +205,23 @@ class PDFScriptingManager {
} }
async dispatchWillPrint() { async dispatchWillPrint() {
return this.#scripting?.dispatchEventInSandbox({ if (!this.#scripting) {
id: "doc", return;
name: "WillPrint", }
}); await this.#willPrintCapability?.promise;
this.#willPrintCapability = new PromiseCapability();
try {
await this.#scripting.dispatchEventInSandbox({
id: "doc",
name: "WillPrint",
});
} catch (ex) {
this.#willPrintCapability.resolve();
this.#willPrintCapability = null;
throw ex;
}
await this.#willPrintCapability.promise;
} }
async dispatchDidPrint() { async dispatchDidPrint() {
@ -306,6 +321,10 @@ class PDFScriptingManager {
pdfViewer.decreaseScale(); pdfViewer.decreaseScale();
} }
break; break;
case "WillPrintFinished":
this.#willPrintCapability?.resolve();
this.#willPrintCapability = null;
break;
} }
return; return;
} }
@ -432,6 +451,9 @@ class PDFScriptingManager {
await this.#scripting.destroySandbox(); await this.#scripting.destroySandbox();
} catch {} } catch {}
this.#willPrintCapability?.reject(new Error("Scripting destroyed."));
this.#willPrintCapability = null;
for (const [name, listener] of this._internalEvents) { for (const [name, listener] of this._internalEvents) {
this.#eventBus._off(name, listener); this.#eventBus._off(name, listener);
} }