@@ -483,6 +483,46 @@ describe('ReactDOMServerIntegration', () => {
483
483
}
484
484
} ) ;
485
485
486
+ it ( 'does not pollute later renders when stream destroyed' , ( ) => {
487
+ const LoggedInUser = React . createContext ( 'default' ) ;
488
+
489
+ const AppWithUser = user => (
490
+ < LoggedInUser . Provider value = { user } >
491
+ < header >
492
+ < LoggedInUser . Consumer > { whoAmI => whoAmI } </ LoggedInUser . Consumer >
493
+ </ header >
494
+ </ LoggedInUser . Provider >
495
+ ) ;
496
+
497
+ const stream = ReactDOMServer . renderToNodeStream (
498
+ AppWithUser ( 'Amy' ) ,
499
+ ) . setEncoding ( 'utf8' ) ;
500
+
501
+ const { threadID} = stream . partialRenderer ;
502
+
503
+ // Read enough to render Provider but not enough for it to be exited
504
+ stream . _read ( 10 ) ;
505
+ expect ( LoggedInUser [ threadID ] ) . toBe ( 'Amy' ) ;
506
+
507
+ stream . destroy ( ) ;
508
+
509
+ const AppWithUserNoProvider = ( ) => (
510
+ < LoggedInUser . Consumer > { whoAmI => whoAmI } </ LoggedInUser . Consumer >
511
+ ) ;
512
+
513
+ const stream2 = ReactDOMServer . renderToNodeStream (
514
+ AppWithUserNoProvider ( ) ,
515
+ ) . setEncoding ( 'utf8' ) ;
516
+
517
+ // Sanity check to ensure 2nd render has same threadID as 1st render,
518
+ // otherwise this test is not testing what it's meant to
519
+ expect ( stream2 . partialRenderer . threadID ) . toBe ( threadID ) ;
520
+
521
+ const markup = stream2 . read ( Infinity ) ;
522
+
523
+ expect ( markup ) . toBe ( 'default' ) ;
524
+ } ) ;
525
+
486
526
it ( 'frees context value reference when stream destroyed' , ( ) => {
487
527
const LoggedInUser = React . createContext ( 'default' ) ;
488
528
0 commit comments