changeset 59331:d3a661d0dc4e

8234522: [macos] Crash with use of native file dialog Reviewed-by: prr, dmarkov
author serb
date Wed, 11 Dec 2019 14:30:45 -0800
parents 56e1977e435a
children 005e0c497a00
files src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m test/jdk/java/awt/FileDialog/MacOSGoToFolderCrash.java
diffstat 2 files changed, 74 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m	Wed Dec 11 17:17:58 2019 -0800
+++ b/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m	Wed Dec 11 14:30:45 2019 -0800
@@ -50,7 +50,7 @@
  * Subtypes of NSApplicationDefined, which are used for custom events.
  */
 enum {
-    ExecuteBlockEvent, NativeSyncQueueEvent
+    ExecuteBlockEvent = 777, NativeSyncQueueEvent
 };
 
 @implementation NSApplicationAWT
@@ -385,11 +385,14 @@
 {
     if ([event type] == NSApplicationDefined
             && TS_EQUAL([event timestamp], dummyEventTimestamp)
-            && [event subtype] == NativeSyncQueueEvent) {
+            && (short)[event subtype] == NativeSyncQueueEvent
+            && [event data1] == NativeSyncQueueEvent
+            && [event data2] == NativeSyncQueueEvent) {
         [seenDummyEventLock lockWhenCondition:NO];
         [seenDummyEventLock unlockWithCondition:YES];
-
-    } else if ([event type] == NSApplicationDefined && [event subtype] == ExecuteBlockEvent) {
+    } else if ([event type] == NSApplicationDefined
+               && (short)[event subtype] == ExecuteBlockEvent
+               && [event data1] != 0 && [event data2] == ExecuteBlockEvent) {
         void (^block)() = (void (^)()) [event data1];
         block();
         [block release];
@@ -420,7 +423,7 @@
                                          context: nil
                                          subtype: ExecuteBlockEvent
                                            data1: encode
-                                           data2: 0];
+                                           data2: ExecuteBlockEvent];
 
     [NSApp postEvent: event atStart: NO];
     [pool drain];
@@ -438,8 +441,8 @@
                                     windowNumber: 0
                                          context: nil
                                          subtype: NativeSyncQueueEvent
-                                           data1: 0
-                                           data2: 0];
+                                           data1: NativeSyncQueueEvent
+                                           data2: NativeSyncQueueEvent];
     if (useCocoa) {
         [NSApp postEvent:event atStart:NO];
     } else {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/awt/FileDialog/MacOSGoToFolderCrash.java	Wed Dec 11 14:30:45 2019 -0800
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.EventQueue;
+import java.awt.FileDialog;
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+
+/**
+ * @test
+ * @key headful
+ * @bug 8234522
+ * @requires (os.family == "mac")
+ * @summary no crash should occur when the "Go To Folder" feature is used on
+ *          macOS in the native FileDialog
+ */
+public final class MacOSGoToFolderCrash {
+
+    public static void main(final String[] args) throws Exception {
+        EventQueue.invokeLater(() -> {
+            FileDialog fd = new FileDialog((Frame) null);
+            fd.setVisible(true);
+        });
+        Robot robot = new Robot();
+        robot.setAutoDelay(400);
+        robot.waitForIdle();
+        // "⌘+Shift+G" – Open "Go To Folder" window
+        robot.keyPress(KeyEvent.VK_META);
+        robot.keyPress(KeyEvent.VK_SHIFT);
+        robot.keyPress(KeyEvent.VK_G);
+        robot.keyRelease(KeyEvent.VK_G);
+        robot.keyRelease(KeyEvent.VK_SHIFT);
+        robot.keyRelease(KeyEvent.VK_META);
+        // Select something
+        robot.keyPress(KeyEvent.VK_DOWN);
+        robot.keyRelease(KeyEvent.VK_DOWN);
+        robot.keyPress(KeyEvent.VK_ENTER);
+        robot.keyRelease(KeyEvent.VK_ENTER);
+        // Close File dialog
+        robot.keyPress(KeyEvent.VK_ESCAPE);
+        robot.keyRelease(KeyEvent.VK_ESCAPE);
+    }
+}