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