modules/graphics/src/test/java/com/sun/javafx/css/StyleManagerTest.java

Print this page
rev 6979 : RT-37025: StyleManager failed to remove stylesheet containers that reference children of a parent that is removed from the scene

@@ -125,11 +125,11 @@
     public void testSetDefaultUserAgentStyleshseet_String() {
         StyleManager sm = StyleManager.getInstance();
         sm.setDefaultUserAgentStylesheet("/com/sun/javafx/css/ua0.css");
 
         int index = indexOf(sm.platformUserAgentStylesheetContainers, "/com/sun/javafx/css/ua0.css");
-        assertEquals(0,index);
+        assertEquals(0, index);
     }
 
     @Test
     public void testSetUserAgentStyleshseet_String_Multiple() {
         StyleManager sm = StyleManager.getInstance();

@@ -289,10 +289,29 @@
         assertEquals(0,index);
 
     }
 
     @Test
+    public void testForgetParent_withStylesheets() {
+
+        Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
+
+        StyleManager sm = StyleManager.getInstance();
+        sm.setDefaultUserAgentStylesheet("/com/sun/javafx/css/ua0.css");
+
+        int index = indexOf(sm.platformUserAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
+        assertEquals(0,index);
+
+        sm.forget(scene.getRoot());
+
+        // forgetting the scene should not affect the platform user-agent stylesheets
+        index = indexOf(sm.platformUserAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
+        assertEquals(0,index);
+
+    }
+
+    @Test
     public void testForgetParent_withSceneUAStylesheet() {
 
         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
         scene.setUserAgentStylesheet("/com/sun/javafx/css/ua1.css");
 

@@ -344,11 +363,11 @@
 
         index = indexOf(sm.userAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
         assertEquals(-1, index);
 
         index = indexOf(sm.userAgentStylesheetContainers,"/com/sun/javafx/css/ua1.css");
-        assertEquals(0,index);
+        assertEquals(0, index);
 
         index = indexOf(sm.platformUserAgentStylesheetContainers,"/com/sun/javafx/css/ua1.css");
         assertEquals(-1, index);
 
         sm.forget(scene0.getRoot());

@@ -453,11 +472,11 @@
 
         StyleManager sm = StyleManager.getInstance();
         sm.setDefaultUserAgentStylesheet("/com/sun/javafx/css/ua0.css");
 
         int index = indexOf(sm.platformUserAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
-        assertEquals(0,index);
+        assertEquals(0, index);
 
         index = indexOf(sm.userAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
         assertEquals(-1, index);
 
         index = indexOf(sm.userAgentStylesheetContainers,"/com/sun/javafx/css/ua1.css");

@@ -549,11 +568,11 @@
 
         StyleManager sm = StyleManager.getInstance();
         sm.setDefaultUserAgentStylesheet("/com/sun/javafx/css/ua0.css");
 
         int index = indexOf(sm.platformUserAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
-        assertEquals(0,index);
+        assertEquals(0, index);
 
         index = indexOf(sm.userAgentStylesheetContainers,"/com/sun/javafx/css/ua0.css");
         assertEquals(-1, index);
 
         index = indexOf(sm.userAgentStylesheetContainers,"/com/sun/javafx/css/ua1.css");

@@ -886,6 +905,57 @@
 
         assertNotNull(container);
 
     }
 
+    @Test
+    public void testRT_37025() {
+
+        //
+        // The issue in RT-37025 was that the stylesheet container wasn't getting removed even
+        // though the parent had been forgotten. The StyleManager#forget(Parent) method didn't
+        // look to see if _any_ stylesheet container had the parent as a reference.
+        //
+        final StyleManager sm = StyleManager.getInstance();
+
+        // This test needs a bit more complexity to the scene-graph
+        Group group = null;
+        Pane pane = new Pane(
+                new Group(
+                        new Pane(
+                                // I want these to be a Parent, not a Node
+                                new Group(new Pane(){{ getStyleClass().add("rect"); }}),
+                                group = new Group(new Pane(){{ getStyleClass().add("rect"); }})
+                        )
+                )
+        );
+        pane.getStylesheets().add("/com/sun/javafx/css/ua0.css");
+        group.getStylesheets().add("/com/sun/javafx/css/ua1.css");
+
+        Group root = new Group(pane);
+        Scene scene = new Scene(root);
+
+        root.applyCss();
+
+        assertTrue(sm.stylesheetContainerMap.containsKey("/com/sun/javafx/css/ua0.css"));
+        StyleManager.StylesheetContainer container = sm.stylesheetContainerMap.get("/com/sun/javafx/css/ua0.css");
+        assertEquals(7, container.parentUsers.list.size());
+
+        assertTrue(sm.stylesheetContainerMap.containsKey("/com/sun/javafx/css/ua1.css"));
+        container = sm.stylesheetContainerMap.get("/com/sun/javafx/css/ua1.css");
+        assertEquals(2, container.parentUsers.list.size());
+
+        ((Pane)group.getParent()).getChildren().remove(group);
+
+        assertFalse(sm.stylesheetContainerMap.containsKey("/com/sun/javafx/css/ua1.css"));
+        assertTrue(sm.stylesheetContainerMap.containsKey("/com/sun/javafx/css/ua0.css"));
+        container = sm.stylesheetContainerMap.get("/com/sun/javafx/css/ua0.css");
+        assertEquals(5, container.parentUsers.list.size());
+
+        scene.setRoot(new Group());
+        assertFalse(sm.stylesheetContainerMap.containsKey("/com/sun/javafx/css/ua0.css"));
+        assertFalse(StyleManager.cacheContainerMap.containsKey(root));
+        assertTrue(StyleManager.cacheContainerMap.containsKey(scene.getRoot()));
+
+    }
+
 }