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