Hello, Alexey.

I’m fine with your fix.

Thank you for filing a new bug for JDK 9.

With best regards. Petr.

15 апр. 2014 г., в 3:02 после полудня, Alexey Ivanov <[email protected]> 
написал(а):

> Hi Petr,
> 
> Please look at the updated webrev with comment explaining why additional 'if' 
> clause is added:
> http://cr.openjdk.java.net/~dmarkov/8024061/jdk9/webrev.01/
> 
> I have submitted a new bug JDK-8040248:
> "Drag and drop between two components fails if performed quickly"
> https://bugs.openjdk.java.net/browse/JDK-8040248
> 
> Regards,
> Alexey.
> 
> On 10.04.2014 18:31, Petr Pchelko wrote:
>> Hello, Alexey.
>> 
>> Thank you for the clarification.
>> 
>>> What actually happens is that native drag-and-drop operation completed 
>>> already whereas this drag-and-drop operation on EDT didn't even started 
>>> yet. Does throwing InvalidDnDOperationException look more appropriate than 
>>> returning null in this case?
>> No, I think it’s not good. As a workaround it’s better to not return the 
>> data than to throw an exception. It would be really hard for the users to 
>> deal with such an exception.
>> 
>> Please add some comment to the if clause to clarify what’s happening.
>> Otherwise the fix looks good to me.
>> 
>> With best regards. Petr.
>> 
>> 10 апр. 2014 г., в 5:39 после полудня, Alexey Ivanov 
>> <[email protected]> написал(а):
>> 
>>> Hi Petr,
>>> 
>>> If the requested data flavor is DataFlavor.javaJVMLocalObjectMimeType, then 
>>> transferable is local to the JVM. It is stored to a static variable in 
>>> SunDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(). When 
>>> processEnterMessage() is handled, its value is copied to instance variable 
>>> "local". The instance variable is cleaned by processExitMessage(), the 
>>> static variable is cleared by SunDragSourceContextPeer.cleanup().
>>> 
>>> If drag-and-drop operation is performed quickly, 
>>> SunDragSourceContextPeer.cleanup() is called when mouse button is released 
>>> and *before* processEnterMessage() is called. So when EDT finally handles 
>>> MOUSE_ENTERED event and DropTargetListener.dragEnter() gets called, "local" 
>>> transferable is already null. The listener tries to get the data from the 
>>> transferable:
>>> DropTargetDragEvent.getTransferable(), and then
>>> Transferable.getTransferData(dataFlavor).
>>> 
>>> The dataFlavor has MIME type of DataFlavor.javaJVMLocalObjectMimeType, and 
>>> SunDropTargetContextPeer.currentJVMLocalSourceTransferable is already 
>>> cleared. The representationClass field of the DataFlavor object is set to 
>>> java.io.InputStream.class. So when SunDropTargetContextPeer.getNativeData() 
>>> executes it tries to cast the data object to java.io.InputStream to 
>>> deserialize the data but fails with the exception:
>>> java.lang.ClassCastException: DnD$DropObject cannot be cast to 
>>> java.io.InputStream.
>>> 
>>> This exception is caught internally, and IOException is thrown as it failed 
>>> to get the data. At the same time, no IO should have occurred because a 
>>> local source was dragged, so this exception is rather unexpected.
>>> 
>>> 
>>> What actually happens is that native drag-and-drop operation completed 
>>> already whereas this drag-and-drop operation on EDT didn't even started 
>>> yet. Does throwing InvalidDnDOperationException look more appropriate than 
>>> returning null in this case?
>>> 
>>> 
>>> Sure, I'll submit a new bug for 9 to implement the proper fix.
>>> 
>>> 
>>> Regards,
>>> Alexey.
>>> 
>>> On 10.04.2014 12:52, Petr Pchelko wrote:
>>>> Hello, Dmitry.
>>>> 
>>>> Thank you for the detailed explanation of the issue.
>>>> 
>>>> I’m OK with this workaround as this should be back ported to 8u and 7u, 
>>>> but I think we could try to provide a real fix in 9.
>>>> Could you please add some comment which shortly explains why the if clause 
>>>> was added?
>>>> And could you also file a new bug for 9 so that we try to replace the 
>>>> workaround with a real fix?
>>>> 
>>>> Thank you.
>>>> With best regards. Petr.
>>>> 
>>>> 10 апр. 2014 г., в 12:18 после полудня, Alexey Ivanov 
>>>> <[email protected]> написал(а):
>>>> 
>>>>> Hello AWT team,
>>>>> 
>>>>> Could you please review the fix for jdk9:
>>>>>    bug: https://bugs.openjdk.java.net/browse/JDK-8024061
>>>>>    webrev: http://cr.openjdk.java.net/~dmarkov/8024061/jdk9/webrev.00/
>>>>> 
>>>>> Problem description:
>>>>> Dragging and dropping an object from one panel to another very quickly 
>>>>> causes an exception.
>>>>> 
>>>>> Fix:
>>>>> The fix addresses only the thrown exception.
>>>>> The dragged object would not be moved.
>>>>> 
>>>>> 
>>>>> Thanks,
>>>>> Alexey.
> 

Reply via email to