<Swing Dev> DnD fails with JTextArea and JTextField
Sean Chou
zhouyx at linux.vnet.ibm.com
Mon Oct 10 07:35:22 UTC 2011
Hi Pavel, Artem,
I run jtreg on another machine and it passes. The attachment is the
testcase and patch.
The following modification to testcase are done as suggested last time:
1. Copyright in agreed form (the ibm info)
2. Date in copyright
3. All swing code in EDT
4. Use realSync()
Please have a look, thanks.
On Thu, Sep 29, 2011 at 11:55 PM, Artem Ananiev <artem.ananiev at oracle.com>wrote:
>
> On 9/28/2011 9:48 PM, Sean Chou wrote:
>
>> Hi Artem,
>>
>> I can not validate the testcase after I changed to use realSynch,
>> it always fails with throwing an exception.
>> Testcase test\javax\swing\JSlider\**6848475\bug6848475.java fails on
>> my machine with timeoutexception as
>> well.
>> I run the test in its directory with command like this:
>> jtreg -verbose:all -testjdk:...j2sdk/ bug6848475.java
>>
>
> It may be a bug with realSync() implementation, possibly related to
>
> 6421984: realSync throws InfiniteLoop some times.
>
> Thanks,
>
> Artem
>
> 2011/9/28 Artem Ananiev <artem.ananiev at oracle.com
>> <mailto:artem.ananiev at oracle.**com <artem.ananiev at oracle.com>>>
>>
>>
>>
>> On 9/27/2011 5:19 AM, Sean Chou wrote:
>>
>> Hi Pavel,
>>
>> Is toolkit.realSync() doing the job of "sleep 10s and throw an
>> timeout exception" ?
>>
>>
>> Definitely, not. SunToolkit.realSync() is what Robot.waitForIdle()
>> was initially supposed to be: this call should wait until all the
>> pending events (native, Java) to be processed. Sometimes, however,
>> it fails to do so, e.g. when native events are turned into Java
>> events, and Java event handlers call more native methods - then the
>> TimeoutException is thrown.
>>
>> Thanks,
>>
>> Artem
>>
>> I found the main thread exit after realSynch is invoked. Should
>> I catch
>> that exception?
>> bug6848475.java seems not catching it.
>>
>>
>> 2011/9/26 Pavel Porvatov <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com <pavel.porvatov at oracle.com>>
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com <pavel.porvatov at oracle.com>>>>
>>
>> __
>>
>> Hi Sean,
>>
>> Hi Pavel,
>>
>> Thanks for new comments. I was looking
>> at test\javax\swing\JTextArea\__**6940863
>>
>> and copied the copyright from there, and just put the
>> initialization part of the swing
>> code into EDT. I didn't find realSynch in Toolkit class
>> so used
>> synch. I'll modify
>> that.
>>
>> The realSync is a SunToolkit method.
>>
>> About the first comment, do you mean to put the
>> testcase and
>> the fix together
>> in a webrev ?
>>
>> Yep! It's hard to reconstruct fix from different mails.
>> Don't forget
>> to select an appropriate folder for the test...
>>
>> Thanks, Pavel
>>
>>
>> 2011/9/26 Pavel Porvatov <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >>>
>>
>>
>> Hi Sean,
>>
>> Hi Pavel,
>>
>> Thanks for the comments. I modified the
>> testcase
>> according to the comments,
>> please have a look at it again.
>> I tried to run with jtreg and it runs well.
>>
>> Looks much better. Still have several comments:
>>
>> 1. Could you please sent complete fix as a webrev,
>> but not
>> parts of the fix as a single file?
>>
>> 2. Date of copyright...
>>
>> 3. You are still using Swing components on non-EDT
>> thread. As
>> I wrote before take a look at the
>> test\javax\swing\JSlider\__**6848475\bug6848475.java
>>
>> test...
>>
>> 4. Use toolkit.realSync() instead of toolkit.sync().
>> BTW: as
>> described in javadoc realSync cannot be invoked on
>> the EDT
>> thread...
>>
>> Regards, Pavel
>>
>> P.S. Sorry for my stubborn =) But on some machines not
>> accurate tests actually fail (e.g. on Solaris).
>> Therefore
>> later we must fix tests and that's a really boring
>> task...
>>
>>
>>
>> 2011/9/20 Pavel Porvatov
>> <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >>>
>>
>>
>> Hi Sean,
>>
>> The have several comments :
>>
>> 1. Could you please read
>> http://openjdk.java.net/jtreg/
>> is it possible run your test via jtreg?
>>
>> 2. There is no copyright in the begin of test
>>
>> 3. There are no jtreg tags
>>
>> 4. All Swing code must be initialized on the
>> EDT thread
>>
>> 5. Keep test minimal as possible, please. It
>> helps other
>> people to understand your code.... E.g.
>> there is no need
>> to create JButton with listener.
>>
>> 6. Note that the "frame.setVisible(true)"
>> doesn't
>> guarantee that after that line Frame is
>> visible, you
>> should use toolkit.realSync() here
>>
>> 7. No TODO, please
>>
>> 8. Are you sure your test should pass if
>> exceptions
>> occurs (see your catch blocks)
>>
>> Please take a look at other tests and use
>> them as a good
>> examples....
>>
>> Regards, Pavel
>>
>>
>> Hi Pavel,
>>
>> I wrote a test case for the behavior
>> of DefaultCaret.
>> Please take a look, it is
>> attached.
>>
>>
>>
>> 2011/9/15 Pavel Porvatov
>> <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >>>
>>
>>
>> Hi Sean,
>>
>> Hi Pavel,
>>
>> I'm comfortable with moving
>> the checking into
>>
>> DefaultCaret#__**updateSystemSelection method.
>>
>> About regression test, I'm
>> not sure how to
>> write, because it contains user
>> operation. Can you
>> give me a similar test so I can
>> write one for this bug?
>>
>> Yes, you can find a lot examples in the
>> test/javax/swing directory by word
>> Robot, e.g.
>>
>> test\javax\swing\JSlider\__**
>> 6848475\bug6848475.java.
>>
>> One hint: use reflection ONLY if
>> there are no
>> another ways to write a test...
>>
>> Regards, Pavel
>>
>>
>> 2011/9/13 Pavel Porvatov
>> <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >>>
>>
>>
>> Hi Sean,
>>
>> Hi Pavel ,
>>
>> I'm sorry I didn't
>> make update for this
>> bug for a long time, and
>> here is some
>> recent investigation.
>> The scenario is as follows:
>>
>> Suppose we are dragging
>> "abcde" over TextField
>> tf, which have "hello
>> dragging" as
>> its content. When we are
>> dragging from start
>> to end, there is a
>> cursor moving from
>> "h" to "g", which means the place to insert
>> "abcde" if we drop it.
>> When we dragging "abcde"
>> exit tf, there will
>> be a dragExit event, the
>> tf needs to
>> restore its original
>> status after we drag out.
>> Eg. if its cursor is
>> between "h" and
>> "e" in "hello", which appears like "h|ello",
>> when we are dragging
>> over it, it may like
>> "hello dr|agging", and when drag exit, it
>> needs to be "h|ello" again.
>> So in dragExit handler,
>> it calls
>>
>> javax.swing.TransferHandler.__**cleanup(false),
>> which
>>
>> means only to restore
>> the original state.
>> cleanup calls
>>
>> javax.swing.text.__**JTextComponent.setDropLocation
>> to
>>
>> set the cursor to original
>> position. And
>> setDropLocation calls
>> DefaultCaret.setDot and
>> DefaultCaret.moveDot
>> to set the state.
>> The problem is moveDot
>> doesn't know this is
>> just to restore the
>> original state,
>> it treats the invocation
>> as an action to
>> select something. And it
>> calls updateSystemSelection
>> which will
>> call
>> java.awt.datatransfer.__**
>> Clipboard.setContent.
>>
>> And the selected content
>> is changed from "abcde"
>> to the original
>> selected part of "hello
>> dragging", then
>> the drop operation finds
>> it is not the string
>> dragged and nothing is
>> dropped.
>>
>> So I made a simple
>> patch(attached) . It just
>> check if the textField
>> owns focus
>> before
>> updateSystemSelection, if it is not
>> focused, it does not
>> treat the moveDot as
>> a selection action and
>> does not
>> call
>> Clipboard.setContent. This works on Linux,
>> however, DefaultCaret is
>> shared by Linux and
>> Windows while windows
>> doesn't have
>> this problem. So I don't
>> think this is a
>> correct patch, but it
>> brings my question.
>>
>> I think it is strange
>> for DefaultCaret to use
>> setDot and moveDot to
>> restore
>> original state,
>> especially moveDot will cause
>> an updateSystemSelection
>> operation,
>> which makes moveDot much
>> like an action from
>> user instead of just
>> restoring state.
>>
>> I'm not sure why it
>> works well on windows, but
>> I don't think it is
>> right to call
>> updateSystemSelection or
>> it is not right to
>> use setDot and moveDot
>> to restore
>> the original state. Is
>> there any reason for that ?
>>
>> Thanks for the patch! I
>> believe you are right
>> and we shouldn't update
>> system selection
>> clipboard when the component
>> doesn't have
>> focus. I'd like to modify
>> your fix and move
>> checking into the
>>
>> DefaultCaret#__**updateSystemSelection method:
>>
>> if (this.dot != this.mark
>> && component !=
>> null && component.hasFocus()) {
>>
>> We also must write
>> regression tests for fixes
>> if possible, so an automatic
>> test is needed as
>> well. Could you please write
>> a test for the fix?
>>
>>
>> > I'm not sure why it works well on windows,
>> That's because Windows
>> doesn't have system
>> selection clipboard...
>>
>>
>> > Is there any reason for that ?
>> No, that's a just bug...
>>
>> Regards, Pavel
>>
>>
>> 2011/6/6 Pavel Porvatov
>> <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >>>
>>
>>
>> Hi Sean,
>>
>> Hi,
>>
>> I reported, but
>> the system doesn't reply
>> me a bug number.
>> It says "will give me
>> email",
>> but I haven't
>> got one yet. Is this the
>> right process,
>> or I might make a problem
>> when
>> reporting?
>>
>> I don't know why the
>> system didn't report
>> bug ID, but your bug
>> was filed
>> successfully. You
>> can find it here:
>> http://bugs.sun.com/__**
>> bugdatabase/view_bug.do?bug___**id=7049024<http://bugs.sun.com/__bugdatabase/view_bug.do?bug___id=7049024>
>>
>> <http://bugs.sun.com/**
>> bugdatabase/view_bug.do?bug_**id=7049024<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7049024>
>> >
>>
>> Regards, Pavel
>>
>>
>> 2011/5/27 Pavel
>> Porvatov
>> <pavel.porvatov at oracle.com
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >
>> <mailto:pavel.porvatov at oracle.**__com
>>
>> <mailto:pavel.porvatov at oracle.**com<pavel.porvatov at oracle.com>
>> >>>
>>
>>
>> Hi Sean,
>>
>> Hi all,
>>
>> I
>> have a testcase related to DnD
>> failure
>> with JTextArea and
>>
>> JTextField on linux. The
>> testcase
>> is as follows:
>>
>> /*
>> *
>> DnDTest.java
>> */
>> import
>> java.awt.Color;
>> import
>> java.awt.Component;
>> import
>> java.awt.Dimension;
>> import
>> java.awt.FlowLayout;
>> import
>> java.awt.Frame;
>> import
>> java.awt.event.WindowAdapter;
>> import
>> java.awt.event.WindowEvent;
>>
>> import
>> javax.swing.JTextArea;
>> import
>> javax.swing.JTextField;
>>
>>
>> public
>> class DnDTest extends Frame {
>> Component
>> c;
>> public
>> DnDTest() {
>>
>> super("Single Frame --- AWT Frame");
>>
>> super.setBackground(Color.__**gray);
>>
>> // set
>> layout here.
>>
>> setLayout(new FlowLayout());
>> c = new
>> JTextArea("JTextArea
>>
>> component");
>>
>> c.setPreferredSize(new
>>
>> Dimension(400, 100));
>> add(c);
>> c = new
>> JTextField("JTextField
>>
>> component(No IM)");
>>
>> c.setPreferredSize(new
>>
>> Dimension(400, 20));
>> add(c);
>>
>> addWindowListener(new
>> WindowAdapter() {
>> public void
>>
>> windowClosing(WindowEvent event) {
>>
>> System.exit(0);
>> }
>> });
>>
>> setSize(850, 360);
>>
>> setVisible(true);
>> }
>> public
>> static void main(String[] args) {
>> new
>> DnDTest();
>> }
>> }
>>
>>
>>
>> Reproduce steps:
>> 1. Run
>> the testcase with b143
>> 2. Open
>> a new file with gedit and
>> input
>> some words like "abcde"
>> 3. Drag
>> "abcde" into JTextField and
>> drop it
>> there.
>> 4. Once
>> more, drag "abcde" into
>>
>> JTextField and then move out of the
>> Frame
>> (keep draging) and drag
>> into
>> JTextField again and drop it.
>>
>>
>> Expectation:
>> The
>> second DnD inputs another
>> "abcde" into JTextField.
>>
>> Result:
>> The
>> second DnD inputs nothing
>> into
>> JTextField.
>>
>> Yes, looks
>> like a bug. The test case
>> works on
>> Windows as expected.
>>
>>
>>
>> Investigation:
>> The
>> JTextArea as well has this
>> problem,
>> and in step 4, if we drag
>> "abcde" over JTextField and then
>> drop
>> into JTextArea, nothing
>> is input
>> into JTextArea either.
>> However,
>> if "abcde" is drag
>> into
>> JTextField or JTextArea
>> directly
>> or when JTextArea/Field are
>> empty as
>> in step 2, it works.
>>
>>
>> Are
>> there any comments? And can
>> anyone
>> file a bug for it please ?
>>
>> Anybody can
>> file a bug,
>> http://bugreport.sun.com/__**bugreport/<http://bugreport.sun.com/__bugreport/>
>>
>> <http://bugreport.sun.com/**bugreport/<http://bugreport.sun.com/bugreport/>
>> >
>>
>> Regards, Pavel
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
>>
>>
>> --
>> Best Regards,
>> Sean Chou
>>
>>
--
Best Regards,
Sean Chou
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20111010/796b3858/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: webrev.7049024.zip
Type: application/zip
Size: 151351 bytes
Desc: not available
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20111010/796b3858/webrev.7049024.zip>
More information about the swing-dev
mailing list