From 5e88926d1a63d55f0121f9cc40c20f7fdc724218 Mon Sep 17 00:00:00 2001 From: kingthorin Date: Tue, 2 Jun 2026 12:59:15 -0400 Subject: [PATCH] macos: Fix quit after user cancel Signed-off-by: kingthorin --- zap/gradle/japicmp.yaml | 4 +++- .../main/java/org/parosproxy/paros/control/Control.java | 8 ++++++-- .../org/parosproxy/paros/control/MenuFileControl.java | 4 ++-- zap/src/main/java/org/zaproxy/zap/OsXGui.java | 9 ++++++--- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/zap/gradle/japicmp.yaml b/zap/gradle/japicmp.yaml index ea21a2cffbb..e80413c0a29 100644 --- a/zap/gradle/japicmp.yaml +++ b/zap/gradle/japicmp.yaml @@ -20,4 +20,6 @@ classExcludes: methodExcludes: - "org.parosproxy.paros.model.OptionsParam#getCertificateParam()" - "org.parosproxy.paros.model.OptionsParam#getExperimentalFeaturesParam()" - - "org.parosproxy.paros.model.OptionsParam#setCertificateParam(org.parosproxy.paros.extension.option.OptionsParamCertificate)" \ No newline at end of file + - "org.parosproxy.paros.model.OptionsParam#setCertificateParam(org.parosproxy.paros.extension.option.OptionsParamCertificate)" + - "org.parosproxy.paros.control.Control#exit(boolean,java.io.File)" + - "org.parosproxy.paros.control.MenuFileControl#exit()" \ No newline at end of file diff --git a/zap/src/main/java/org/parosproxy/paros/control/Control.java b/zap/src/main/java/org/parosproxy/paros/control/Control.java index 6ac0afae17a..0755f21bc8c 100644 --- a/zap/src/main/java/org/parosproxy/paros/control/Control.java +++ b/zap/src/main/java/org/parosproxy/paros/control/Control.java @@ -232,7 +232,10 @@ private void saveConfigurations() { } } - public void exit(boolean noPrompt, final File openOnExit) { + /** + * @return {@code true} if shutdown was started, {@code false} if the user cancelled a prompt + */ + public boolean exit(boolean noPrompt, final File openOnExit) { boolean isNewState = model.getSession().isNewState(); int rootCount = 0; if (!Constant.isLowMemoryOptionSet()) { @@ -282,7 +285,7 @@ public void exit(boolean noPrompt, final File openOnExit) { if (message != null && view.showConfirmDialog(new ZapHtmlLabel(message)) != JOptionPane.OK_OPTION) { - return; + return false; } } @@ -335,6 +338,7 @@ public void run() { } else { t.start(); } + return true; } /** diff --git a/zap/src/main/java/org/parosproxy/paros/control/MenuFileControl.java b/zap/src/main/java/org/parosproxy/paros/control/MenuFileControl.java index 2a90070a5df..c151c21e885 100644 --- a/zap/src/main/java/org/parosproxy/paros/control/MenuFileControl.java +++ b/zap/src/main/java/org/parosproxy/paros/control/MenuFileControl.java @@ -110,8 +110,8 @@ public MenuFileControl(Model model, View view, Control control) { this.control = control; } - public void exit() { - control.exit(false, null); + public boolean exit() { + return control.exit(false, null); } public void newSession(boolean isPromptNewSession) throws ClassNotFoundException, Exception { diff --git a/zap/src/main/java/org/zaproxy/zap/OsXGui.java b/zap/src/main/java/org/zaproxy/zap/OsXGui.java index 4e1305c8ebb..e6f1348bdbe 100644 --- a/zap/src/main/java/org/zaproxy/zap/OsXGui.java +++ b/zap/src/main/java/org/zaproxy/zap/OsXGui.java @@ -22,6 +22,7 @@ import java.awt.Desktop; import java.awt.Image; import java.awt.Toolkit; +import java.awt.desktop.QuitResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.parosproxy.paros.control.Control; @@ -64,7 +65,7 @@ public static void setup() { Desktop desktop = Desktop.getDesktop(); desktop.setAboutHandler(ae -> showAboutDialog()); desktop.setPreferencesHandler(pe -> showOptionsDialog()); - desktop.setQuitHandler((qe, qr) -> exitZap()); + desktop.setQuitHandler((qe, qr) -> exitZap(qr)); } private static Image createIcon() { @@ -81,7 +82,9 @@ private static void showOptionsDialog() { Control.getSingleton().getMenuToolsControl().options(); } - private static void exitZap() { - Control.getSingleton().getMenuFileControl().exit(); + private static void exitZap(QuitResponse quitResponse) { + if (!Control.getSingleton().getMenuFileControl().exit()) { + quitResponse.cancelQuit(); + } } }