From eba4b251afb2fe11d510edde68e78c0e8d0be3f0 Mon Sep 17 00:00:00 2001 From: Tianyu Yao Date: Fri, 20 Jan 2023 19:27:24 -0800 Subject: [PATCH] Custom events inherit discrete prirority from outer events --- .../__tests__/ReactDOMNestedEvents-test.js | 160 +++++++++++++++++- 1 file changed, 159 insertions(+), 1 deletion(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMNestedEvents-test.js b/packages/react-dom/src/__tests__/ReactDOMNestedEvents-test.js index 6c632cd31e..1fac2c6ed1 100644 --- a/packages/react-dom/src/__tests__/ReactDOMNestedEvents-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMNestedEvents-test.js @@ -11,6 +11,7 @@ describe('ReactDOMNestedEvents', () => { let React; + let ReactDOM; let ReactDOMClient; let Scheduler; let act; @@ -19,13 +20,14 @@ describe('ReactDOMNestedEvents', () => { beforeEach(() => { jest.resetModules(); React = require('react'); + ReactDOM = require('react-dom'); ReactDOMClient = require('react-dom/client'); Scheduler = require('scheduler'); act = require('jest-react').act; useState = React.useState; }); - test('nested event dispatches should not cause updates to flush', async () => { + it('nested event dispatches should not cause updates to flush', async () => { const buttonRef = React.createRef(null); function App() { const [isClicked, setIsClicked] = useState(false); @@ -72,4 +74,160 @@ describe('ReactDOMNestedEvents', () => { ]); expect(buttonRef.current.innerHTML).toEqual('Clicked: true, Focused: true'); }); + + it('custom events inside a discrete event is batched with sync updates and flushed synchronously', async () => { + const buttonRef = React.createRef(null); + function App() { + const [isClicked, setIsClicked] = useState(false); + const [isCustom, setIsCustom] = useState(false); + const onClick = () => { + setIsClicked(true); + buttonRef.current.dispatchEvent(new Event('custom')); + }; + const onCustomEvent = () => { + setIsCustom(true); + }; + React.useEffect(() => { + buttonRef.current.addEventListener('click', onClick); + buttonRef.current.addEventListener('custom', onCustomEvent); + }, []); + Scheduler.unstable_yieldValue(`render: ${isClicked} / ${isCustom}`); + return