diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js index df1c71f3fd586..50afd73d1f937 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFizzServer-test.js @@ -6926,7 +6926,14 @@ describe('ReactDOMFizzServer', () => { expect(getVisibleChildren(container)).toEqual(
{'Loading1'} - {'Hello'} + {/* + This used to show "Hello" in this slot because the boundary was able to be flushed + early but we now prevent flushing while pendingRootTasks is not zero. This is how Edge + would work anyway because you don't get the stream until the root is unblocked on a resume + so Node now aligns with edge bevavior + {'Hello'} + */} + {'Loading2'} {'Loading3'}
, ); diff --git a/packages/react-dom/src/__tests__/ReactDOMFloat-test.js b/packages/react-dom/src/__tests__/ReactDOMFloat-test.js index 3eabcb5781c29..b2331c17f2829 100644 --- a/packages/react-dom/src/__tests__/ReactDOMFloat-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMFloat-test.js @@ -5034,6 +5034,51 @@ body { ); }); + it('should never flush hoistables before the preamble', async () => { + let resolve; + const promise = new Promise(res => { + resolve = res; + }); + + function App() { + ReactDOM.preinit('foo', {as: 'script'}); + React.use(promise); + return ( + + hello + + ); + } + + await act(() => { + renderToPipeableStream().pipe(writable); + }); + + // we assert the default JSDOM still in tact + expect(getMeaningfulChildren(document)).toEqual( + + + +
+ + , + ); + + await act(() => { + resolve(); + }); + + // we assert the DOM was replaced entirely because we streamed an opening html tag + expect(getMeaningfulChildren(document)).toEqual( + + +