<Swing Dev> DnD fails with JTextArea and JTextField

Artem Ananiev artem.ananiev at oracle.com
Thu Sep 29 15:55:36 UTC 2011


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>>
>
>
>     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>
>         <mailto:pavel.porvatov at oracle.__com
>         <mailto: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>
>             <mailto:pavel.porvatov at oracle.__com
>             <mailto: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>
>                 <mailto:pavel.porvatov at oracle.__com
>                 <mailto: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>
>                     <mailto:pavel.porvatov at oracle.__com
>                     <mailto: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>
>                         <mailto:pavel.porvatov at oracle.__com
>                         <mailto: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>
>                             <mailto:pavel.porvatov at oracle.__com
>                             <mailto: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>
>
>                                                     Regards, Pavel
>
>
>                                                         2011/5/27 Pavel
>                                 Porvatov
>                                 <pavel.porvatov at oracle.com
>                                 <mailto:pavel.porvatov at oracle.com>
>                                 <mailto:pavel.porvatov at oracle.__com
>                                 <mailto: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/>
>
>                                                             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
>



More information about the swing-dev mailing list