<AWT Dev> [9] Review Request for JDK-8024061: Exception thrown when drag and drop between two components is executed quickly
Alexey Ivanov
alexey.ivanov at oracle.com
Mon Apr 21 10:57:34 UTC 2014
Hi Sergey,
Thank you for your review.
Regards,
Alexey.
On 17.04.2014 19:22, Sergey Bylokhov wrote:
> Hi, Alexey.
> The fix looks good.
>
> On 4/15/14 3:13 PM, Petr Pchelko wrote:
>> 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
>> <alexey.ivanov at oracle.com> написал(а):
>>
>>> 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
>>>> <alexey.ivanov at oracle.com> написал(а):
>>>>
>>>>> 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
>>>>>> <alexey.ivanov at oracle.com> написал(а):
>>>>>>
>>>>>>> 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.
>
>
More information about the awt-dev
mailing list