Skip to content

Commit a0ea874

Browse files
author
Marius Hanl
committed
8279214: Memory leak in Scene after dragging a cell
Reviewed-by: angorya, arapte
1 parent 9819d45 commit a0ea874

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

modules/javafx.graphics/src/main/java/javafx/scene/Scene.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3668,6 +3668,7 @@ private void clearPDREventTargets() {
36683668
? currentEventTargets.get(0) : null;
36693669
pdrEventTarget.clear();
36703670
pdrEventTargets.clear();
3671+
fullPDRTmpTargetWrapper.clear();
36713672
}
36723673

36733674
public void enterFullPDR(EventTarget gestureSource) {

modules/javafx.graphics/src/test/java/test/javafx/scene/SceneTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,4 +1030,45 @@ public void testAddNullPostLayoutPulseListener() {
10301030
// Verify TilePane was GC'd:
10311031
JMemoryBuddy.assertCollectable(ref);
10321032
}
1033+
1034+
@Test public void testNoReferencesRemainToRemovedNodeAfterStartingFullDrag() {
1035+
TilePane pane = new TilePane();
1036+
pane.setMinSize(200, 200);
1037+
1038+
WeakReference<TilePane> ref = new WeakReference<>(pane);
1039+
1040+
Group root = new Group(pane);
1041+
final Scene scene = new Scene(root, 400, 400);
1042+
stage.setScene(scene);
1043+
1044+
pane.setOnDragDetected(event -> ((Node) event.getSource()).startFullDrag());
1045+
1046+
// Simulate a drag operation from the user
1047+
SceneHelper.processMouseEvent(scene,
1048+
MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, 50, 50));
1049+
1050+
SceneHelper.processMouseEvent(scene,
1051+
MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_DRAGGED, 70, 70));
1052+
1053+
SceneHelper.processMouseEvent(scene,
1054+
MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, 50, 50));
1055+
1056+
root.getChildren().setAll(new StackPane());
1057+
1058+
// Generate a MOUSE_EXITED event for the removed node and a pulse as otherwise many unrelated Scene references
1059+
// hang around to the removed node:
1060+
SceneHelper.processMouseEvent(
1061+
scene,
1062+
new MouseEvent(
1063+
MouseEvent.MOUSE_EXITED, 50, 50, 50, 50, MouseButton.NONE, 0, false, false, false,
1064+
false, false, false, false, false, false, true, null
1065+
)
1066+
);
1067+
1068+
Toolkit.getToolkit().firePulse();
1069+
1070+
pane = null;
1071+
1072+
JMemoryBuddy.assertCollectable(ref);
1073+
}
10331074
}

0 commit comments

Comments
 (0)