1 /*
   2  * Copyright (c) 2008, 2018, 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       6314575
  28   @summary   Tests that previosly focused owned window doesn't steal focus when an owner's component requests focus.
  29   @library   ../../regtesthelpers
  30   @build     Util
  31   @run       main ActualFocusedWindowBlockingTest
  32 */
  33 
  34 import java.awt.*;
  35 import java.awt.event.*;
  36 import test.java.awt.regtesthelpers.Util;
  37 
  38 public class ActualFocusedWindowBlockingTest {
  39     Robot robot = Util.createRobot();
  40     Frame owner = new Frame("Owner Frame");
  41     Window win = new Window(owner);
  42     Frame frame = new Frame("Auxiliary Frame");
  43     Button fButton = new Button("frame button") {public String toString() {return "Frame_Button";}};
  44     Button wButton = new Button("window button") {public String toString() {return "Window_Button";}};
  45     Button aButton = new Button("auxiliary button") {public String toString() {return "Auxiliary_Button";}};
  46 
  47     public static void main(String[] args) {
  48         ActualFocusedWindowBlockingTest app = new ActualFocusedWindowBlockingTest();
  49         app.init();
  50         app.start();
  51     }
  52 
  53     public void init() {
  54         Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
  55                 public void eventDispatched(AWTEvent e) {
  56                     System.out.println("--> " + e);
  57                 }
  58             }, FocusEvent.FOCUS_EVENT_MASK | WindowEvent.WINDOW_FOCUS_EVENT_MASK);
  59 
  60         owner.add(fButton);
  61         win.add(wButton);
  62         frame.add(aButton);
  63 
  64         owner.setName("OWNER_FRAME");
  65         win.setName("OWNED_WINDOW");
  66         frame.setName("AUX_FRAME");
  67 
  68         tuneAndShowWindows(new Window[] {owner, win, frame});
  69     }
  70 
  71     public void start() {
  72         if ("sun.awt.motif.MToolkit".equals(Toolkit.getDefaultToolkit().getClass().getName())) {
  73             System.out.println("No testing on Motif. Test passed.");
  74             return;
  75         }
  76 
  77         System.out.println("\nTest started:\n");
  78 
  79         // Test 1.
  80 
  81         clickOnCheckFocus(wButton);
  82         clickOnCheckFocus(aButton);
  83 
  84         Util.clickOnComp(fButton, robot);
  85         if (!testFocused(fButton)) {
  86             throw new TestFailedException("The owner's component [" + fButton + "] couldn't be focused by click");
  87         }
  88 
  89         // Test 2.
  90 
  91         clickOnCheckFocus(wButton);
  92         clickOnCheckFocus(aButton);
  93 
  94         fButton.requestFocus();
  95         Util.waitForIdle(robot);
  96         if (!testFocused(fButton)) {
  97             throw new TestFailedException("The owner's component [" + fButton + "] couldn't be focused by request");
  98         }
  99 
 100         // Test 3.
 101 
 102         clickOnCheckFocus(wButton);
 103         clickOnCheckFocus(aButton);
 104         clickOnCheckFocus(fButton);
 105         clickOnCheckFocus(aButton);
 106 
 107         Util.clickOnTitle(owner, robot);
 108         if (!testFocused(fButton)) {
 109             throw new TestFailedException("The owner's component [" + fButton + "] couldn't be focused as the most recent focus owner");
 110         }
 111 
 112         System.out.println("Test passed.");
 113     }
 114 
 115     void tuneAndShowWindows(Window[] arr) {
 116         int y = 0;
 117         for (Window w: arr) {
 118             w.setLayout(new FlowLayout());
 119             w.setBounds(100, y, 400, 150);
 120             w.setBackground(Color.blue);
 121             w.setVisible(true);
 122             y += 200;
 123             Util.waitForIdle(robot);
 124         }
 125     }
 126 
 127     void clickOnCheckFocus(Component c) {
 128         if (c instanceof Frame) {
 129             Util.clickOnTitle((Frame)c, robot);
 130         } else {
 131             Util.clickOnComp(c, robot);
 132         }
 133         if (!testFocused(c)) {
 134             throw new TestErrorException(c + "couldn't get focus by click.");
 135         }
 136     }
 137 
 138     boolean testFocused(Component c) {
 139         for (int i=0; i<10; i++) {
 140             if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == c) {
 141                 return true;
 142             }
 143             Util.waitForIdle(robot);
 144         }
 145         return false;
 146     }
 147 
 148     // Thrown when the behavior being verified is found wrong.
 149     class TestFailedException extends RuntimeException {
 150         TestFailedException(String msg) {
 151             super("Test failed: " + msg);
 152         }
 153     }
 154 
 155     // Thrown when an error not related to the behavior being verified is encountered.
 156     class TestErrorException extends RuntimeException {
 157         TestErrorException(String msg) {
 158             super("Unexpected error: " + msg);
 159         }
 160     }
 161 }