Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8182638

[macosx] Active modal dialog is hidden by another non-active one

    XMLWordPrintable

Details

    • b29
    • x86
    • os_x

    Description

      FULL PRODUCT VERSION :
      $ /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java -version
      java version "1.8.0_131"
      Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
      Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      $ uname -a
      Darwin unit-929 16.6.0 Darwin Kernel Version 16.6.0: Fri Apr 14 16:21:16 PDT 2017; root:xnu-3789.60.24~6/RELEASE_X86_64 x86_64

      A DESCRIPTION OF THE PROBLEM :
      Active modal dialog is hidden by another non-active one

      REGRESSION. Last worked in version 8u112

      ADDITIONAL REGRESSION INFORMATION:
      It was not checked on 1.8.0_121, 9 EA

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1) create modal dialog D1
      2) set any modality type e.g. APPLICATION_MODAL
      3) create modal dialog D2
      4) set the modality type APPLICATION_MODAL


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      D2 is active and it is placed on top of all windows including D1.
      ACTUAL -
      D2 is active but D1 is placed on top of D2.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      /*
       * Copyright 2000-2017 JetBrains s.r.o.
       *
       * Licensed under the Apache License, Version 2.0 (the "License");
       * you may not use this file except in compliance with the License.
       * You may obtain a copy of the License at
       *
       * http://www.apache.org/licenses/LICENSE-2.0
       *
       * Unless required by applicable law or agreed to in writing, software
       * distributed under the License is distributed on an "AS IS" BASIS,
       * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       * See the License for the specific language governing permissions and
       * limitations under the License.
       */

      import javax.imageio.ImageIO;
      import javax.swing.JDialog;
      import javax.swing.JFrame;
      import javax.swing.SwingUtilities;
      import javax.swing.WindowConstants;
      import java.awt.AWTException;
      import java.awt.Dialog;
      import java.awt.Dimension;
      import java.awt.Point;
      import java.awt.Robot;
      import java.awt.Rectangle;
      import java.awt.event.WindowEvent;
      import java.awt.event.WindowListener;
      import java.awt.image.BufferedImage;
      import java.io.File;
      import java.io.IOException;
      import java.lang.reflect.InvocationTargetException;
      import java.util.Arrays;

      /* @test
       * @summary regression test on JRE-392 Tip of the day is not hidden while another modal window is shown
       * @run main/othervm JDialog392
       */


      // The test displays two modal dialogs one by one
      // and checks that the latest modal dialog would be on top of all windows
      public class JDialog392 implements Runnable {

          private static JFrame frame = new JFrame("JDialog392");

          private static boolean verbose = false;
          private static boolean passed = true;

          static DialogThread modalDialogThread1;

          static DialogThread modalDialogThread2;

          static class DialogThread {

              JDialog dialog;

              private String dialogTitle;
              private Point location;
              private int width;
              private int height;
              private DialogListener eventListener;


              DialogThread(String dialogTitle, Point location, int width, int height, DialogListener eventListener) {
                  this.dialogTitle = dialogTitle;
                  this.location = location;
                  this.width = width;
                  this.height = height;
                  this.eventListener = eventListener;
              }

              void run() {
                  dialog = new JDialog(frame, true);
                  dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
                  dialog.setTitle(dialogTitle);

                  dialog.setLocation(location);
                  dialog.setSize(width, height);

                  if (eventListener != null)
                      dialog.addWindowListener(eventListener);

                  dialog.setVisible(true);
              }

              void removeWindowListener() {
                  dialog.removeWindowListener(eventListener);
              }
          }

          static abstract class DialogListener implements WindowListener {

              @Override
              public void windowClosing(WindowEvent e) {

              }

              @Override
              public void windowClosed(WindowEvent e) {

              }

              @Override
              public void windowIconified(WindowEvent e) {

              }

              @Override
              public void windowDeiconified(WindowEvent e) {

              }

              @Override
              public void windowActivated(WindowEvent e) {

              }

              @Override
              public void windowDeactivated(WindowEvent e) {

              }
          }

          static class FirstDialogListener extends DialogListener {
              @Override
              public void windowOpened(WindowEvent windowEvent) {
                  modalDialogThread1.removeWindowListener();
                  modalDialogThread2 = new DialogThread(
                          "Modal input 2",
                          new Point(5, 50),
                          300, 200,
                          new SecondDialogListener());
                  modalDialogThread2.run();
              }
          }

          static class SecondDialogListener extends DialogListener {
              @Override
              public void windowOpened(WindowEvent windowEvent) {
                  try {
                      Robot robot = new Robot();
                      Dimension shotSize = modalDialogThread2.dialog.getContentPane().getSize();
                      Rectangle captureRect = new Rectangle(modalDialogThread2.dialog.getContentPane().getLocationOnScreen(), shotSize);

                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }

                      BufferedImage screenImage = robot.createScreenCapture(captureRect);

                      int rgb;
                      int expectedRGB = screenImage.getRGB((int) (shotSize.getWidth() / 2), (int) (shotSize.getHeight() / 2)) & 0x00FFFFFF;

                      for (int col = 1; col < shotSize.getWidth(); col++) {
                          for (int row = 1; row < shotSize.getHeight(); row++) {
                              try {
                                  // remove transparance
                                  rgb = screenImage.getRGB(col, row) & 0x00FFFFFF;

                                  if (verbose)
                                      System.out.print((rgb == expectedRGB) ? " ." : " " + Integer.toHexString(rgb));

                                  passed = passed & (expectedRGB == rgb);

                              } catch (ArrayIndexOutOfBoundsException e) {
                                  throw new RuntimeException(e);
                              }

                          }
                          if (verbose)
                              System.out.println();
                      }
                      if (verbose)
                          ImageIO.write(screenImage, "bmp", new File("test392.bmp"));

                      if (!passed)
                          throw new RuntimeException("The second dialog window was not on top");

                  } catch (AWTException | IOException e) {
                      throw new RuntimeException(e);
                  }
                  modalDialogThread2.dialog.dispose();
                  modalDialogThread1.dialog.dispose();
                  frame.dispose();
              }
          }

          public void run() {
              frame.setSize(350, 300);
              frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
              frame.setVisible(true);

              modalDialogThread1 = new DialogThread(
                      "Modal input 1",
                      new Point(10, 75),
                      250, 150,
                      new FirstDialogListener());
              modalDialogThread1.run();
          }

          public static void main(String[] args) throws Exception {
              JDialog392.verbose = Arrays.asList(args).contains("-verbose");
              try {
                  SwingUtilities.invokeAndWait(new JDialog392());
              } catch (InterruptedException | InvocationTargetException e) {
                  throw new RuntimeException(e);
              }
          }
      }

      ---------- END SOURCE ----------

      Attachments

        Issue Links

          Activity

            People

              ssadetsky Semyon Sadetsky (Inactive)
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              7 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: