Skip to content

Commit 015dad0

Browse files
hjohnkevinrushforth
authored andcommitted
8264330: Scene MouseHandler is referencing removed nodes
Reviewed-by: kcr
1 parent eec2f39 commit 015dad0

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -2089,6 +2089,7 @@ project(":graphics") {
20892089
stubCompile group: "junit", name: "junit", version: "4.8.2"
20902090

20912091
antlr group: "org.antlr", name: "antlr4", version: "4.7.2", classifier: "complete"
2092+
testCompile project(":base").sourceSets.test.output
20922093
compile project(':base')
20932094
}
20942095

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -3633,6 +3633,7 @@ private void clearPDREventTargets() {
36333633
currentEventTarget = currentEventTargets.size() > 0
36343634
? currentEventTargets.get(0) : null;
36353635
pdrEventTarget.clear();
3636+
pdrEventTargets.clear();
36363637
}
36373638

36383639
public void enterFullPDR(EventTarget gestureSource) {

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

+49-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,7 @@
3030
import javafx.beans.value.ChangeListener;
3131
import javafx.beans.value.ObservableValue;
3232
import javafx.concurrent.Task;
33+
import javafx.scene.input.MouseButton;
3334
import javafx.scene.layout.StackPane;
3435
import javafx.scene.layout.TilePane;
3536
import javafx.scene.layout.VBox;
@@ -53,6 +54,7 @@
5354
import org.junit.Before;
5455
import org.junit.Test;
5556

57+
import java.lang.ref.WeakReference;
5658
import java.util.concurrent.CountDownLatch;
5759
import java.util.concurrent.ExecutionException;
5860
import java.util.concurrent.atomic.AtomicInteger;
@@ -68,6 +70,7 @@
6870
import javafx.scene.Scene;
6971
import javafx.scene.SceneShim;
7072
import javafx.scene.SubScene;
73+
import test.util.memory.JMemoryBuddy;
7174

7275
import static junit.framework.Assert.assertEquals;
7376
import static junit.framework.Assert.assertNotNull;
@@ -971,4 +974,49 @@ public void testAddNullPostLayoutPulseListener() {
971974
SceneShim.scenePulseListener_pulse(scene);
972975
assertEquals(1, counter.get());
973976
}
977+
978+
@Test public void testNoReferencesRemainToRemovedNodeAfterBeingClicked() {
979+
StubToolkit toolkit = (StubToolkit) Toolkit.getToolkit();
980+
TilePane pane = new TilePane();
981+
VBox vbox = new VBox(pane);
982+
Scene scene = new Scene(vbox, 300, 200);
983+
WeakReference<TilePane> ref = new WeakReference<>(pane);
984+
985+
pane.setMinSize(1000, 1000); // ensure mouse click will hit this node
986+
987+
stage.setScene(scene);
988+
989+
// Press mouse on TilePane so it gets picked up as a potential node to drag:
990+
SceneHelper.processMouseEvent(
991+
scene,
992+
MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_PRESSED, 100, 100)
993+
);
994+
995+
// Release mouse on TilePane to trigger clean up code as there will be no dragging:
996+
SceneHelper.processMouseEvent(
997+
scene,
998+
MouseEventGenerator.generateMouseEvent(MouseEvent.MOUSE_RELEASED, 100, 100)
999+
);
1000+
1001+
// Remove TilePane, and replace with something else:
1002+
vbox.getChildren().setAll(new StackPane());
1003+
1004+
// Generate a MOUSE_EXITED event for the removed node and a pulse as otherwise many unrelated Scene references
1005+
// hang around to the removed node:
1006+
SceneHelper.processMouseEvent(
1007+
scene,
1008+
new MouseEvent(
1009+
MouseEvent.MOUSE_EXITED, 100, 100, 100, 100, MouseButton.NONE, 0, false, false, false,
1010+
false, false, false, false, false, false, true, null
1011+
)
1012+
);
1013+
1014+
toolkit.firePulse();
1015+
1016+
// Clear our own reference and see if the TilePane is now not referenced anywhere:
1017+
pane = null;
1018+
1019+
// Verify TilePane was GC'd:
1020+
JMemoryBuddy.assertCollectable(ref);
1021+
}
9741022
}

0 commit comments

Comments
 (0)