1 /* 2 * Copyright (c) 2007, 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 %W% %E% 26 @key headful 27 @bug 6598089 28 @summary Tests restoring focus on a single disabled coponent 29 @author Anton Tarasov: area=awt-focus 30 @library ../../regtesthelpers 31 @build Util 32 @run main RestoreFocusOnDisabledComponentTest 33 */ 34 35 import java.awt.*; 36 import java.awt.event.*; 37 import java.applet.Applet; 38 import test.java.awt.regtesthelpers.Util; 39 40 /* 41 * The bug is not reproducible on Windows. 42 */ 43 public class RestoreFocusOnDisabledComponentTest extends Applet { 44 Frame frame = new Frame("Frame") {public String toString() {return "FRAME";}}; 45 Button b0 = new Button("button0") {public String toString() {return "B-0";}}; 46 Button b1 = new Button("button1") {public String toString() {return "B-1";}}; 47 volatile int nFocused; 48 Robot robot; 49 50 public static void main(String[] args) { 51 RestoreFocusOnDisabledComponentTest app = new RestoreFocusOnDisabledComponentTest(); 52 app.init(); 53 app.start(); 54 } 55 56 public void init() { 57 robot = Util.createRobot(); 58 } 59 60 public void start() { 61 frame.add(b0); 62 frame.add(b1); 63 frame.setLayout(new FlowLayout()); 64 frame.pack(); 65 66 frame.setVisible(true); 67 68 Util.waitForIdle(robot); 69 KeyboardFocusManager.setCurrentKeyboardFocusManager(new DefaultKeyboardFocusManager() { 70 public boolean dispatchEvent(AWTEvent e) { 71 if (e.getID() == FocusEvent.FOCUS_GAINED) { 72 // Trying to emulate timings. b1 should be disabled just by the time it gets 73 // FOCUS_GAINED event. The latter is a result of disabling b0 that initiates 74 // focus auto transfer. 75 if (e.getSource() == b1) { 76 b1.setEnabled(false); 77 78 } else if (e.getSource() == b0) { 79 if (++nFocused > 10) { 80 nFocused = -1; 81 throw new TestFailedException("Focus went into busy loop!"); 82 } 83 } 84 } 85 return super.dispatchEvent(e); 86 } 87 }); 88 // Initiating focus auto transfer. 89 // Focus will be requested to b1. When FOCUS_GAINED is being dispatched to b1, it will 90 // be disabled. This will trigger focus restoring. Focus will be requested to b0 (the 91 // last opposite component). When FOCUS_GAINED is being dispatched to b0, it will 92 // also be disabled. However, the last opposite component (and the most recent focus owner) 93 // will still be b0. When DKFM initiates focus restoring it should detect restoring 94 // on the same component and break. 95 b0.setEnabled(false); 96 97 Util.waitForIdle(robot); 98 if (nFocused != -1) { 99 System.out.println("Test passed."); 100 } 101 } 102 } 103 104 class TestFailedException extends RuntimeException { 105 TestFailedException(String msg) { 106 super("Test failed: " + msg); 107 } 108 }