Skip to content

Commit 853ac78

Browse files
Jeanette Winzenburgarapte
Jeanette Winzenburg
authored andcommitted
8245282: Button/Combo Behavior: memory leak on dispose
Reviewed-by: arapte
1 parent a78b3fb commit 853ac78

File tree

3 files changed

+12
-37
lines changed

3 files changed

+12
-37
lines changed

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/ButtonBehavior.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626

2727
import com.sun.javafx.PlatformUtil;
2828
import com.sun.javafx.scene.control.inputmap.KeyBinding;
29+
30+
import javafx.beans.InvalidationListener;
2931
import javafx.beans.Observable;
3032
import javafx.scene.control.ButtonBase;
3133
import com.sun.javafx.scene.control.inputmap.InputMap;
@@ -56,6 +58,7 @@ public class ButtonBehavior<C extends ButtonBase> extends BehaviorBase<C> {
5658
*/
5759
private boolean keyDown;
5860

61+
private InvalidationListener focusListener = this::focusChanged;
5962

6063

6164
/***************************************************************************
@@ -89,7 +92,7 @@ public ButtonBehavior(C control) {
8992
);
9093

9194
// Button also cares about focus
92-
control.focusedProperty().addListener(this::focusChanged);
95+
control.focusedProperty().addListener(focusListener);
9396
}
9497

9598

@@ -105,10 +108,9 @@ public ButtonBehavior(C control) {
105108
}
106109

107110
@Override public void dispose() {
111+
// TODO specify contract of dispose and post-condition for getNode()
112+
getNode().focusedProperty().removeListener(focusListener);
108113
super.dispose();
109-
110-
// TODO
111-
getNode().focusedProperty().removeListener(this::focusChanged);
112114
}
113115

114116

modules/javafx.controls/src/main/java/com/sun/javafx/scene/control/behavior/ComboBoxBaseBehavior.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
package com.sun.javafx.scene.control.behavior;
2727

2828
import com.sun.javafx.scene.control.inputmap.InputMap;
29+
30+
import javafx.beans.InvalidationListener;
2931
import javafx.beans.Observable;
3032
import javafx.event.EventHandler;
3133
import javafx.event.EventTarget;
@@ -47,6 +49,7 @@
4749
public class ComboBoxBaseBehavior<T> extends BehaviorBase<ComboBoxBase<T>> {
4850

4951
private final InputMap<ComboBoxBase<T>> inputMap;
52+
private InvalidationListener focusListener = this::focusChanged;
5053

5154
/***************************************************************************
5255
* *
@@ -102,7 +105,7 @@ public ComboBoxBaseBehavior(final ComboBoxBase<T> comboBox) {
102105
enterReleased.setAutoConsume(false);
103106

104107
// ComboBoxBase also cares about focus
105-
comboBox.focusedProperty().addListener(this::focusChanged);
108+
comboBox.focusedProperty().addListener(focusListener);
106109

107110
// Only add this if we're on an embedded platform that supports 5-button navigation
108111
if (Utils.isTwoLevelFocus()) {
@@ -112,7 +115,7 @@ public ComboBoxBaseBehavior(final ComboBoxBase<T> comboBox) {
112115

113116
@Override public void dispose() {
114117
if (tlFocus != null) tlFocus.dispose();
115-
getNode().focusedProperty().removeListener(this::focusChanged);
118+
getNode().focusedProperty().removeListener(focusListener);
116119
super.dispose();
117120
}
118121

modules/javafx.controls/src/test/java/test/com/sun/javafx/scene/control/behavior/BehaviorMemoryLeakTest.java

+1-31
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,12 @@
4141
import static org.junit.Assert.*;
4242
import static test.com.sun.javafx.scene.control.infrastructure.ControlSkinFactory.*;
4343

44-
import javafx.scene.control.Button;
45-
import javafx.scene.control.CheckBox;
46-
import javafx.scene.control.ColorPicker;
47-
import javafx.scene.control.ComboBox;
4844
import javafx.scene.control.Control;
49-
import javafx.scene.control.DatePicker;
50-
import javafx.scene.control.Hyperlink;
5145
import javafx.scene.control.ListView;
52-
import javafx.scene.control.MenuButton;
5346
import javafx.scene.control.PasswordField;
54-
import javafx.scene.control.RadioButton;
55-
import javafx.scene.control.SplitMenuButton;
5647
import javafx.scene.control.TableView;
5748
import javafx.scene.control.TextArea;
5849
import javafx.scene.control.TextField;
59-
import javafx.scene.control.ToggleButton;
6050
import javafx.scene.control.TreeTableView;
6151
import javafx.scene.control.TreeView;
6252
import test.com.sun.javafx.scene.control.infrastructure.ControlSkinFactory;
@@ -86,39 +76,19 @@ public void testMemoryLeakDisposeBehavior() {
8676
//---------------- parameterized
8777

8878
// Note: name property not supported before junit 4.11
89-
@Parameterized.Parameters //(name = "{index}: {0} ")
79+
@Parameterized.Parameters // (name = "{index}: {0} ")
9080
public static Collection<Object[]> data() {
9181
List<Class<Control>> controlClasses = getControlClassesWithBehavior();
9282
// FIXME as part of JDK-8241364
9383
// The behaviors of these controls are leaking
9484
// step 1: file issues (where not yet done), add informal ignore to entry
9585
// step 2: fix and remove from list
9686
List<Class<? extends Control>> leakingClasses = List.of(
97-
// @Ignore("8245282")
98-
Button.class,
99-
// @Ignore("8245282")
100-
CheckBox.class,
101-
// @Ignore("8245282")
102-
ColorPicker.class,
103-
// @Ignore("8245282")
104-
ComboBox.class,
105-
// @Ignore("8245282")
106-
DatePicker.class,
107-
// @Ignore("8245282")
108-
Hyperlink.class,
10987
ListView.class,
110-
// @Ignore("8245282")
111-
MenuButton.class,
11288
PasswordField.class,
113-
// @Ignore("8245282")
114-
RadioButton.class,
115-
// @Ignore("8245282")
116-
SplitMenuButton.class,
11789
TableView.class,
11890
TextArea.class,
11991
TextField.class,
120-
// @Ignore("8245282")
121-
ToggleButton.class,
12292
TreeTableView.class,
12393
TreeView.class
12494
);

0 commit comments

Comments
 (0)