@@ -16,6 +16,7 @@ let act;
16
16
let getCacheForType ;
17
17
let useState ;
18
18
let Suspense ;
19
+ let Offscreen ;
19
20
let startTransition ;
20
21
21
22
let caches ;
@@ -34,6 +35,7 @@ describe('ReactInteractionTracing', () => {
34
35
useState = React . useState ;
35
36
startTransition = React . startTransition ;
36
37
Suspense = React . Suspense ;
38
+ Offscreen = React . unstable_Offscreen ;
37
39
38
40
getCacheForType = React . unstable_getCacheForType ;
39
41
@@ -1362,4 +1364,74 @@ describe('ReactInteractionTracing', () => {
1362
1364
] ) ;
1363
1365
} ) ;
1364
1366
} ) ;
1367
+
1368
+ // @gate enableTransitionTracing
1369
+ it ( 'offscreen trees should not stop transition from completing' , async ( ) => {
1370
+ const transitionCallbacks = {
1371
+ onTransitionStart : ( name , startTime ) => {
1372
+ Scheduler . unstable_yieldValue (
1373
+ `onTransitionStart(${ name } , ${ startTime } )` ,
1374
+ ) ;
1375
+ } ,
1376
+ onTransitionComplete : ( name , startTime , endTime ) => {
1377
+ Scheduler . unstable_yieldValue (
1378
+ `onTransitionComplete(${ name } , ${ startTime } , ${ endTime } )` ,
1379
+ ) ;
1380
+ } ,
1381
+ onMarkerComplete : ( transitioName , markerName , startTime , endTime ) => {
1382
+ Scheduler . unstable_yieldValue (
1383
+ `onMarkerComplete(${ transitioName } , ${ markerName } , ${ startTime } , ${ endTime } )` ,
1384
+ ) ;
1385
+ } ,
1386
+ } ;
1387
+
1388
+ function App ( ) {
1389
+ return (
1390
+ < React . unstable_TracingMarker name = "marker" >
1391
+ < Suspense fallback = { < Text text = "Loading..." /> } >
1392
+ < AsyncText text = "Text" />
1393
+ </ Suspense >
1394
+ < Offscreen mode = "hidden" >
1395
+ < Suspense fallback = { < Text text = "Hidden Loading..." /> } >
1396
+ < AsyncText text = "Hidden Text" />
1397
+ </ Suspense >
1398
+ </ Offscreen >
1399
+ </ React . unstable_TracingMarker >
1400
+ ) ;
1401
+ }
1402
+
1403
+ const root = ReactNoop . createRoot ( {
1404
+ unstable_transitionCallbacks : transitionCallbacks ,
1405
+ } ) ;
1406
+ await act ( ( ) => {
1407
+ startTransition ( ( ) => root . render ( < App /> ) , { name : 'transition' } ) ;
1408
+ ReactNoop . expire ( 1000 ) ;
1409
+ advanceTimers ( 1000 ) ;
1410
+ } ) ;
1411
+ expect ( Scheduler ) . toHaveYielded ( [
1412
+ 'Suspend [Text]' ,
1413
+ 'Loading...' ,
1414
+ 'Suspend [Hidden Text]' ,
1415
+ 'Hidden Loading...' ,
1416
+ 'onTransitionStart(transition, 0)' ,
1417
+ ] ) ;
1418
+
1419
+ await act ( ( ) => {
1420
+ resolveText ( 'Text' ) ;
1421
+ ReactNoop . expire ( 1000 ) ;
1422
+ advanceTimers ( 1000 ) ;
1423
+ } ) ;
1424
+ expect ( Scheduler ) . toHaveYielded ( [
1425
+ 'Text' ,
1426
+ 'onMarkerComplete(transition, marker, 0, 2000)' ,
1427
+ 'onTransitionComplete(transition, 0, 2000)' ,
1428
+ ] ) ;
1429
+
1430
+ await act ( ( ) => {
1431
+ resolveText ( 'Hidden Text' ) ;
1432
+ ReactNoop . expire ( 1000 ) ;
1433
+ advanceTimers ( 1000 ) ;
1434
+ } ) ;
1435
+ expect ( Scheduler ) . toHaveYielded ( [ 'Hidden Text' ] ) ;
1436
+ } ) ;
1365
1437
} ) ;
0 commit comments