Skip to content

Commit 3d593a1

Browse files
committed
Add more non-React events to the priority list
1 parent 212b1c7 commit 3d593a1

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

packages/react-dom/src/__tests__/ReactDOMNativeEventHeuristic-test.js

+33
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,37 @@ describe('ReactDOMNativeEventHeuristic-test', () => {
258258
expect(container.textContent).toEqual('hovered');
259259
});
260260
});
261+
262+
// @gate experimental
263+
// @gate enableDiscreteEventMicroTasks && enableNativeEventPriorityInference
264+
it('mouse enter should be user-blocking but not discrete', async () => {
265+
const root = ReactDOM.unstable_createRoot(container);
266+
267+
const target = React.createRef(null);
268+
function Foo() {
269+
const [isHover, setHover] = React.useState(false);
270+
React.useLayoutEffect(() => {
271+
target.current.onmouseenter = () => setHover(true);
272+
});
273+
return <div ref={target}>{isHover ? 'hovered' : 'not hovered'}</div>;
274+
}
275+
276+
await act(async () => {
277+
root.render(<Foo />);
278+
});
279+
expect(container.textContent).toEqual('not hovered');
280+
281+
await act(async () => {
282+
// Note: React does not use native mouseenter/mouseleave events
283+
// but we should still correctly determine their priority.
284+
const mouseEnterEvent = document.createEvent('MouseEvents');
285+
mouseEnterEvent.initEvent('mouseenter', true, true);
286+
dispatchAndSetCurrentEvent(target.current, mouseEnterEvent);
287+
288+
// 3s should be enough to expire the updates
289+
Scheduler.unstable_advanceTime(3000);
290+
expect(Scheduler).toFlushExpired([]);
291+
expect(container.textContent).toEqual('hovered');
292+
});
293+
});
261294
});

packages/react-dom/src/events/ReactDOMEventListener.js

+14
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,16 @@ export function getEventPriority(domEventName: DOMEventName): * {
397397
// eslint-disable-next-line no-fallthrough
398398
case 'beforeblur':
399399
case 'afterblur':
400+
// Not used by React but could be by user code:
401+
// eslint-disable-next-line no-fallthrough
402+
case 'beforeinput':
403+
case 'blur':
404+
case 'fullscreenchange':
405+
case 'focus':
406+
case 'hashchange':
407+
case 'popstate':
408+
case 'select':
409+
case 'selectstart':
400410
return InputDiscreteLanePriority;
401411
case 'drag':
402412
case 'dragenter':
@@ -413,6 +423,10 @@ export function getEventPriority(domEventName: DOMEventName): * {
413423
case 'toggle':
414424
case 'touchmove':
415425
case 'wheel':
426+
// Not used by React but could be by user code:
427+
// eslint-disable-next-line no-fallthrough
428+
case 'mouseenter':
429+
case 'mouseleave':
416430
return InputContinuousLanePriority;
417431
default:
418432
return DefaultLanePriority;

0 commit comments

Comments
 (0)