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 }