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

Drag and drop regression bug in applets using 1.6.0_20

    • Icon: Bug Bug
    • Resolution: Duplicate
    • Icon: P1 P1
    • None
    • 6u20
    • client-libs

      FULL PRODUCT VERSION :
      java version "1.6.0_20"
      Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
      Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows XP [Version 5.1.2600]

      A DESCRIPTION OF THE PROBLEM :
      Drag and drop used from an unsigned applet fails under Java 6 update 20. The drop handler throws (java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)) on any attempt to call Transferable.getTransferData. Copy-paste works correctly, but a mouse-initiated drag (e.g. list, tree, etc) does not function correctly. This issue occurs under Windows XP, Vista, 7, and likely all other platforms (possibly part of a recent security patch in the plugin or JRE). This issue occurs only when using 1.6.0_20 and worked correctly under 1.6.0_19. The issue does not seem bound to a specific component type as components such as JTree, JList, etc, all will expose the incorrect behavior when they are the drag source.


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Create a simple drag source and drop target (e.g. list -> textbox) and create simple handlers. Enable dragging from the source. Implement a drop handler that accesses the Transferable and attempts to get the data using a valid flavor. Place these graphical components into an applet and host the applet via HTML as an unsigned applet.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      The drop succeeds, running any code after the call to Transferable.getTransferData.
      ACTUAL -
      The call to Transferable.getTransferData throws java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard).

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Exception in thread "AWT-EventQueue-2" java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)
      at java.security.AccessControlContext.checkPermission(Unknown Source)
      at java.security.AccessController.checkPermission(Unknown Source)
      at java.lang.SecurityManager.checkPermission(Unknown Source)
      at java.lang.SecurityManager.checkSystemClipboardAccess(Unknown Source)
      at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(Unknown Source)
      at sun.awt.datatransfer.TransferableProxy.getTransferData(Unknown Source)
      at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(Unknown Source)
      at com.AppletPie$1$2.importData(AppletPie.java:47)
      at javax.swing.TransferHandler$DropHandler.drop(Unknown Source)
      at java.awt.dnd.DropTarget.drop(Unknown Source)
      at javax.swing.TransferHandler$SwingDropTarget.drop(Unknown Source)
      at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(Unknown Source)
      at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(Unknown Source)
      at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(Unknown Source)
      at sun.awt.dnd.SunDropTargetEvent.dispatch(Unknown Source)
      at java.awt.Component.dispatchEventImpl(Unknown Source)
      at java.awt.Container.dispatchEventImpl(Unknown Source)
      at java.awt.Component.dispatchEvent(Unknown Source)
      at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
      at java.awt.LightweightDispatcher.processDropTargetEvent(Unknown Source)
      at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
      at java.awt.Container.dispatchEventImpl(Unknown Source)
      at java.awt.Component.dispatchEvent(Unknown Source)
      at java.awt.EventQueue.dispatchEvent(Unknown Source)
      at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
      at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
      at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
      at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
      at java.awt.EventDispatchThread.run(Unknown Source)


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.awt.Container;
      import java.awt.GridLayout;
      import java.awt.datatransfer.*;

      import javax.swing.*;
      import javax.swing.TransferHandler;
      import javax.swing.TransferHandler.TransferSupport;

      public class AppletPie
         extends JApplet
      {
         public void init() {
            Runnable runnable = new Runnable()
            {
               public void run() {
                  Container cp = getContentPane();
                  cp.setLayout(new GridLayout(1, 2));

                  // source of drag irrelevant
                  final JList list = new JList(new String[] {"one", "two", "three"});
                  cp.add(new JScrollPane(list));
                  list.setDragEnabled(true);

                  final JTextArea textArea = new JTextArea("Some text");
                  cp.add(new JScrollPane(textArea));

                  list.setTransferHandler(new TransferHandler()
                  {
                     protected Transferable createTransferable(JComponent c) {
                        // other drag sources cause same issue
                        return new StringSelection(String.valueOf(list.getSelectedValue()));
                     }
                     public int getSourceActions(JComponent c) {
                        return COPY;
                     }
                  });
                  textArea.setTransferHandler(new TransferHandler()
                  {
                     public boolean canImport(TransferSupport support) {
                        return support.isDataFlavorSupported(DataFlavor.stringFlavor);
                     }
                     public boolean importData(TransferSupport support) {
                        try {
                           // java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)
                           String path = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
                           textArea.setText(String.valueOf(path));
                           return true;
                        } catch (Exception ex) {
                           ex.printStackTrace();
                        }
                        return false;
                     }
                  });
               }
            };
            if (SwingUtilities.isEventDispatchThread()) {
               runnable.run();
            } else {
               try {
                  SwingUtilities.invokeAndWait(runnable);
               } catch (Exception ex) {
                  ex.printStackTrace();
               }
            }
         }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Add permission to policy file: permission java.awt.AWTPermission "accessClipboard";
      This is not a good workaround as it opens a security hole.

      Release Regression From : 6u19
      The above release value was the last known release where this
      bug was not reproducible. Since then there has been a regression.

            Unassigned Unassigned
            ndcosta Nelson Dcosta (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: