1 /*
   2  * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.com.sun.javafx.css;
  27 
  28 import com.sun.javafx.css.CascadingStyle;
  29 import com.sun.javafx.css.StyleManager;
  30 import com.sun.javafx.css.StyleManagerShim;
  31 import com.sun.javafx.css.StyleMap;
  32 import javafx.css.CssParser;
  33 import javafx.css.StyleOrigin;
  34 import javafx.css.StyleableProperty;
  35 import javafx.css.Stylesheet;
  36 import javafx.scene.Group;
  37 import javafx.scene.Parent;
  38 import javafx.scene.Scene;
  39 import javafx.scene.SubScene;
  40 import javafx.scene.layout.Pane;
  41 import javafx.scene.paint.Color;
  42 import javafx.scene.paint.Paint;
  43 import javafx.scene.shape.Rectangle;
  44 import org.junit.Before;
  45 import org.junit.Test;
  46 
  47 import java.net.URL;
  48 import java.util.ArrayList;
  49 import java.util.Collections;
  50 import java.util.List;
  51 import java.util.Map;
  52 import java.util.concurrent.atomic.AtomicBoolean;
  53 
  54 import static org.junit.Assert.*;
  55 
  56 /**
  57  *
  58  * @author dgrieve
  59  */
  60 public class StyleManagerTest {
  61 
  62     public StyleManagerTest() {
  63     }
  64 
  65     @Before
  66     public void setUp() {
  67         StyleManagerShim sm = StyleManagerShim.getInstance();
  68         sm.userAgentStylesheetContainers_clear();
  69         sm.platformUserAgentStylesheetContainers_clear();
  70         sm.stylesheetContainerMap_clear();
  71         sm.cacheContainerMap_clear();
  72         sm.set_hasDefaultUserAgentStylesheet(false);
  73     }
  74 
  75     @Test
  76     public void testMethod_getInstance() {
  77         Scene scene = new Scene(new Group());
  78         StyleManagerShim sm = StyleManagerShim.getInstance();
  79         assertNotNull(sm);
  80     }
  81 
  82     @Test
  83     public void testAddUserAgentStyleshseet_String() {
  84         StyleManagerShim sm = StyleManagerShim.getInstance();
  85         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
  86         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
  87         assertEquals(0,index);
  88 
  89     }
  90 
  91     @Test
  92     public void testAddUserAgentStyleshseet_String_Multiple() {
  93         StyleManagerShim sm = StyleManagerShim.getInstance();
  94         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
  95         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
  96 
  97         int index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua0.css");
  98         assertEquals(0,index);
  99 
 100         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 101         assertEquals(1, index);
 102     }
 103 
 104     @Test
 105     public void testAddUserAgentStyleshseet_String_Duplicate() {
 106         StyleManagerShim sm = StyleManagerShim.getInstance();
 107         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 108         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 109         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 110 
 111         assertTrue(sm.platformUserAgentStylesheetContainers_size() == 2);
 112 
 113         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 114         assertEquals(0,index);
 115 
 116         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 117         assertEquals(1, index);
 118 
 119     }
 120 
 121     @Test
 122     public void testSetDefaultUserAgentStyleshseet_String() {
 123         StyleManagerShim sm = StyleManagerShim.getInstance();
 124         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 125 
 126         int index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua0.css");
 127         assertEquals(0, index);
 128     }
 129 
 130     @Test
 131     public void testSetUserAgentStyleshseet_String_Multiple() {
 132         StyleManagerShim sm = StyleManagerShim.getInstance();
 133         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 134         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 135 
 136         assertTrue(sm.platformUserAgentStylesheetContainers_size() == 2);
 137 
 138         int index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua0.css");
 139         assertEquals(0,index);
 140 
 141         index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua1.css");
 142         assertEquals(1, index);
 143     }
 144 
 145     @Test
 146     public void testSetUserAgentStyleshseet_String_Multiple2() {
 147         StyleManagerShim sm = StyleManagerShim.getInstance();
 148         // same as before but set default after adding another.
 149         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 150         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 151 
 152         assertEquals(2, sm.platformUserAgentStylesheetContainers_size());
 153 
 154         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 155         assertEquals(0,index);
 156 
 157         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 158         assertEquals(1, index);
 159     }
 160 
 161     @Test
 162     public void testSetUserAgentStyleshseet_String_Duplicate() {
 163         StyleManagerShim sm = StyleManagerShim.getInstance();
 164         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 165         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 166         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 167 
 168         assertEquals(2, sm.platformUserAgentStylesheetContainers_size());
 169 
 170         int index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua0.css");
 171         assertEquals(0,index);
 172 
 173         index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua1.css");
 174         assertEquals(1, index);
 175     }
 176 
 177     @Test
 178     public void testAddUserAgentStyleshseet_Stylesheet() {
 179 
 180         try {
 181             StyleManagerShim sm = StyleManagerShim.getInstance();
 182             URL ua0_url = StyleManagerTest.class.getResource("ua0.css");
 183             Stylesheet stylesheet = new CssParser().parse(ua0_url);
 184             sm.addUserAgentStylesheet(null,stylesheet);
 185 
 186             assertEquals(1, sm.platformUserAgentStylesheetContainers_size());
 187 
 188             int index = sm.platformUserAgentStylesheetContainers_indexOf(ua0_url.toExternalForm());
 189             assertEquals(0, index);
 190 
 191         } catch (Exception ioe) {
 192             fail(ioe.getMessage());
 193         }
 194 
 195     }
 196 
 197     @Test
 198     public void testSetDefaultUserAgentStyleshseet_Stylesheet() {
 199 
 200         try {
 201             StyleManagerShim sm = StyleManagerShim.getInstance();
 202 
 203             URL ua1_url = StyleManagerTest.class.getResource("ua1.css");
 204             Stylesheet stylesheet = new CssParser().parse(ua1_url);
 205             sm.addUserAgentStylesheet(null,stylesheet);
 206 
 207             URL ua0_url = StyleManagerTest.class.getResource("ua0.css");
 208             stylesheet = new CssParser().parse(ua0_url);
 209             sm.setDefaultUserAgentStylesheet(stylesheet);
 210 
 211             assertEquals(2, sm.platformUserAgentStylesheetContainers_size());
 212 
 213             int index = sm.platformUserAgentStylesheetContainers_indexOf(ua0_url.toExternalForm());
 214             assertEquals(0, index);
 215 
 216             index = sm.platformUserAgentStylesheetContainers_indexOf(ua1_url.toExternalForm());
 217             assertEquals(1, index);
 218 
 219         } catch (Exception ioe) {
 220             fail(ioe.getMessage());
 221         }
 222 
 223     }
 224 
 225     @Test
 226     public void testSceneUAStylesheetAdded() {
 227         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 228         scene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 229 
 230         StyleManagerShim sm = StyleManagerShim.getInstance();
 231         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 232 
 233         scene.getRoot().applyCss();
 234 
 235         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 236         assertEquals(0,index);
 237 
 238         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 239         assertEquals(-1, index);
 240 
 241         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 242         assertEquals(0,index);
 243 
 244         // the Scene user-agent stylesheet is not a platform user-agent stylesheet
 245         index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua1.css");
 246         assertEquals(-1, index);
 247 
 248     }
 249 
 250     @Test
 251     public void testSubSceneUAStylesheetAdded() {
 252         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 253         scene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 254 
 255         StyleManagerShim sm = StyleManagerShim.getInstance();
 256         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 257 
 258         scene.getRoot().applyCss();
 259 
 260         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 261         assertEquals(0,index);
 262 
 263         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 264         assertEquals(-1, index);
 265 
 266         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 267         assertEquals(0,index);
 268 
 269         // the Scene user-agent stylesheet is not a platform user-agent stylesheet
 270         index = sm.platformUserAgentStylesheetContainers_indexOf( "/test/com/sun/javafx/css/ua1.css");
 271         assertEquals(-1, index);
 272 
 273     }
 274 
 275     @Test
 276     public void testForgetParent() {
 277 
 278         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 279 
 280         StyleManagerShim sm = StyleManagerShim.getInstance();
 281         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 282 
 283         scene.getRoot().applyCss();
 284 
 285         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 286         assertEquals(0,index);
 287 
 288         sm.forget(scene.getRoot());
 289 
 290         // forgetting the scene should not affect the platform user-agent stylesheets
 291         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 292         assertEquals(0,index);
 293 
 294     }
 295 
 296     @Test
 297     public void testForgetParent_withSceneUAStylesheet() {
 298 
 299         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 300         scene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 301 
 302         StyleManagerShim sm = StyleManagerShim.getInstance();
 303         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 304 
 305         scene.getRoot().applyCss();
 306 
 307         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 308         assertEquals(0, index);
 309 
 310         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 311         assertEquals(-1, index);
 312 
 313         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 314         assertEquals(0,index);
 315 
 316         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 317         assertEquals(-1, index);
 318 
 319         sm.forget(scene.getRoot());
 320 
 321         // forgetting the parent should not affect the platform user-agent stylesheets
 322         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 323         assertEquals(0,index);
 324 
 325         // only forgetting the scene should affect the platform user-agent stylesheets
 326         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 327         assertEquals(0, index);
 328 
 329     }
 330 
 331     @Test
 332     public void testForgetParent_withTwoScenes() {
 333         Scene scene0 = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 334         scene0.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 335 
 336         Scene scene1 = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 337         scene1.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 338 
 339         StyleManagerShim sm = StyleManagerShim.getInstance();
 340         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 341 
 342         scene0.getRoot().applyCss();
 343         scene1.getRoot().applyCss();
 344 
 345         // even though there are two scenes using this stylesheet, there should only be one container.
 346         assertEquals(1, sm.userAgentStylesheetContainers_size());
 347 
 348         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 349         assertEquals(0,index);
 350 
 351         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 352         assertEquals(-1, index);
 353 
 354         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 355         assertEquals(0, index);
 356 
 357         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 358         assertEquals(-1, index);
 359 
 360         sm.forget(scene0.getRoot());
 361 
 362         // forgetting the scene should not affect the platform user-agent stylesheets
 363         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 364         assertEquals(0,index);
 365 
 366         // we should still have ua1.css since scene1 is still using it
 367         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 368         assertEquals(0,index);
 369 
 370         sm.forget(scene1.getRoot());
 371 
 372         // only forgetting the scene should affect the platform user-agent stylesheets
 373         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 374         assertEquals(0, index);
 375     }
 376 
 377     @Test
 378     public void testForgetParent_withParentStylesheet() {
 379 
 380         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 381         scene.getRoot().getStylesheets().add("/test/com/sun/javafx/css/ua1.css");
 382 
 383         StyleManagerShim sm = StyleManagerShim.getInstance();
 384         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 385 
 386         scene.getRoot().applyCss();
 387 
 388         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 389         assertEquals(0, index);
 390 
 391         assertTrue(sm.userAgentStylesheetContainers_isEmpty());
 392         assertTrue(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua1.css"));
 393 
 394         sm.forget(scene.getRoot());
 395 
 396         // forgetting the scene should not affect the platform user-agent stylesheets
 397         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 398         assertEquals(0, index);
 399 
 400         assertFalse(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua1.css"));
 401 
 402     }
 403 
 404     @Test
 405     public void testForgetParent_withMultipleParentStylesheets() {
 406 
 407         final Parent parent0 = new Pane(new Rectangle(){{ getStyleClass().add("rect"); }});
 408         parent0.getStylesheets().add("/test/com/sun/javafx/css/ua1.css");
 409 
 410         final Parent parent1 = new Pane(new Rectangle(){{ getStyleClass().add("rect"); }});
 411         parent1.getStylesheets().add("/test/com/sun/javafx/css/ua1.css");
 412 
 413         Scene scene = new Scene(new Group(parent0, parent1));
 414 
 415         StyleManagerShim sm = StyleManagerShim.getInstance();
 416         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 417 
 418         scene.getRoot().applyCss();
 419 
 420         assertTrue(sm.userAgentStylesheetContainers_isEmpty());
 421 
 422         StyleManagerShim.StylesheetContainer container = sm.stylesheetContainerMap_get("/test/com/sun/javafx/css/ua1.css");
 423         assertNotNull(container);
 424         assertTrue(container.parentUsers_contains(parent0));
 425         assertTrue(container.parentUsers_contains(parent1));
 426 
 427         sm.forget(parent0);
 428 
 429         assertTrue(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua1.css"));
 430         assertFalse(container.parentUsers_contains(parent0));
 431         assertTrue(container.parentUsers_contains(parent1));
 432 
 433         sm.forget(parent1);
 434 
 435         assertFalse(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua1.css"));
 436         assertFalse(container.parentUsers_contains(parent0));
 437         assertFalse(container.parentUsers_contains(parent1));
 438     }
 439 
 440     @Test
 441     public void testForgetScene() {
 442 
 443         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 444 
 445         StyleManagerShim sm = StyleManagerShim.getInstance();
 446         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 447 
 448         scene.getRoot().applyCss();
 449 
 450         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 451         assertEquals(0,index);
 452 
 453         sm.forget(scene);
 454 
 455         // forgetting the scene should not affect the platform user-agent stylesheets
 456         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 457         assertEquals(0,index);
 458     }
 459 
 460     @Test
 461     public void testForgetScene_withUAStylesheet() {
 462 
 463         Scene scene = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 464         scene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 465 
 466         StyleManagerShim sm = StyleManagerShim.getInstance();
 467         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 468 
 469         scene.getRoot().applyCss();
 470 
 471         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 472         assertEquals(0, index);
 473 
 474         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 475         assertEquals(-1, index);
 476 
 477         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 478         assertEquals(0,index);
 479 
 480         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 481         assertEquals(-1, index);
 482 
 483         sm.forget(scene);
 484 
 485         // forgetting the scene should not affect the platform user-agent stylesheets
 486         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 487         assertEquals(0,index);
 488 
 489         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 490         assertEquals(-1, index);
 491 
 492     }
 493 
 494     @Test
 495     public void testForgetScene_withTwoScenes() {
 496         Scene scene0 = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 497         scene0.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 498 
 499         Scene scene1 = new Scene(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 500         scene1.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 501 
 502         StyleManagerShim sm = StyleManagerShim.getInstance();
 503         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 504 
 505         scene0.getRoot().applyCss();
 506         scene1.getRoot().applyCss();
 507 
 508         // even though there are two scenes using this stylesheet, there should only be one container.
 509         assertEquals(1, sm.userAgentStylesheetContainers_size());
 510 
 511         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 512         assertEquals(0,index);
 513 
 514         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 515         assertEquals(-1, index);
 516 
 517         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 518         assertEquals(0,index);
 519 
 520         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 521         assertEquals(-1, index);
 522 
 523         sm.forget(scene0);
 524 
 525         // forgetting the scene should not affect the platform user-agent stylesheets
 526         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 527         assertEquals(0,index);
 528 
 529         // we should still have ua1.css since scene1 is still using it
 530         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 531         assertEquals(0,index);
 532 
 533         sm.forget(scene1);
 534 
 535         // having forgotten scene1, userAgentStylesheetContainers should be empty.
 536         assertTrue(sm.userAgentStylesheetContainers_isEmpty());
 537     }
 538 
 539     @Test
 540     public void testForgetSubScene() {
 541 
 542         Pane subSceneRoot = new Pane(new Rectangle(){{ getStyleClass().add("rect"); }});
 543         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 544         Scene scene = new Scene(new Group(subScene));
 545 
 546         StyleManagerShim sm = StyleManagerShim.getInstance();
 547         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 548 
 549         scene.getRoot().applyCss();
 550 
 551         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 552         assertEquals(0,index);
 553 
 554         sm.forget(subScene);
 555 
 556         // forgetting the scene should not affect the platform user-agent stylesheets
 557         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 558         assertEquals(0,index);
 559     }
 560 
 561     @Test
 562     public void testForgetSubScene_withUAStylesheet() {
 563 
 564         Pane subSceneRoot = new Pane(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 565         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 566         subScene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 567         Scene scene = new Scene(new Group(subScene));
 568 
 569         StyleManagerShim sm = StyleManagerShim.getInstance();
 570         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 571 
 572         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 573         assertEquals(0, index);
 574 
 575         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 576         assertEquals(-1, index);
 577 
 578         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 579         assertEquals(0,index);
 580 
 581         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 582         assertEquals(-1, index);
 583 
 584         sm.forget(subScene);
 585 
 586         // forgetting the scene should not affect the platform user-agent stylesheets
 587         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 588         assertEquals(0,index);
 589 
 590         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 591         assertEquals(-1, index);
 592 
 593     }
 594 
 595     @Test
 596     public void testForgetSubScene_with_UAStylesheet_and_ParentStylesheet() {
 597 
 598         // make sure forget(SubScene) get's children with stylesheets
 599         Group group = new Group(new Rectangle(){{ getStyleClass().add("rect"); }});
 600         group.getStylesheets().add("/test/com/sun/javafx/css/ua2.css");
 601         Pane subSceneRoot = new Pane(group);
 602         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 603         subScene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 604         Scene scene = new Scene(new Group(subScene));
 605 
 606         StyleManagerShim sm = StyleManagerShim.getInstance();
 607         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 608 
 609         scene.getRoot().applyCss();
 610 
 611         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 612         assertEquals(0,index);
 613 
 614         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 615         assertEquals(-1, index);
 616 
 617         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 618         assertEquals(0,index);
 619 
 620         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 621         assertEquals(-1, index);
 622 
 623         sm.forget(subScene);
 624 
 625         // forgetting the scene should not affect the platform user-agent stylesheets
 626         index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 627         assertEquals(0,index);
 628 
 629         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 630         assertEquals(-1, index);
 631 
 632     }
 633 
 634     @Test
 635     public void testChangeSubSceneStylesheet() {
 636 
 637         Pane subSceneRoot = new Pane(new Group(new Rectangle(){{ getStyleClass().add("rect"); }}));
 638         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 639         Scene scene = new Scene(new Group(subScene));
 640 
 641         StyleManagerShim sm = StyleManagerShim.getInstance();
 642         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 643 
 644         scene.getRoot().applyCss();
 645 
 646         scene.getRoot().applyCss();
 647 
 648         scene.getRoot().applyCss();
 649 
 650         int index = sm.platformUserAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 651         assertEquals(0, index);
 652 
 653         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua0.css");
 654         assertEquals(-1, index);
 655 
 656         subScene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 657 
 658         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 659         assertEquals(0,index);
 660 
 661         sm.forget(subScene);
 662 
 663         subScene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua2.css");
 664         scene.getRoot().applyCss();
 665 
 666         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua2.css");
 667         assertEquals(0, index);
 668 
 669         index = sm.userAgentStylesheetContainers_indexOf("/test/com/sun/javafx/css/ua1.css");
 670         assertEquals(-1,index);
 671 
 672     }
 673 
 674     @Test
 675     public void testFindMatchingStyles_defaultStyleSheet() {
 676 
 677         StyleManagerShim sm = StyleManagerShim.getInstance();
 678         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 679 
 680         Rectangle rect = new Rectangle(){{ getStyleClass().add("rect"); }};
 681         Scene scene = new Scene(new Group(rect));
 682 
 683         StyleMap matchingStyles = sm.findMatchingStyles(rect, null, null);
 684         Map<String,List<CascadingStyle>> styleMap = matchingStyles.getCascadingStyles();
 685 
 686         assertTrue(styleMap.containsKey("-fx-fill"));
 687 
 688         List<CascadingStyle> styles = styleMap.get("-fx-fill");
 689         assertEquals(1, styles.size());
 690 
 691         Object obj = styles.get(0).getParsedValue().convert(null);
 692         assertEquals(Color.RED, obj);
 693     }
 694 
 695     @Test
 696     public void testFindMatchingStyles_defaultStyleSheet_sceneUserAgentStylesheet() {
 697 
 698         StyleManagerShim sm = StyleManagerShim.getInstance();
 699         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 700 
 701         Rectangle rect = new Rectangle(){{ getStyleClass().add("rect"); }};
 702         Scene scene = new Scene(new Group(rect));
 703         scene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 704 
 705         StyleMap matchingStyles = sm.findMatchingStyles(rect, null, null);
 706         Map<String,List<CascadingStyle>> styleMap = matchingStyles.getCascadingStyles();
 707 
 708         scene.getRoot().applyCss();
 709 
 710         // scene stylesheet should totally replace default
 711         assertFalse(styleMap.containsKey("-fx-fill"));
 712         assertTrue(styleMap.containsKey("-fx-stroke"));
 713 
 714         List<CascadingStyle> styles = styleMap.get("-fx-stroke");
 715         assertEquals(1, styles.size());
 716 
 717         Object obj = styles.get(0).getParsedValue().convert(null);
 718         assertEquals(Color.YELLOW, obj);
 719     }
 720 
 721     @Test
 722     public void testFindMatchingStyles_defaultStyleSheet_sceneUserAgentStylesheet_sceneAuthorStylesheet() {
 723 
 724         StyleManagerShim sm = StyleManagerShim.getInstance();
 725         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 726 
 727         Rectangle rect = new Rectangle(){{ getStyleClass().add("rect"); }};
 728         Scene scene = new Scene(new Group(rect));
 729         scene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 730         scene.getStylesheets().add("/test/com/sun/javafx/css/ua2.css");
 731 
 732         StyleMap matchingStyles = sm.findMatchingStyles(rect, null, null);
 733         Map<String,List<CascadingStyle>> styleMap = matchingStyles.getCascadingStyles();
 734 
 735         scene.getRoot().applyCss();
 736 
 737         // ua2.css has fill
 738         assertTrue(styleMap.containsKey("-fx-fill"));
 739         assertTrue(styleMap.containsKey("-fx-stroke"));
 740 
 741         // ua1.css and ua2.css have stroke
 742         List<CascadingStyle> styles = styleMap.get("-fx-stroke");
 743         assertEquals(2, styles.size());
 744 
 745         Object obj = styles.get(0).getParsedValue().convert(null);
 746         assertEquals(Color.GREEN, obj);
 747 
 748         // ua0.css and ua2.css have fill, but we shouldn't get anything from ua0
 749         // since we have a scene user-agent stylesheet
 750         styles = styleMap.get("-fx-fill");
 751         assertEquals(1, styles.size());
 752 
 753         obj = styles.get(0).getParsedValue().convert(null);
 754         assertEquals(Color.BLUE, obj);
 755     }
 756 
 757     @Test
 758     public void testFindMatchingStyles_defaultStyleSheet_subSceneUserAgentStylesheet() {
 759 
 760         StyleManagerShim sm = StyleManagerShim.getInstance();
 761         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 762 
 763         Rectangle rect = new Rectangle(){{ getStyleClass().add("rect"); }};
 764         Pane subSceneRoot = new Pane(rect);
 765         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 766         subScene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 767         Scene scene = new Scene(new Group(subScene));
 768 
 769         StyleMap matchingStyles = sm.findMatchingStyles(rect, subScene, null);
 770         Map<String,List<CascadingStyle>> styleMap = matchingStyles.getCascadingStyles();
 771 
 772         scene.getRoot().applyCss();
 773 
 774         // SubScene stylesheet should totally replace default
 775         assertFalse(styleMap.containsKey("-fx-fill"));
 776         assertTrue(styleMap.containsKey("-fx-stroke"));
 777 
 778         List<CascadingStyle> styles = styleMap.get("-fx-stroke");
 779         assertEquals(1, styles.size());
 780 
 781         Object obj = styles.get(0).getParsedValue().convert(null);
 782         assertEquals(Color.YELLOW, obj);
 783     }
 784 
 785     @Test
 786     public void testFindMatchingStyles_defaultStyleSheet_subSceneUserAgentStylesheet_parentStylesheet() {
 787 
 788         StyleManagerShim sm = StyleManagerShim.getInstance();
 789         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 790 
 791         Rectangle rect = new Rectangle(){{ getStyleClass().add("rect"); }};
 792         Group group = new Group(rect);
 793         group.getStylesheets().add("/test/com/sun/javafx/css/ua2.css");
 794         Pane subSceneRoot = new Pane(group);
 795         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 796         subScene.setUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 797         Scene scene = new Scene(new Group(subScene));
 798 
 799         StyleMap matchingStyles = sm.findMatchingStyles(rect, subScene, null);
 800         Map<String,List<CascadingStyle>> styleMap = matchingStyles.getCascadingStyles();
 801 
 802         scene.getRoot().applyCss();
 803 
 804         // ua2.css has fill
 805         assertTrue(styleMap.containsKey("-fx-fill"));
 806         assertTrue(styleMap.containsKey("-fx-stroke"));
 807 
 808         // ua1.css and ua2.css have stroke
 809         List<CascadingStyle> styles = styleMap.get("-fx-stroke");
 810         assertEquals(2, styles.size());
 811 
 812         Object obj = styles.get(0).getParsedValue().convert(null);
 813         assertEquals(Color.GREEN, obj);
 814 
 815         // ua0.css and ua2.css have fill, but we shouldn't get anything from ua0
 816         // since we have a scene user-agent stylesheet
 817         styles = styleMap.get("-fx-fill");
 818         assertEquals(1, styles.size());
 819 
 820         obj = styles.get(0).getParsedValue().convert(null);
 821         assertEquals(Color.BLUE, obj);
 822     }
 823 
 824     @Test
 825     public void testSwitchDefaultUserAgentStylesheets() {
 826 
 827         Rectangle rect = new Rectangle(){{ getStyleClass().add("rect"); }};
 828         Group group = new Group(rect);
 829         Pane subSceneRoot = new Pane(group);
 830         SubScene subScene = new SubScene(subSceneRoot, 100, 100);
 831         Scene scene = new Scene(new Group(subScene));
 832 
 833         StyleManagerShim sm = StyleManagerShim.getInstance();
 834         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua0.css");
 835 
 836         scene.getRoot().applyCss();
 837 
 838         StyleMap matchingStyles = sm.findMatchingStyles(rect, subScene, null);
 839         Map<String,List<CascadingStyle>> styleMap = matchingStyles.getCascadingStyles();
 840 
 841         // ua0.css has fill
 842         assertTrue(styleMap.containsKey("-fx-fill"));
 843         assertFalse(styleMap.containsKey("-fx-stroke"));
 844 
 845         List<CascadingStyle> styles = styleMap.get("-fx-fill");
 846         assertEquals(1, styles.size());
 847 
 848         Object obj = styles.get(0).getParsedValue().convert(null);
 849         assertEquals(Color.RED, obj);
 850 
 851         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 852 
 853         matchingStyles = sm.findMatchingStyles(rect, subScene, null);
 854         styleMap = matchingStyles.getCascadingStyles();
 855 
 856         // ua1.css has  stroke
 857         assertTrue(styleMap.containsKey("-fx-stroke"));
 858         assertFalse(styleMap.containsKey("-fx-fill"));
 859 
 860         styles = styleMap.get("-fx-stroke");
 861         assertEquals(1, styles.size());
 862 
 863         obj = styles.get(0).getParsedValue().convert(null);
 864         assertEquals(Color.YELLOW, obj);
 865     }
 866 
 867     @Test
 868     public void testGetCacheContainer() {
 869 
 870         Rectangle rectangle = new Rectangle();
 871         SubScene subScene = new SubScene(null, 0, 0);
 872 
 873         StyleManagerShim sm = StyleManagerShim.getInstance();
 874 
 875         // no scene, should return null
 876         assertTrue(sm.isCacheContainerNull(rectangle, subScene));
 877 
 878         // has scene, should return non-null
 879         subScene.setRoot(new Group());
 880         Scene scene = new Scene(new Group(rectangle,subScene));
 881 
 882         assertFalse(sm.isCacheContainerNull(rectangle, subScene));
 883 
 884     }
 885 
 886     @Test
 887     public void testGetCacheContainer_styleable() {
 888         Rectangle rectangle = new Rectangle();
 889 
 890         StyleManagerShim sm = StyleManagerShim.getInstance();
 891 
 892         // no scene, should return null
 893         assertTrue(sm.isCacheContainerNull(rectangle, null));
 894 
 895         // has scene, should return non-null
 896         Scene scene = new Scene(new Group(rectangle));
 897 
 898         assertFalse(sm.isCacheContainerNull(rectangle, null));
 899 
 900     }
 901 
 902     @Test
 903     public void testGetCacheContainer_subScene() {
 904 
 905         SubScene subScene = new SubScene(null, 0, 0);
 906 
 907         StyleManagerShim sm = StyleManagerShim.getInstance();
 908 
 909         // no scene, should return null
 910         assertTrue(sm.isCacheContainerNull(null, subScene));
 911 
 912         // has scene, should return non-null
 913         subScene.setRoot(new Group());
 914         Scene scene = new Scene(new Group(subScene));
 915 
 916         assertFalse(sm.isCacheContainerNull(null, subScene));
 917 
 918     }
 919 
 920     @Test
 921     public void testRT_37025() {
 922 
 923         //
 924         // The issue in RT-37025 was that the stylesheet container wasn't getting removed even
 925         // though the parent had been forgotten. The StyleManager#forget(Parent) method didn't
 926         // look to see if _any_ stylesheet container had the parent as a reference.
 927         //
 928         final StyleManagerShim sm = StyleManagerShim.getInstance();
 929 
 930         // This test needs a bit more complexity to the scene-graph
 931         Group group = null;
 932         Pane pane = new Pane(
 933                 new Group(
 934                         new Pane(
 935                                 // I want these to be a Parent, not a Node
 936                                 new Group(new Pane(){{ getStyleClass().add("rect"); }}),
 937                                 group = new Group(new Pane(){{ getStyleClass().add("rect"); }})
 938                         )
 939                 )
 940         );
 941         pane.getStylesheets().add("/test/com/sun/javafx/css/ua0.css");
 942         group.getStylesheets().add("/test/com/sun/javafx/css/ua1.css");
 943 
 944         Group root = new Group(pane);
 945         Scene scene = new Scene(root);
 946 
 947         root.applyCss();
 948 
 949         assertTrue(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua0.css"));
 950         StyleManagerShim.StylesheetContainer container = sm.stylesheetContainerMap_get("/test/com/sun/javafx/css/ua0.css");
 951         assertEquals(7, container.parentUsers_list_size());
 952 
 953         assertTrue(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua1.css"));
 954         container = sm.stylesheetContainerMap_get("/test/com/sun/javafx/css/ua1.css");
 955         assertEquals(2, container.parentUsers_list_size());
 956 
 957         ((Pane)group.getParent()).getChildren().remove(group);
 958 
 959         assertFalse(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua1.css"));
 960         assertTrue(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua0.css"));
 961         container = sm.stylesheetContainerMap_get("/test/com/sun/javafx/css/ua0.css");
 962         assertEquals(5, container.parentUsers_list_size());
 963 
 964         scene.setRoot(new Group());
 965         assertFalse(sm.stylesheetContainerMap_containsKey("/test/com/sun/javafx/css/ua0.css"));
 966         assertFalse(StyleManager.cacheContainerMap.containsKey(root));
 967         assertTrue(StyleManager.cacheContainerMap.containsKey(scene.getRoot()));
 968 
 969     }
 970 
 971     @Test
 972     public void test_setUserAgentStylesheets() {
 973 
 974         List<String> uaStylesheets = new ArrayList<>();
 975         Collections.addAll(uaStylesheets, "/test/com/sun/javafx/css/ua0.css", "/test/com/sun/javafx/css/ua1.css");
 976 
 977         final StyleManagerShim sm = StyleManagerShim.getInstance();
 978         sm.setUserAgentStylesheets(uaStylesheets);
 979 
 980         assertEquals(2, sm.platformUserAgentStylesheetContainers_size());
 981         assertEquals("/test/com/sun/javafx/css/ua0.css", sm.platformUserAgentStylesheetContainers_getfname(0));
 982         assertEquals("/test/com/sun/javafx/css/ua1.css", sm.platformUserAgentStylesheetContainers_getfname(1));
 983     }
 984 
 985     @Test
 986     public void test_setUserAgentStylesheets_overwrites_existing() {
 987 
 988         List<String> uaStylesheets = new ArrayList<>();
 989         Collections.addAll(uaStylesheets, "/test/com/sun/javafx/css/ua0.css");
 990 
 991         final StyleManagerShim sm = StyleManagerShim.getInstance();
 992 
 993         // 1 - overwrite default user agent stylesheet
 994         sm.platformUserAgentStylesheetContainers_clear();;
 995         sm.setDefaultUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
 996         assertEquals(1, sm.platformUserAgentStylesheetContainers_size());
 997         assertEquals("/test/com/sun/javafx/css/ua1.css", sm.platformUserAgentStylesheetContainers_getfname(0));
 998 
 999         sm.setUserAgentStylesheets(uaStylesheets);
1000         assertEquals(1, sm.platformUserAgentStylesheetContainers_size());
1001         assertEquals("/test/com/sun/javafx/css/ua0.css", sm.platformUserAgentStylesheetContainers_getfname(0));
1002 
1003         // 2 - overwrite other user-agent stylesheets
1004         sm.platformUserAgentStylesheetContainers_clear();;
1005         sm.addUserAgentStylesheet("/test/com/sun/javafx/css/ua1.css");
1006         assertEquals(1, sm.platformUserAgentStylesheetContainers_size());
1007 
1008         sm.setUserAgentStylesheets(uaStylesheets);
1009         assertEquals(1, sm.platformUserAgentStylesheetContainers_size());
1010         assertEquals("/test/com/sun/javafx/css/ua0.css", sm.platformUserAgentStylesheetContainers_getfname(0));
1011     }
1012 
1013     @Test
1014     public void testRT_38687_with_Scene() {
1015 
1016         Rectangle rect = new Rectangle(50,50) {{ getStyleClass().add("rect"); }};
1017         Scene scene = new Scene(new Group(rect));
1018         scene.setUserAgentStylesheet("test/com/sun/javafx/css/ua0.css");
1019         scene.getRoot().applyCss();
1020 
1021         StyleableProperty<Paint> fillProperty = (StyleableProperty<Paint>)rect.fillProperty();
1022         assertEquals(StyleOrigin.USER_AGENT, fillProperty.getStyleOrigin());
1023 
1024         scene.setUserAgentStylesheet("test/com/sun/javafx/css/ua1.css");
1025         scene.getRoot().applyCss();
1026 
1027         assertEquals(null, fillProperty.getStyleOrigin());
1028 
1029         rect.setFill(Color.GREEN);
1030 
1031         scene.setUserAgentStylesheet("test/com/sun/javafx/css/rt38637.css");
1032         scene.getRoot().applyCss();
1033         assertEquals(StyleOrigin.USER, fillProperty.getStyleOrigin());
1034 
1035     }
1036 
1037     @Test
1038     public void testRT_38687_with_SubScene() {
1039 
1040         Rectangle rect = new Rectangle(50,50) {{ getStyleClass().add("rect"); }};
1041         Group group = new Group(rect);
1042         SubScene subScene = new SubScene(group, 100, 100);
1043         subScene.setUserAgentStylesheet("test/com/sun/javafx/css/ua0.css");
1044 
1045         Scene scene = new Scene(new Group(subScene));
1046         scene.getRoot().applyCss();
1047 
1048         StyleableProperty<Paint> fillProperty = (StyleableProperty<Paint>)rect.fillProperty();
1049         assertEquals(StyleOrigin.USER_AGENT, fillProperty.getStyleOrigin());
1050 
1051         subScene.setUserAgentStylesheet("test/com/sun/javafx/css/ua1.css");
1052         scene.getRoot().applyCss();
1053 
1054         assertEquals(null, fillProperty.getStyleOrigin());
1055 
1056         rect.setFill(Color.GREEN);
1057 
1058         subScene.setUserAgentStylesheet("test/com/sun/javafx/css/rt38637.css");
1059         scene.getRoot().applyCss();
1060         assertEquals(StyleOrigin.USER, fillProperty.getStyleOrigin());
1061 
1062     }
1063 
1064     @Test
1065     public void testConcurrentAccess() {
1066         final int NUM_THREADS = 10;
1067         final Thread[] bgThreads = new Thread[NUM_THREADS];
1068         final AtomicBoolean err = new AtomicBoolean(false);
1069         for (int i = 0; i < NUM_THREADS; i++) {
1070             Thread thr = new Thread(() -> {
1071                 try {
1072                     for (int j = 0; j < 1000; j++) {
1073                         Scene scene = new Scene(new Group());
1074                         scene.setUserAgentStylesheet("test/com/sun/javafx/css/ua0.css");
1075                         scene.getRoot().applyCss();
1076                     }
1077                 } catch (RuntimeException ex) {
1078                     err.set(true);
1079                     throw ex;
1080                 }
1081             });
1082             thr.setName("MyThread-" + i);
1083             thr.setDaemon(true);
1084             bgThreads[i] = thr;
1085         }
1086 
1087         for (Thread thr : bgThreads) {
1088             thr.start();
1089         }
1090 
1091         try {
1092             for (Thread thr : bgThreads) {
1093                 thr.join();
1094             }
1095         } catch (InterruptedException ex) {
1096             fail("Unexpected exception waiting for threads to finish");
1097         }
1098 
1099         assertFalse("Exception during CSS processing on BG thread", err.get());
1100     }
1101 
1102 }