<Swing Dev> DnD fails with JTextArea and JTextField

Sean Chou zhouyx at linux.vnet.ibm.com
Mon Oct 10 07:38:29 UTC 2011


Hi,

    One more: I put the testcase under javax/swing/JTextArea because the bug
is filed toward it.

On Mon, Oct 10, 2011 at 3:35 PM, Sean Chou <zhouyx at linux.vnet.ibm.com>wrote:

> 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
>
>


-- 
Best Regards,
Sean Chou
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20111010/837ff5d0/attachment.html>


More information about the swing-dev mailing list