@@ -130,6 +130,7 @@ describe('ReactDOMFizzServerHydrationWarning', () => {
130130 : children ;
131131 }
132132
133+ // @gate enableClientRenderFallbackOnTextMismatch
133134 it ( 'suppresses but does not fix text mismatches with suppressHydrationWarning' , async ( ) => {
134135 function App ( { isClient} ) {
135136 return (
@@ -169,6 +170,47 @@ describe('ReactDOMFizzServerHydrationWarning', () => {
169170 ) ;
170171 } ) ;
171172
173+ // @gate !enableClientRenderFallbackOnTextMismatch
174+ it ( 'suppresses and fixes text mismatches with suppressHydrationWarning' , async ( ) => {
175+ function App ( { isClient} ) {
176+ return (
177+ < div >
178+ < span suppressHydrationWarning = { true } >
179+ { isClient ? 'Client Text' : 'Server Text' }
180+ </ span >
181+ < span suppressHydrationWarning = { true } > { isClient ? 2 : 1 } </ span >
182+ </ div >
183+ ) ;
184+ }
185+ await act ( ( ) => {
186+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream (
187+ < App isClient = { false } /> ,
188+ ) ;
189+ pipe ( writable ) ;
190+ } ) ;
191+ expect ( getVisibleChildren ( container ) ) . toEqual (
192+ < div >
193+ < span > Server Text</ span >
194+ < span > 1</ span >
195+ </ div > ,
196+ ) ;
197+ ReactDOMClient . hydrateRoot ( container , < App isClient = { true } /> , {
198+ onRecoverableError ( error ) {
199+ // Don't miss a hydration error. There should be none.
200+ Scheduler . log ( error . message ) ;
201+ } ,
202+ } ) ;
203+ await waitForAll ( [ ] ) ;
204+ // The text mismatch should be *silently* fixed. Even in production.
205+ expect ( getVisibleChildren ( container ) ) . toEqual (
206+ < div >
207+ < span > Client Text</ span >
208+ < span > 2</ span >
209+ </ div > ,
210+ ) ;
211+ } ) ;
212+
213+ // @gate enableClientRenderFallbackOnTextMismatch
172214 it ( 'suppresses but does not fix multiple text node mismatches with suppressHydrationWarning' , async ( ) => {
173215 function App ( { isClient} ) {
174216 return (
@@ -210,6 +252,48 @@ describe('ReactDOMFizzServerHydrationWarning', () => {
210252 ) ;
211253 } ) ;
212254
255+ // @gate !enableClientRenderFallbackOnTextMismatch
256+ it ( 'suppresses and fixes multiple text node mismatches with suppressHydrationWarning' , async ( ) => {
257+ function App ( { isClient} ) {
258+ return (
259+ < div >
260+ < span suppressHydrationWarning = { true } >
261+ { isClient ? 'Client1' : 'Server1' }
262+ { isClient ? 'Client2' : 'Server2' }
263+ </ span >
264+ </ div >
265+ ) ;
266+ }
267+ await act ( ( ) => {
268+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream (
269+ < App isClient = { false } /> ,
270+ ) ;
271+ pipe ( writable ) ;
272+ } ) ;
273+ expect ( getVisibleChildren ( container ) ) . toEqual (
274+ < div >
275+ < span >
276+ { 'Server1' }
277+ { 'Server2' }
278+ </ span >
279+ </ div > ,
280+ ) ;
281+ ReactDOMClient . hydrateRoot ( container , < App isClient = { true } /> , {
282+ onRecoverableError ( error ) {
283+ Scheduler . log ( error . message ) ;
284+ } ,
285+ } ) ;
286+ await waitForAll ( [ ] ) ;
287+ expect ( getVisibleChildren ( container ) ) . toEqual (
288+ < div >
289+ < span >
290+ { 'Client1' }
291+ { 'Client2' }
292+ </ span >
293+ </ div > ,
294+ ) ;
295+ } ) ;
296+
213297 it ( 'errors on text-to-element mismatches with suppressHydrationWarning' , async ( ) => {
214298 function App ( { isClient} ) {
215299 return (
@@ -261,6 +345,7 @@ describe('ReactDOMFizzServerHydrationWarning', () => {
261345 ) ;
262346 } ) ;
263347
348+ // @gate enableClientRenderFallbackOnTextMismatch
264349 it ( 'suppresses but does not fix client-only single text node mismatches with suppressHydrationWarning' , async ( ) => {
265350 function App ( { text} ) {
266351 return (
@@ -301,6 +386,41 @@ describe('ReactDOMFizzServerHydrationWarning', () => {
301386 ) ;
302387 } ) ;
303388
389+ // @gate !enableClientRenderFallbackOnTextMismatch
390+ it ( 'suppresses and fixes client-only single text node mismatches with suppressHydrationWarning' , async ( ) => {
391+ function App ( { isClient} ) {
392+ return (
393+ < div >
394+ < span suppressHydrationWarning = { true } >
395+ { isClient ? 'Client' : null }
396+ </ span >
397+ </ div >
398+ ) ;
399+ }
400+ await act ( ( ) => {
401+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream (
402+ < App isClient = { false } /> ,
403+ ) ;
404+ pipe ( writable ) ;
405+ } ) ;
406+ expect ( getVisibleChildren ( container ) ) . toEqual (
407+ < div >
408+ < span />
409+ </ div > ,
410+ ) ;
411+ ReactDOMClient . hydrateRoot ( container , < App isClient = { true } /> , {
412+ onRecoverableError ( error ) {
413+ Scheduler . log ( error . message ) ;
414+ } ,
415+ } ) ;
416+ await waitForAll ( [ ] ) ;
417+ expect ( getVisibleChildren ( container ) ) . toEqual (
418+ < div >
419+ < span > { 'Client' } </ span >
420+ </ div > ,
421+ ) ;
422+ } ) ;
423+
304424 // TODO: This behavior is not consistent with client-only single text node.
305425
306426 it ( 'errors on server-only single text node mismatches with suppressHydrationWarning' , async ( ) => {
0 commit comments