1 /*
2  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25   @test
26   @key headful
27   @bug 6480024
28   @library ../../../regtesthelpers
29   @build Util Sysout AbstractTest
30   @summary stack overflow on mouse wheel rotation
31   @author Andrei Dmitriev: area=awt.event
32   @run main InfiniteRecursion
33 */
34 
35 /**
36  * InfiniteRecursion.java
37  *
38  * summary: put a JButton into JFrame.
39  * Add MouseWheelListener to JFrame.
40  * Add MouseListener to JButton.
41  * Rotating a wheel over the JButton would result in stack overflow.
42  */
43 
44 import java.awt.*;
45 import java.awt.event.*;
46 import javax.swing.*;
47 import test.java.awt.regtesthelpers.Util;
48 import test.java.awt.regtesthelpers.AbstractTest;
49 import test.java.awt.regtesthelpers.Sysout;
50 
51 public class InfiniteRecursion {
52     final static Robot robot = Util.createRobot();
53     final static int MOVE_COUNT = 5;
54 
55     //*2 for both rotation directions,
56     //*2 as Java sends the wheel event to every for nested component in hierarchy under cursor
57     final static int EXPECTED_COUNT = MOVE_COUNT * 2 * 2;
58 
59     static int actualEvents = 0;
60 
main(String []s)61     public static void main(String []s)
62     {
63         JFrame frame = new JFrame("A test frame");
64         frame.setSize(200, 200);
65         frame.addMouseWheelListener(new MouseWheelListener() {
66                 public void mouseWheelMoved(MouseWheelEvent e) {
67                     System.out.println("Wheel moved on FRAME : "+e);
68                     actualEvents++;
69                 }
70             });
71 
72         JButton jButton = new JButton();
73         /*
74           outputBox.addMouseWheelListener(new MouseWheelListener() {
75           public void mouseWheelMoved(MouseWheelEvent e){}
76           });
77         */
78         jButton.addMouseListener(new MouseAdapter() {
79                 public void mousePressed(MouseEvent e) {
80                     System.out.println("MousePressed on jButton : "+e);
81                 }
82 
83             });
84         frame.add(jButton);
85 
86         frame.setVisible(true);
87 
88         Util.waitForIdle(robot);
89 
90         Util.pointOnComp(jButton, robot);
91         Util.waitForIdle(robot);
92 
93         for (int i = 0; i < MOVE_COUNT; i++){
94             robot.mouseWheel(1);
95             robot.delay(10);
96         }
97 
98         for (int i = 0; i < MOVE_COUNT; i++){
99             robot.mouseWheel(-1);
100             robot.delay(10);
101         }
102 
103 
104         Util.waitForIdle(robot);
105         //Not fair to check for multiplier 4 as it's not specified actual number of WheelEvents
106         //result in a single wheel rotation.
107         if (actualEvents != EXPECTED_COUNT) {
108             AbstractTest.fail("Expected events count: "+ EXPECTED_COUNT+" Actual events count: "+ actualEvents);
109         }
110     }
111 }
112