|
1 | 1 | /*
|
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. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
4 | 4 | *
|
5 | 5 | * This code is free software; you can redistribute it and/or modify it
|
|
30 | 30 | import javafx.beans.value.ChangeListener;
|
31 | 31 | import javafx.beans.value.ObservableValue;
|
32 | 32 | import javafx.concurrent.Task;
|
| 33 | +import javafx.scene.input.MouseButton; |
33 | 34 | import javafx.scene.layout.StackPane;
|
34 | 35 | import javafx.scene.layout.TilePane;
|
35 | 36 | import javafx.scene.layout.VBox;
|
|
53 | 54 | import org.junit.Before;
|
54 | 55 | import org.junit.Test;
|
55 | 56 |
|
| 57 | +import java.lang.ref.WeakReference; |
56 | 58 | import java.util.concurrent.CountDownLatch;
|
57 | 59 | import java.util.concurrent.ExecutionException;
|
58 | 60 | import java.util.concurrent.atomic.AtomicInteger;
|
|
68 | 70 | import javafx.scene.Scene;
|
69 | 71 | import javafx.scene.SceneShim;
|
70 | 72 | import javafx.scene.SubScene;
|
| 73 | +import test.util.memory.JMemoryBuddy; |
71 | 74 |
|
72 | 75 | import static junit.framework.Assert.assertEquals;
|
73 | 76 | import static junit.framework.Assert.assertNotNull;
|
@@ -971,4 +974,49 @@ public void testAddNullPostLayoutPulseListener() {
|
971 | 974 | SceneShim.scenePulseListener_pulse(scene);
|
972 | 975 | assertEquals(1, counter.get());
|
973 | 976 | }
|
| 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 | + } |
974 | 1022 | }
|
0 commit comments