<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