diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java index 416a3ee002bbc..d30a1744afaec 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,6 +73,8 @@ public final class CPrinterJob extends RasterPrinterJob { private String outputBin = null; + private Throwable printerAbortExcpn; + // This is the NSPrintInfo for this PrinterJob. Protect multi thread // access to it. It is used by the pageDialog, jobDialog, and printLoop. // This way the state of these items is shared across these calls. @@ -247,7 +249,7 @@ protected void cancelDoc() throws PrinterAbortException { } } - private void completePrintLoop() { + private void completePrintLoop(Throwable excpn) { Runnable r = new Runnable() { public void run() { synchronized(this) { performingPrinting = false; @@ -257,6 +259,8 @@ private void completePrintLoop() { } }}; + printerAbortExcpn = excpn; + if (onEventThread) { try { EventQueue.invokeAndWait(r); } catch (Exception e) { e.printStackTrace(); } } else { @@ -374,6 +378,9 @@ public SecondaryLoop run() { } catch (Exception e) { e.printStackTrace(); } + if (printerAbortExcpn != null) { + throw (PrinterAbortException) printerAbortExcpn; + } } if (++loopi < prMembers.length) { firstPage = prMembers[loopi][0]-1; @@ -751,15 +758,13 @@ private boolean cancelCheck() { // but that will block the AppKit thread against whomever is holding the synchronized lock boolean cancelled = (performingPrinting && userCancelled); if (cancelled) { - try { - LWCToolkit.invokeLater(new Runnable() { public void run() { - try { + EventQueue.invokeLater(() -> { + try { cancelDoc(); - } catch (PrinterAbortException pae) { - // no-op, let the native side handle it - } - }}, null); - } catch (java.lang.reflect.InvocationTargetException ite) {} + } catch (PrinterAbortException pae) { + // no-op, let the native side handle it + } + }); } return cancelled; } diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m b/src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m index 17feca9fd7e31..87ec0928cc515 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/PrinterView.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,8 +33,10 @@ #import "JNIUtilities.h" static jclass sjc_CPrinterJob = NULL; +static jclass sjc_PAbortEx = NULL; #define GET_CPRINTERJOB_CLASS() (sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob"); #define GET_CPRINTERJOB_CLASS_RETURN(ret) GET_CLASS_RETURN(sjc_CPrinterJob, "sun/lwawt/macosx/CPrinterJob", ret); +#define GET_PRINERABORTEXCEPTION_CLASS(ret) GET_CLASS_RETURN(sjc_PAbortEx, "java/awt/print/PrinterAbortException", ret); @implementation PrinterView @@ -260,7 +262,12 @@ - (BOOL)cancelCheck:(JNIEnv*)env DECLARE_METHOD_RETURN(jm_cancelCheck, sjc_CPrinterJob, "cancelCheck", "()Z", NO); BOOL b = (*env)->CallBooleanMethod(env, fPrinterJob, jm_cancelCheck); // AWT_THREADING Safe (known object) - CHECK_EXCEPTION(); + if (b) { + GET_PRINERABORTEXCEPTION_CLASS(b); + (*env)->ThrowNew(env, sjc_PAbortEx, "Printer Job cancelled"); + } else { + CHECK_EXCEPTION(); + } return b; } @@ -269,8 +276,13 @@ - (void)complete:(JNIEnv*)env { AWT_ASSERT_NOT_APPKIT_THREAD; - DECLARE_METHOD(jf_completePrintLoop, sjc_CPrinterJob, "completePrintLoop", "()V"); - (*env)->CallVoidMethod(env, fPrinterJob, jf_completePrintLoop); + jthrowable excpn = (*env)->ExceptionOccurred(env); + if (excpn != NULL) { + (*env)->ExceptionDescribe(env); + (*env)->ExceptionClear(env); + } + DECLARE_METHOD(jf_completePrintLoop, sjc_CPrinterJob, "completePrintLoop", "(Ljava/lang/Throwable;)V"); + (*env)->CallVoidMethod(env, fPrinterJob, jf_completePrintLoop, excpn); CHECK_EXCEPTION(); // Clean up after ourselves diff --git a/test/jdk/java/awt/print/PrinterJob/Cancel/PrinterJobCancel.java b/test/jdk/java/awt/print/PrinterJob/Cancel/PrinterJobCancel.java index a55e0eeb999b2..7735053b0f098 100644 --- a/test/jdk/java/awt/print/PrinterJob/Cancel/PrinterJobCancel.java +++ b/test/jdk/java/awt/print/PrinterJob/Cancel/PrinterJobCancel.java @@ -32,7 +32,7 @@ /* * @test - * @bug 4245280 + * @bug 4245280 8335231 * @key printer * @summary PrinterJob not cancelled when PrinterJob.cancel() is used * @library /java/awt/regtesthelpers