changeset 7380:5657e6e7bca1

8041990: [macosx] Language specific keys does not work in applets when opened outside the browser Reviewed-by: alexsch, serb
author dmarkov
date Wed, 06 Aug 2014 12:42:25 +0400
parents 5bccbd93b577
children 17055bf10cbf
files src/share/classes/java/awt/EventQueue.java src/share/classes/java/awt/event/InputMethodEvent.java src/share/classes/sun/awt/AWTAccessor.java test/java/awt/im/8041990/bug8041990.java
diffstat 4 files changed, 160 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/awt/EventQueue.java	Wed Jul 30 05:09:27 2014 -0700
+++ b/src/share/classes/java/awt/EventQueue.java	Wed Aug 06 12:42:25 2014 +0400
@@ -209,6 +209,11 @@
                 {
                     EventQueue.invokeAndWait(source, r);
                 }
+
+                @Override
+                public long getMostRecentEventTime(EventQueue eventQueue) {
+                    return eventQueue.getMostRecentEventTimeImpl();
+                }
             });
     }
 
--- a/src/share/classes/java/awt/event/InputMethodEvent.java	Wed Jul 30 05:09:27 2014 -0700
+++ b/src/share/classes/java/awt/event/InputMethodEvent.java	Wed Aug 06 12:42:25 2014 +0400
@@ -25,6 +25,10 @@
 
 package java.awt.event;
 
+import sun.awt.AWTAccessor;
+import sun.awt.AppContext;
+import sun.awt.SunToolkit;
+
 import java.awt.AWTEvent;
 import java.awt.Component;
 import java.awt.EventQueue;
@@ -217,8 +221,10 @@
     public InputMethodEvent(Component source, int id,
             AttributedCharacterIterator text, int committedCharacterCount,
             TextHitInfo caret, TextHitInfo visiblePosition) {
-        this(source, id, EventQueue.getMostRecentEventTime(), text,
-             committedCharacterCount, caret, visiblePosition);
+        this(source, id,
+                getMostRecentEventTimeForSource(source),
+                text, committedCharacterCount,
+                caret, visiblePosition);
     }
 
     /**
@@ -258,8 +264,9 @@
      */
     public InputMethodEvent(Component source, int id, TextHitInfo caret,
             TextHitInfo visiblePosition) {
-        this(source, id, EventQueue.getMostRecentEventTime(), null,
-             0, caret, visiblePosition);
+        this(source, id,
+                getMostRecentEventTimeForSource(source),
+                null, 0, caret, visiblePosition);
     }
 
     /**
@@ -410,7 +417,25 @@
     private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException {
         s.defaultReadObject();
         if (when == 0) {
-            when = EventQueue.getMostRecentEventTime();
+            when = getMostRecentEventTimeForSource(this.source);
         }
     }
+
+    /**
+     * Get the most recent event time in the {@code EventQueue} which the {@code source}
+     * belongs to.
+     *
+     * @param source the source of the event
+     * @exception  IllegalArgumentException  if source is null.
+     * @return most recent event time in the {@code EventQueue}
+     */
+    private static long getMostRecentEventTimeForSource(Object source) {
+        if (source == null) {
+            // throw the IllegalArgumentException to conform to EventObject spec
+            throw new IllegalArgumentException("null source");
+        }
+        AppContext appContext = SunToolkit.targetToAppContext(source);
+        EventQueue eventQueue = SunToolkit.getSystemEventQueueImplPP(appContext);
+        return AWTAccessor.getEventQueueAccessor().getMostRecentEventTime(eventQueue);
+    }
 }
--- a/src/share/classes/sun/awt/AWTAccessor.java	Wed Jul 30 05:09:27 2014 -0700
+++ b/src/share/classes/sun/awt/AWTAccessor.java	Wed Aug 06 12:42:25 2014 +0400
@@ -492,6 +492,11 @@
          */
         void invokeAndWait(Object source, Runnable r)
             throws InterruptedException, InvocationTargetException;
+
+        /**
+         * Gets most recent event time in the EventQueue
+         */
+        long getMostRecentEventTime(EventQueue eventQueue);
     }
 
     /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/java/awt/im/8041990/bug8041990.java	Wed Aug 06 12:42:25 2014 +0400
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2014, 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.
+ */
+
+
+/*
+  @test
+  @bug 8041990
+  @summary Language specific keys does not work in applets when opened outside the browser
+  @author Petr Pchelko
+*/
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.InputMethodEvent;
+import java.awt.font.TextHitInfo;
+import java.text.AttributedString;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class bug8041990 {
+    private static JFrame frame;
+    private static JComponent component;
+
+    public static void main(String[] args) throws Exception {
+        ThreadGroup stubTG = new ThreadGroup(getRootThreadGroup(), "Stub Thread Group");
+        ThreadGroup swingTG = new ThreadGroup(getRootThreadGroup(), "SwingTG");
+        try {
+            Thread stubThread = new Thread(stubTG, new Runnable() {
+                public void run() {
+                    SunToolkit.createNewAppContext();
+                }
+            });
+            stubThread.start();
+            stubThread.join();
+
+            final CountDownLatch startSwingLatch = new CountDownLatch(1);
+            new Thread(swingTG, new Runnable() {
+                public void run() {
+                    SunToolkit.createNewAppContext();
+                    SwingUtilities.invokeLater(new Runnable() {
+                        public void run() {
+                            frame = new JFrame();
+                            component = new JLabel("Test Text");
+                            frame.add(component);
+                            frame.setBounds(100, 100, 100, 100);
+                            frame.setVisible(true);
+                            startSwingLatch.countDown();
+                        }
+                    });
+                }
+            }).start();
+            startSwingLatch.await();
+
+            final AtomicReference<Exception> caughtException = new AtomicReference<>();
+            Thread checkThread = new Thread(getRootThreadGroup(), new Runnable() {
+                public void run() {
+                    try {
+                        // If the bug is present this will throw exception
+                        new InputMethodEvent(component,
+                                InputMethodEvent.CARET_POSITION_CHANGED,
+                                TextHitInfo.leading(0),
+                                TextHitInfo.trailing(0));
+                    } catch (Exception e) {
+                        caughtException.set(e);
+                    }
+                }
+            });
+            checkThread.start();
+            checkThread.join();
+
+            if (caughtException.get() != null) {
+                throw new RuntimeException("Failed. Caught exception!", caughtException.get());
+            }
+        } finally {
+            new Thread(swingTG, new Runnable() {
+                public void run() {
+                    SwingUtilities.invokeLater(new Runnable() {
+                        public void run() {
+                            if (frame != null) {
+                                frame.dispose();
+                            }
+                        }
+                    });
+                }
+            }).start();
+        }
+    }
+
+    private static ThreadGroup getRootThreadGroup() {
+        ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
+        ThreadGroup parentTG = currentTG.getParent();
+        while (parentTG != null) {
+            currentTG = parentTG;
+            parentTG = currentTG.getParent();
+        }
+        return currentTG;
+    }
+}