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