@@ -52,6 +52,12 @@ describe('ReactDOMServerIntegrationUserInteraction', () => {
5252 }
5353 this . setState ( { value : event . target . value } ) ;
5454 }
55+ componentDidMount ( ) {
56+ if ( this . props . cascade ) {
57+ // Trigger a cascading render immediately upon hydration which rerenders the input.
58+ this . setState ( { cascade : true } ) ;
59+ }
60+ }
5561 render ( ) {
5662 return (
5763 < input
@@ -73,6 +79,12 @@ describe('ReactDOMServerIntegrationUserInteraction', () => {
7379 }
7480 this . setState ( { value : event . target . value } ) ;
7581 }
82+ componentDidMount ( ) {
83+ if ( this . props . cascade ) {
84+ // Trigger a cascading render immediately upon hydration which rerenders the textarea.
85+ this . setState ( { cascade : true } ) ;
86+ }
87+ }
7688 render ( ) {
7789 return (
7890 < textarea
@@ -93,6 +105,12 @@ describe('ReactDOMServerIntegrationUserInteraction', () => {
93105 }
94106 this . setState ( { value : event . target . checked } ) ;
95107 }
108+ componentDidMount ( ) {
109+ if ( this . props . cascade ) {
110+ // Trigger a cascading render immediately upon hydration which rerenders the checkbox.
111+ this . setState ( { cascade : true } ) ;
112+ }
113+ }
96114 render ( ) {
97115 return (
98116 < input
@@ -114,6 +132,12 @@ describe('ReactDOMServerIntegrationUserInteraction', () => {
114132 }
115133 this . setState ( { value : event . target . value } ) ;
116134 }
135+ componentDidMount ( ) {
136+ if ( this . props . cascade ) {
137+ // Trigger a cascading render immediately upon hydration which rerenders the select.
138+ this . setState ( { cascade : true } ) ;
139+ }
140+ }
117141 render ( ) {
118142 return (
119143 < select
@@ -361,5 +385,68 @@ describe('ReactDOMServerIntegrationUserInteraction', () => {
361385 gate ( flags => flags . enableHydrationChangeEvent ) ? 1 : 0 ,
362386 ) ;
363387 } ) ;
388+
389+ // @gate enableHydrationChangeEvent
390+ it ( 'should not blow away user-entered text cascading hydration to a controlled input' , async ( ) => {
391+ let changeCount = 0 ;
392+ await testUserInteractionBeforeClientRender (
393+ < ControlledInput onChange = { ( ) => changeCount ++ } cascade = { true } /> ,
394+ ) ;
395+ expect ( changeCount ) . toBe (
396+ gate ( flags => flags . enableHydrationChangeEvent ) ? 1 : 0 ,
397+ ) ;
398+ } ) ;
399+
400+ // @gate enableHydrationChangeEvent
401+ it ( 'should not blow away user-interaction cascading hydration to a controlled range input' , async ( ) => {
402+ let changeCount = 0 ;
403+ await testUserInteractionBeforeClientRender (
404+ < ControlledInput
405+ type = "range"
406+ initialValue = "0.25"
407+ onChange = { ( ) => changeCount ++ }
408+ cascade = { true }
409+ /> ,
410+ '0.25' ,
411+ '1' ,
412+ ) ;
413+ expect ( changeCount ) . toBe (
414+ gate ( flags => flags . enableHydrationChangeEvent ) ? 1 : 0 ,
415+ ) ;
416+ } ) ;
417+
418+ // @gate enableHydrationChangeEvent
419+ it ( 'should not blow away user-entered text cascading hydration to a controlled checkbox' , async ( ) => {
420+ let changeCount = 0 ;
421+ await testUserInteractionBeforeClientRender (
422+ < ControlledCheckbox onChange = { ( ) => changeCount ++ } cascade = { true } /> ,
423+ true ,
424+ false ,
425+ 'checked' ,
426+ ) ;
427+ expect ( changeCount ) . toBe (
428+ gate ( flags => flags . enableHydrationChangeEvent ) ? 1 : 0 ,
429+ ) ;
430+ } ) ;
431+
432+ // @gate enableHydrationChangeEvent
433+ it ( 'should not blow away user-entered text cascading hydration to a controlled textarea' , async ( ) => {
434+ let changeCount = 0 ;
435+ await testUserInteractionBeforeClientRender (
436+ < ControlledTextArea onChange = { ( ) => changeCount ++ } cascade = { true } /> ,
437+ ) ;
438+ expect ( changeCount ) . toBe ( 1 ) ;
439+ } ) ;
440+
441+ // @gate enableHydrationChangeEvent
442+ it ( 'should not blow away user-selected value cascading hydration to an controlled select' , async ( ) => {
443+ let changeCount = 0 ;
444+ await testUserInteractionBeforeClientRender (
445+ < ControlledSelect onChange = { ( ) => changeCount ++ } cascade = { true } /> ,
446+ ) ;
447+ expect ( changeCount ) . toBe (
448+ gate ( flags => flags . enableHydrationChangeEvent ) ? 1 : 0 ,
449+ ) ;
450+ } ) ;
364451 } ) ;
365452} ) ;
0 commit comments