jdk/test/java/awt/Modal/ModalBlockingTests/BlockingWindowsTest.java
changeset 25787 f1c606e8b3f8
equal deleted inserted replaced
25786:266ca40a0af2 25787:f1c606e8b3f8
       
     1 /*
       
     2  * Copyright (c) 2007, 2014, 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 import static jdk.testlibrary.Asserts.*;
       
    25 
       
    26 import java.awt.*;
       
    27 import java.util.List;
       
    28 import java.util.ArrayList;
       
    29 
       
    30 public class BlockingWindowsTest {
       
    31 
       
    32     private TestDialog dialog, childDialog, secondDialog, dummyDialog, parentDialog;
       
    33     private TestFrame frame, secondFrame;
       
    34     private TestWindow window, childWindow;
       
    35 
       
    36     private static final int delay = 500;
       
    37     private final ExtendedRobot robot;
       
    38 
       
    39     private List<Window> allWindows;
       
    40 
       
    41     private Dialog hiddenDialog;
       
    42     private Frame  hiddenFrame;
       
    43 
       
    44     private Dialog.ModalityType modalityType;
       
    45 
       
    46     public enum DialogOwner {HIDDEN_DIALOG, NULL_DIALOG, HIDDEN_FRAME, NULL_FRAME, DIALOG, FRAME};
       
    47 
       
    48     private BlockingWindowsTest(Dialog.ModalityType modType,
       
    49                                 boolean             setModal,
       
    50                                 DialogOwner         owner) throws Exception {
       
    51 
       
    52         modalityType = modType;
       
    53         robot = new ExtendedRobot();
       
    54         EventQueue.invokeLater(() -> {
       
    55             createGUI(setModal, owner);
       
    56         });
       
    57     }
       
    58 
       
    59     public BlockingWindowsTest(
       
    60             Dialog.ModalityType modalityType, DialogOwner owner) throws Exception {
       
    61         this(modalityType, false, owner);
       
    62     }
       
    63 
       
    64     public BlockingWindowsTest(DialogOwner owner) throws Exception {
       
    65         this(null, true, owner);
       
    66     }
       
    67 
       
    68     private void createGUI(boolean     setModal,
       
    69                            DialogOwner owner) {
       
    70 
       
    71         allWindows = new ArrayList<>();
       
    72 
       
    73         if (owner != DialogOwner.DIALOG) {
       
    74             frame = new CustomFrame();
       
    75             frame.setLocation(50, 50);
       
    76             frame.setVisible(true);
       
    77             allWindows.add(frame);
       
    78         }
       
    79 
       
    80         switch (owner) {
       
    81             case DIALOG:
       
    82                 parentDialog = new ParentDialog((Dialog) null);
       
    83                 parentDialog.setLocation(50, 50);
       
    84                 parentDialog.setVisible(true);
       
    85                 allWindows.add(parentDialog);
       
    86                 dialog = new CustomDialog(parentDialog);
       
    87                 break;
       
    88             case FRAME:
       
    89                 dialog = new CustomDialog(frame);
       
    90                 break;
       
    91             case HIDDEN_DIALOG:
       
    92                 hiddenDialog = new Dialog((Frame) null);
       
    93                 dialog = new CustomDialog(hiddenDialog);
       
    94                 allWindows.add(hiddenDialog);
       
    95                 break;
       
    96             case NULL_DIALOG:
       
    97                 dialog = new CustomDialog((Dialog) null);
       
    98                 break;
       
    99             case HIDDEN_FRAME:
       
   100                 hiddenFrame = new Frame();
       
   101                 dialog = new CustomDialog(hiddenFrame);
       
   102                 allWindows.add(hiddenFrame);
       
   103                 break;
       
   104             case NULL_FRAME:
       
   105                 dialog = new CustomDialog((Frame) null);
       
   106                 break;
       
   107         }
       
   108 
       
   109         assertFalse(dialog == null, "error: null dialog");
       
   110 
       
   111         if (setModal) {
       
   112             dialog.setModal(true);
       
   113         } else if (modalityType != null) {
       
   114             dialog.setModalityType(modalityType);
       
   115         }
       
   116 
       
   117         dialog.setLocation(250, 50);
       
   118         allWindows.add(dialog);
       
   119 
       
   120         if (owner == DialogOwner.DIALOG) {
       
   121             window = new TestWindow(parentDialog);
       
   122         } else {
       
   123             window = new TestWindow(frame);
       
   124         }
       
   125 
       
   126         window.setLocation(50, 250);
       
   127         allWindows.add(window);
       
   128 
       
   129         if (owner == DialogOwner.DIALOG) {
       
   130             dummyDialog = new TestDialog(parentDialog);
       
   131         } else {
       
   132             dummyDialog = new TestDialog(frame);
       
   133         }
       
   134         dummyDialog.setLocation(450, 450);
       
   135         allWindows.add(dummyDialog);
       
   136 
       
   137         childWindow = new CustomWindow(dialog);
       
   138         childWindow.setLocation(450, 50);
       
   139         allWindows.add(childWindow);
       
   140 
       
   141         childDialog = new TestDialog(dialog);
       
   142         childDialog.setLocation(450, 250);
       
   143         allWindows.add(childDialog);
       
   144 
       
   145         if (owner == DialogOwner.DIALOG) {
       
   146             secondDialog = new CustomDialog(parentDialog);
       
   147         } else {
       
   148             secondDialog = new CustomDialog(frame);
       
   149         }
       
   150         if (setModal) {
       
   151             secondDialog.setModal(true);
       
   152         } else if (modalityType != null) {
       
   153             secondDialog.setModalityType(modalityType);
       
   154         }
       
   155 
       
   156         secondDialog.setLocation(50, 450);
       
   157         allWindows.add(secondDialog);
       
   158 
       
   159         secondFrame = new TestFrame();
       
   160         secondFrame.setLocation(250, 450);
       
   161         allWindows.add(secondFrame);
       
   162     }
       
   163 
       
   164     public void doTest() throws Exception {
       
   165 
       
   166         try {
       
   167 
       
   168             robot.waitForIdle(delay);
       
   169 
       
   170             if (parentDialog == null) { frame.clickOpenButton(robot); }
       
   171             else { parentDialog.clickOpenButton(robot); }
       
   172             robot.waitForIdle(delay);
       
   173 
       
   174             dialog.activated.waitForFlagTriggered();
       
   175             assertTrue(dialog.activated.flag(), "Dialog did not trigger " +
       
   176                 "Window Activated event when it became visible");
       
   177 
       
   178             dialog.closeGained.waitForFlagTriggered();
       
   179             assertTrue(dialog.closeGained.flag(), "The first button did not gain focus " +
       
   180                 "when the dialog became visible");
       
   181 
       
   182             assertTrue(dialog.closeButton.hasFocus(), "The first dialog button " +
       
   183                 "gained focus, but lost it afterwards");
       
   184 
       
   185             if (parentDialog == null) {
       
   186                 frame.checkBlockedFrame(robot, modalityType + " Dialog is visible.");
       
   187             } else {
       
   188                 parentDialog.checkBlockedDialog(robot, modalityType + " Dialog is visible.");
       
   189             }
       
   190 
       
   191             dialog.checkUnblockedDialog(robot, "A Frame is visible.");
       
   192 
       
   193             dialog.openClicked.reset();
       
   194             dialog.clickOpenButton(robot);
       
   195             robot.waitForIdle(delay);
       
   196 
       
   197             assertFalse(window.focusGained.flag(), "Window gained focus on becoming " +
       
   198                 "visible when Frame and Dialog are visible");
       
   199 
       
   200             window.checkBlockedWindow(robot,
       
   201                 "The parent of the Window is blocked by " + modalityType + " Dialog.");
       
   202 
       
   203             dummyDialog.checkBlockedDialog(robot,
       
   204                 "The parent of the Dialog is blocked by " + modalityType + " Dialog.");
       
   205 
       
   206             childDialog.checkUnblockedDialog(robot,
       
   207                 "The parent of the Dialog is " + modalityType + " Dialog");
       
   208 
       
   209             childWindow.checkUnblockedWindow(robot,
       
   210                 "The parent of the Window is " + modalityType + " Dialog");
       
   211 
       
   212             childWindow.openClicked.reset();
       
   213             childWindow.clickOpenButton(robot);
       
   214             robot.waitForIdle(delay);
       
   215 
       
   216             secondDialog.checkUnblockedDialog(robot,
       
   217                 "The dialog is " + modalityType + ", the parent of the dialog " +
       
   218                 "is blocked by another " + modalityType + " dialog.");
       
   219 
       
   220             secondFrame.checkBlockedFrame(robot,
       
   221                 modalityType + " dialog is displayed immediately after showing " +
       
   222                 "this frame. Another modal dialog is alreay visible");
       
   223 
       
   224             secondDialog.clickCloseButton(robot);
       
   225             robot.waitForIdle(delay);
       
   226 
       
   227             childWindow.checkUnblockedWindow(robot, "A blocking dialog was closed.");
       
   228             robot.waitForIdle(delay);
       
   229 
       
   230         } finally {
       
   231             EventQueue.invokeAndWait(this::closeAll);
       
   232         }
       
   233     }
       
   234 
       
   235     private void closeAll() {
       
   236         for (Window w: allWindows) {
       
   237             if (w != null) { w.dispose(); }
       
   238         }
       
   239     }
       
   240 
       
   241 
       
   242     class CustomFrame extends TestFrame {
       
   243 
       
   244         @Override
       
   245         public void doOpenAction() {
       
   246             if (dialog != null) { dialog.setVisible(true); }
       
   247         }
       
   248     }
       
   249 
       
   250     class CustomDialog extends TestDialog {
       
   251 
       
   252         public CustomDialog(Dialog dialog) {
       
   253             super(dialog);
       
   254         }
       
   255 
       
   256         public CustomDialog(Frame frame) {
       
   257             super(frame);
       
   258         }
       
   259 
       
   260         @Override
       
   261         public void doOpenAction() {
       
   262             if (window != null) { window.setVisible(true); }
       
   263             if (dummyDialog != null) { dummyDialog.setVisible(true); }
       
   264             if (childWindow != null) { childWindow.setVisible(true); }
       
   265             if (childDialog != null) { childDialog.setVisible(true); }
       
   266         }
       
   267 
       
   268         @Override
       
   269         public void doCloseAction() {
       
   270             this.dispose();
       
   271         }
       
   272     }
       
   273 
       
   274     class CustomWindow extends TestWindow {
       
   275 
       
   276         public CustomWindow(Window parent) {
       
   277             super(parent);
       
   278         }
       
   279 
       
   280         @Override
       
   281         public void doOpenAction() {
       
   282             if (secondFrame  != null) {  secondFrame.setVisible(true); }
       
   283             if (secondDialog != null) { secondDialog.setVisible(true); }
       
   284         }
       
   285     }
       
   286 
       
   287     class ParentDialog extends TestDialog {
       
   288 
       
   289         public ParentDialog(Dialog d) { super(d); }
       
   290 
       
   291         @Override
       
   292         public void doOpenAction() {
       
   293             if (dialog != null) {
       
   294                 dialog.setVisible(true);
       
   295             }
       
   296         }
       
   297     }
       
   298 }
       
   299