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 }