1 /* 2 * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 @test 26 @key headful 27 @bug 6304473 6727884 28 @summary Tests that an exception on EDT is handled with ThreadGroup.uncaughtException() 29 @author artem.ananiev: area=awt.eventdispatching 30 @library ../../regtesthelpers 31 @build Util 32 @run main HandleExceptionOnEDT 33 */ 34 35 import java.awt.*; 36 import java.awt.event.*; 37 38 import test.java.awt.regtesthelpers.Util; 39 40 public class HandleExceptionOnEDT 41 { 42 private final static String EXCEPTION_MESSAGE = "A1234567890"; 43 44 private static volatile boolean exceptionHandled = false; 45 private static volatile boolean mousePressed = false; 46 47 public static void main(String[] args) 48 { 49 final Thread.UncaughtExceptionHandler eh = new Thread.UncaughtExceptionHandler() 50 { 51 @Override 52 public void uncaughtException(Thread t, Throwable e) 53 { 54 if (e.getMessage().equals(EXCEPTION_MESSAGE)) 55 { 56 exceptionHandled = true; 57 } 58 } 59 }; 60 61 Frame f = new Frame("F"); 62 f.setBounds(100, 100, 400, 300); 63 // set exception handler for EDT 64 f.addWindowListener(new WindowAdapter() 65 { 66 @Override 67 public void windowOpened(WindowEvent we) 68 { 69 Thread edt = Thread.currentThread(); 70 edt.setUncaughtExceptionHandler(eh); 71 } 72 }); 73 f.setVisible(true); 74 75 Robot r = Util.createRobot(); 76 Util.waitForIdle(r); 77 78 // check exception without modal dialog 79 MouseListener exceptionListener = new MouseAdapter() 80 { 81 @Override 82 public void mousePressed(MouseEvent me) 83 { 84 throw new RuntimeException(EXCEPTION_MESSAGE); 85 } 86 }; 87 f.addMouseListener(exceptionListener); 88 89 exceptionHandled = false; 90 Point fp = f.getLocationOnScreen(); 91 r.mouseMove(fp.x + f.getWidth() / 2, fp.y + f.getHeight() / 2); 92 Util.waitForIdle(r); 93 r.mousePress(InputEvent.BUTTON1_MASK); 94 Util.waitForIdle(r); 95 r.mouseRelease(InputEvent.BUTTON2_MASK); 96 f.removeMouseListener(exceptionListener); 97 98 if (!exceptionHandled) 99 { 100 throw new RuntimeException("Test FAILED: exception is not handled for frame"); 101 } 102 103 // check exception with modal dialog 104 final Dialog d = new Dialog(f, "D", true); 105 d.setBounds(fp.x + 100, fp.y + 100, 400, 300); 106 d.addMouseListener(exceptionListener); 107 EventQueue.invokeLater(new Runnable() 108 { 109 @Override 110 public void run() 111 { 112 d.setVisible(true); 113 } 114 }); 115 Util.waitForIdle(r); 116 117 exceptionHandled = false; 118 Point dp = d.getLocationOnScreen(); 119 r.mouseMove(dp.x + d.getWidth() / 2, dp.y + d.getHeight() / 2); 120 Util.waitForIdle(r); 121 r.mousePress(InputEvent.BUTTON1_MASK); 122 Util.waitForIdle(r); 123 r.mouseRelease(InputEvent.BUTTON2_MASK); 124 d.removeMouseListener(exceptionListener); 125 126 if (!exceptionHandled) 127 { 128 throw new RuntimeException("Test FAILED: exception is not handled for modal dialog"); 129 } 130 131 // check the dialog is still modal 132 MouseListener pressedListener = new MouseAdapter() 133 { 134 @Override 135 public void mousePressed(MouseEvent me) 136 { 137 mousePressed = true; 138 } 139 }; 140 f.addMouseListener(pressedListener); 141 142 mousePressed = false; 143 r.mouseMove(fp.x + 50, fp.y + 50); 144 Util.waitForIdle(r); 145 r.mousePress(InputEvent.BUTTON1_MASK); 146 Util.waitForIdle(r); 147 r.mouseRelease(InputEvent.BUTTON1_MASK); 148 Util.waitForIdle(r); 149 f.removeMouseListener(pressedListener); 150 151 if (mousePressed) 152 { 153 throw new RuntimeException("Test FAILED: modal dialog is not modal or visible after exception"); 154 } 155 156 // test is passed 157 d.dispose(); 158 f.dispose(); 159 } 160 }