aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Provodin <vitaly.provodin@jetbrains.com>2018-04-19 14:42:58 +0700
committerVitaly Provodin <vitaly.provodin@jetbrains.com>2018-04-19 14:42:58 +0700
commitb6e85c0f254e1bb96a944d87cf2d40451b5510e7 (patch)
tree9104607c72f0c071e56e7cb1ed0c8f79e6e22f8c
parenteb803100e4e35f22ed4fcbaf304c45af4cd2a2cc (diff)
downloadjdk8u_jdk-b6e85c0f254e1bb96a944d87cf2d40451b5510e7.tar.gz
JRE-741 added new regression test (Modal dialog stays above other process windows)jb8u152-b1238
-rw-r--r--test/jb/javax/swing/JDialog/JDialog741/JDialog741.html33
-rw-r--r--test/jb/javax/swing/JDialog/JDialog741/JDialog741.java272
2 files changed, 305 insertions, 0 deletions
diff --git a/test/jb/javax/swing/JDialog/JDialog741/JDialog741.html b/test/jb/javax/swing/JDialog/JDialog741/JDialog741.html
new file mode 100644
index 0000000000..f17d8bea09
--- /dev/null
+++ b/test/jb/javax/swing/JDialog/JDialog741/JDialog741.html
@@ -0,0 +1,33 @@
+<!--
+ Copyright 2000-2018 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.
+-->
+
+<html>
+<!--
+ @test
+ @summary regression test on JRE-741 Modal dialog stays above other process windows.
+ @run applet JDialog741.html
+ -->
+<head>
+ <title> </title>
+</head>
+<body>
+
+<h1>Modal dialog stays above other process windows<br>Bug ID: JRE-741</h1>
+
+<p> This is an AUTOMATIC test, simply wait for completion </p>
+
+<APPLET CODE="JDialog741.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
diff --git a/test/jb/javax/swing/JDialog/JDialog741/JDialog741.java b/test/jb/javax/swing/JDialog/JDialog741/JDialog741.java
new file mode 100644
index 0000000000..235701d81c
--- /dev/null
+++ b/test/jb/javax/swing/JDialog/JDialog741/JDialog741.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2000-2018 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.JPanel;
+import javax.swing.Popup;
+import javax.swing.PopupFactory;
+import javax.swing.RootPaneContainer;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
+import java.applet.Applet;
+import java.awt.AWTException;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Window;
+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.io.InputStream;
+
+public class JDialog741 extends Applet {
+
+ private static JFrame jFrame;
+ private static Window windowAncestor;
+ private static JDialog modalBlocker;
+
+ public void start() {
+
+ System.setProperty("jbre.popupwindow.settype", "true");
+
+ jFrame = new JFrame("Wrong popup z-order");
+ jFrame.setSize(200, 200);
+ jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+
+ JPanel jPanel = new JPanel();
+ jPanel.setPreferredSize(new Dimension(200, 200));
+
+ Popup popup = PopupFactory.getSharedInstance().getPopup(jFrame, jPanel, 100, 100);
+ windowAncestor = SwingUtilities.getWindowAncestor(jPanel);
+ ((RootPaneContainer) windowAncestor).getRootPane().putClientProperty("SIMPLE_WINDOW", true);
+ windowAncestor.setFocusable(true);
+ windowAncestor.setFocusableWindowState(true);
+ windowAncestor.setAutoRequestFocus(true);
+
+ jFrame.setVisible(true);
+ popup.show();
+
+
+ modalBlocker = new JDialog(windowAncestor, "Modal Blocker");
+ modalBlocker.setModal(true);
+ modalBlocker.setSize(new Dimension(200, 200));
+ modalBlocker.setLocation(200, 200);
+ modalBlocker.addWindowListener(new JDialog741Listener());
+ modalBlocker.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+
+ modalBlocker.setVisible(true);
+ }
+
+ static class JDialog741Listener extends DialogListener {
+
+ private static String printStream(String msg, InputStream stream) throws IOException {
+
+ String result = "";
+ int count = stream.available();
+ if (count > 0) {
+ byte[] b = new byte[count];
+ stream.read(b)
+ System.out.println("========= " + msg + " ========");
+ result = new String(b);
+ System.out.print(result);
+ System.out.println("======================================");
+ }
+ return result;
+ }
+
+ @Override
+ public void windowOpened(WindowEvent windowEvent) {
+
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ String anotherAppMsg = "";
+ boolean appFailed = false;
+
+ try {
+ String javaPath = System.getProperty("java.home", "");
+ String command = javaPath + File.separator + "bin" +
+ File.separator + "java -cp " + System.getProperty("test.classes", ".") +
+ " AnotherApp";
+
+ Process process = Runtime.getRuntime().exec(command);
+ int returnCode = process.waitFor();
+
+ printStream("AnotherApp System.out", process.getInputStream());
+
+ String serr = printStream("AnotherApp System.err", process.getErrorStream());
+
+ if (!serr.isEmpty()) {
+ String[] lines = serr.split("\\n");
+ for (String s : lines) {
+ if (s.contains("RuntimeException")) {
+ anotherAppMsg = s.split(":")[1];
+ }
+ }
+ appFailed = true;
+ }
+
+ System.out.println("return code: " + returnCode);
+
+ jFrame.dispose();
+ windowAncestor.dispose();
+ modalBlocker.dispose();
+
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+
+ if (appFailed && !anotherAppMsg.isEmpty())
+ throw new RuntimeException(anotherAppMsg);
+ else
+ throw new RuntimeException("AnotherApp failed");
+
+ }
+ }
+
+}
+
+class AnotherApp {
+
+ private static Robot robot;
+
+ static {
+ try {
+ robot = new Robot();
+ } catch (AWTException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ private static JFrame jFrame = new JFrame("Another application");
+
+ public static void main(String[] args) throws Exception {
+
+ SwingUtilities.invokeAndWait(() -> {
+ jFrame.setSize(500, 500);
+ jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ jFrame.addWindowListener(new AnotherAppListener());
+ jFrame.setVisible(true);
+ });
+ }
+
+ private static boolean checkImage(Container window, Dimension shotSize, int x, int y, int maxWidth, int maxHeight) {
+
+ boolean result = true;
+
+ System.out.println("checking for expectedX: " + x + "; expectedY: " + y);
+ System.out.println(" maxWidth: " + maxWidth + "; maxHeight: " + maxHeight);
+
+ Rectangle captureRect = new Rectangle(window.getLocationOnScreen(), shotSize);
+ BufferedImage screenImage = robot.createScreenCapture(captureRect);
+
+ try {
+ ImageIO.write(screenImage, "bmp", new File("test741" + window.getName() + ".bmp"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ int rgb;
+ int expectedRGB = screenImage.getRGB(x, y) & 0x00FFFFFF;
+
+ System.out.println(" expected rgb value: " + Integer.toHexString(expectedRGB));
+ for (int col = 1; col < maxWidth; col++) {
+ for (int row = 1; row < maxHeight; row++) {
+ // remove transparance
+ rgb = screenImage.getRGB(col, row) & 0x00FFFFFF;
+
+ result = (expectedRGB == rgb);
+ if (expectedRGB != rgb) {
+ System.out.println("at row: " + row + "; col: " + col);
+ System.out.println(" expected rgb value: " + Integer.toHexString(expectedRGB));
+ System.out.println(" actual rgb value: " + Integer.toHexString(rgb));
+ break;
+ }
+ }
+ if (!result) break;
+ }
+
+ return result;
+ }
+
+ static class AnotherAppListener extends DialogListener {
+
+ @Override
+ public void windowOpened(WindowEvent windowEvent) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ Dimension shotSize;
+
+ Container contentPane = jFrame.getContentPane();
+ shotSize = contentPane.getSize();
+ int expectedX = (int) (shotSize.getWidth() * 3 / 4);
+ int expectedY = (int) (shotSize.getHeight() / 4);
+ int maxWidth = (int) (shotSize.getWidth());
+ int maxHeight = (int) (shotSize.getHeight());
+
+ boolean failed = !checkImage(contentPane, shotSize, expectedX, expectedY, maxWidth, maxHeight);
+
+ jFrame.dispose();
+ if (failed) throw new RuntimeException("AnotherApp must be above all windows");
+ }
+ }
+}
+
+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) {
+
+ }
+}