JDK-6953059 : Drag and drop regression bug in applets using 1.6.0_20
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 6u20
  • Priority: P1
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2010-05-17
  • Updated: 2011-02-16
  • Resolved: 2010-05-17
Related Reports
Duplicate :  
Description
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.