@@ -2063,7 +2063,8 @@ describe('ReactSuspenseWithNoopRenderer', () => {
20632063 Scheduler . unstable_runWithPriority ( Scheduler . unstable_IdlePriority , ( ) =>
20642064 ReactNoop . render ( < Foo renderContent = { 2 } /> ) ,
20652065 ) ;
2066- expect ( Scheduler ) . toFlushAndYield ( [ 'Suspend! [A]' , 'Loading A...' ] ) ;
2066+ // We won't even work on Idle priority.
2067+ expect ( Scheduler ) . toFlushAndYield ( [ ] ) ;
20672068
20682069 // We're still suspended.
20692070 expect ( ReactNoop . getChildren ( ) ) . toEqual ( [ ] ) ;
@@ -2630,4 +2631,116 @@ describe('ReactSuspenseWithNoopRenderer', () => {
26302631
26312632 expect ( root ) . toMatchRenderedOutput ( < span prop = "Foo" /> ) ;
26322633 } ) ;
2634+
2635+ it ( 'should not render hidden content while suspended on higher pri' , async ( ) => {
2636+ function Offscreen ( ) {
2637+ Scheduler . unstable_yieldValue ( 'Offscreen' ) ;
2638+ return 'Offscreen' ;
2639+ }
2640+ function App ( { showContent} ) {
2641+ React . useLayoutEffect ( ( ) => {
2642+ Scheduler . unstable_yieldValue ( 'Commit' ) ;
2643+ } ) ;
2644+ return (
2645+ < >
2646+ < div hidden = { true } >
2647+ < Offscreen />
2648+ </ div >
2649+ < Suspense fallback = { < Text text = "Loading..." /> } >
2650+ { showContent ? < AsyncText text = "A" ms = { 2000 } /> : null }
2651+ </ Suspense >
2652+ </ >
2653+ ) ;
2654+ }
2655+
2656+ // Initial render.
2657+ ReactNoop . render ( < App showContent = { false } /> ) ;
2658+ expect ( Scheduler ) . toFlushAndYieldThrough ( [ 'Commit' ] ) ;
2659+ expect ( ReactNoop ) . toMatchRenderedOutput ( < div hidden = { true } /> ) ;
2660+
2661+ // Start transition.
2662+ React . unstable_withSuspenseConfig (
2663+ ( ) => {
2664+ ReactNoop . render ( < App showContent = { true } /> ) ;
2665+ } ,
2666+ { timeoutMs : 2000 } ,
2667+ ) ;
2668+
2669+ expect ( Scheduler ) . toFlushAndYield ( [ 'Suspend! [A]' , 'Loading...' ] ) ;
2670+ Scheduler . unstable_advanceTime ( 2000 ) ;
2671+ await advanceTimers ( 2000 ) ;
2672+ expect ( Scheduler ) . toHaveYielded ( [ 'Promise resolved [A]' ] ) ;
2673+ expect ( Scheduler ) . toFlushAndYieldThrough ( [ 'A' , 'Commit' ] ) ;
2674+ expect ( ReactNoop ) . toMatchRenderedOutput (
2675+ < >
2676+ < div hidden = { true } />
2677+ < span prop = "A" />
2678+ </ > ,
2679+ ) ;
2680+ expect ( Scheduler ) . toFlushAndYield ( [ 'Offscreen' ] ) ;
2681+ expect ( ReactNoop ) . toMatchRenderedOutput (
2682+ < >
2683+ < div hidden = { true } > Offscreen</ div >
2684+ < span prop = "A" />
2685+ </ > ,
2686+ ) ;
2687+ } ) ;
2688+
2689+ it ( 'should be able to unblock higher pri content before suspended hidden' , async ( ) => {
2690+ function Offscreen ( ) {
2691+ Scheduler . unstable_yieldValue ( 'Offscreen' ) ;
2692+ return 'Offscreen' ;
2693+ }
2694+ function App ( { showContent} ) {
2695+ React . useLayoutEffect ( ( ) => {
2696+ Scheduler . unstable_yieldValue ( 'Commit' ) ;
2697+ } ) ;
2698+ return (
2699+ < Suspense fallback = { < Text text = "Loading..." /> } >
2700+ < div hidden = { true } >
2701+ < AsyncText text = "A" ms = { 2000 } />
2702+ < Offscreen />
2703+ </ div >
2704+ { showContent ? < AsyncText text = "A" ms = { 2000 } /> : null }
2705+ </ Suspense >
2706+ ) ;
2707+ }
2708+
2709+ // Initial render.
2710+ ReactNoop . render ( < App showContent = { false } /> ) ;
2711+ expect ( Scheduler ) . toFlushAndYieldThrough ( [ 'Commit' ] ) ;
2712+ expect ( ReactNoop ) . toMatchRenderedOutput ( < div hidden = { true } /> ) ;
2713+
2714+ // Partially render through the hidden content.
2715+ expect ( Scheduler ) . toFlushAndYieldThrough ( [ 'Suspend! [A]' ] ) ;
2716+
2717+ // Start transition.
2718+ React . unstable_withSuspenseConfig (
2719+ ( ) => {
2720+ ReactNoop . render ( < App showContent = { true } /> ) ;
2721+ } ,
2722+ { timeoutMs : 5000 } ,
2723+ ) ;
2724+
2725+ expect ( Scheduler ) . toFlushAndYield ( [ 'Suspend! [A]' , 'Loading...' ] ) ;
2726+ Scheduler . unstable_advanceTime ( 2000 ) ;
2727+ await advanceTimers ( 2000 ) ;
2728+ expect ( Scheduler ) . toHaveYielded ( [ 'Promise resolved [A]' ] ) ;
2729+ expect ( Scheduler ) . toFlushAndYieldThrough ( [ 'A' , 'Commit' ] ) ;
2730+ expect ( ReactNoop ) . toMatchRenderedOutput (
2731+ < >
2732+ < div hidden = { true } />
2733+ < span prop = "A" />
2734+ </ > ,
2735+ ) ;
2736+ expect ( Scheduler ) . toFlushAndYield ( [ 'A' , 'Offscreen' ] ) ;
2737+ expect ( ReactNoop ) . toMatchRenderedOutput (
2738+ < >
2739+ < div hidden = { true } >
2740+ < span prop = "A" /> Offscreen
2741+ </ div >
2742+ < span prop = "A" />
2743+ </ > ,
2744+ ) ;
2745+ } ) ;
26332746} ) ;
0 commit comments