From 73e900b0e78c752d1e045a42ddea8175679ea8f7 Mon Sep 17 00:00:00 2001 From: Ricky Date: Mon, 8 Mar 2021 16:43:44 -0500 Subject: [PATCH] Land enableDiscreteEventMicroTasks (#20954) --- .../ReactDOMNativeEventHeuristic-test.js | 10 ++-- .../src/client/ReactDOMHostConfig.js | 3 +- .../__tests__/ChangeEventPlugin-test.js | 15 ++---- .../__tests__/SimpleEventPlugin-test.js | 27 ++++------ .../src/createReactNoop.js | 7 +-- .../ReactSuspenseWithNoopRenderer-test.js | 50 ------------------- packages/shared/ReactFeatureFlags.js | 2 - .../forks/ReactFeatureFlags.native-fb.js | 1 - .../forks/ReactFeatureFlags.native-oss.js | 1 - .../forks/ReactFeatureFlags.test-renderer.js | 1 - .../ReactFeatureFlags.test-renderer.native.js | 1 - .../ReactFeatureFlags.test-renderer.www.js | 1 - .../shared/forks/ReactFeatureFlags.testing.js | 1 - .../forks/ReactFeatureFlags.testing.www.js | 1 - .../forks/ReactFeatureFlags.www-dynamic.js | 1 - .../shared/forks/ReactFeatureFlags.www.js | 1 - 16 files changed, 21 insertions(+), 102 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMNativeEventHeuristic-test.js b/packages/react-dom/src/__tests__/ReactDOMNativeEventHeuristic-test.js index 7310a9c49b95..1a37b74f71bf 100644 --- a/packages/react-dom/src/__tests__/ReactDOMNativeEventHeuristic-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMNativeEventHeuristic-test.js @@ -43,7 +43,7 @@ describe('ReactDOMNativeEventHeuristic-test', () => { } // @gate experimental - // @gate enableDiscreteEventMicroTasks && enableNativeEventPriorityInference + // @gate enableNativeEventPriorityInference it('ignores discrete events on a pending removed element', async () => { const disableButtonRef = React.createRef(); const submitButtonRef = React.createRef(); @@ -95,7 +95,7 @@ describe('ReactDOMNativeEventHeuristic-test', () => { }); // @gate experimental - // @gate enableDiscreteEventMicroTasks && enableNativeEventPriorityInference + // @gate enableNativeEventPriorityInference it('ignores discrete events on a pending removed event listener', async () => { const disableButtonRef = React.createRef(); const submitButtonRef = React.createRef(); @@ -165,7 +165,7 @@ describe('ReactDOMNativeEventHeuristic-test', () => { }); // @gate experimental - // @gate enableDiscreteEventMicroTasks && enableNativeEventPriorityInference + // @gate enableNativeEventPriorityInference it('uses the newest discrete events on a pending changed event listener', async () => { const enableButtonRef = React.createRef(); const submitButtonRef = React.createRef(); @@ -229,7 +229,7 @@ describe('ReactDOMNativeEventHeuristic-test', () => { }); // @gate experimental - // @gate enableDiscreteEventMicroTasks && enableNativeEventPriorityInference + // @gate enableNativeEventPriorityInference it('mouse over should be user-blocking but not discrete', async () => { const root = ReactDOM.unstable_createRoot(container); @@ -260,7 +260,7 @@ describe('ReactDOMNativeEventHeuristic-test', () => { }); // @gate experimental - // @gate enableDiscreteEventMicroTasks && enableNativeEventPriorityInference + // @gate enableNativeEventPriorityInference it('mouse enter should be user-blocking but not discrete', async () => { const root = ReactDOM.unstable_createRoot(container); diff --git a/packages/react-dom/src/client/ReactDOMHostConfig.js b/packages/react-dom/src/client/ReactDOMHostConfig.js index 0f27a15db3d7..dfd29b375a41 100644 --- a/packages/react-dom/src/client/ReactDOMHostConfig.js +++ b/packages/react-dom/src/client/ReactDOMHostConfig.js @@ -67,7 +67,6 @@ import { enableCreateEventHandleAPI, enableScopeAPI, enableNewReconciler, - enableDiscreteEventMicroTasks, } from 'shared/ReactFeatureFlags'; import {HostComponent, HostText} from 'react-reconciler/src/ReactWorkTags'; import {listenToAllSupportedEvents} from '../events/DOMPluginEventSystem'; @@ -404,7 +403,7 @@ export const noTimeout = -1; // ------------------- // Microtasks // ------------------- -export const supportsMicrotasks = enableDiscreteEventMicroTasks; +export const supportsMicrotasks = true; export const scheduleMicrotask: any = typeof queueMicrotask === 'function' ? queueMicrotask diff --git a/packages/react-dom/src/events/plugins/__tests__/ChangeEventPlugin-test.js b/packages/react-dom/src/events/plugins/__tests__/ChangeEventPlugin-test.js index 45828e2735ed..26630b68b11f 100644 --- a/packages/react-dom/src/events/plugins/__tests__/ChangeEventPlugin-test.js +++ b/packages/react-dom/src/events/plugins/__tests__/ChangeEventPlugin-test.js @@ -728,17 +728,10 @@ describe('ChangeEventPlugin', () => { expect(Scheduler).toHaveYielded([]); expect(input.value).toBe('initial'); - // Flush callbacks. - // Now the click update has flushed. - if (gate(flags => flags.enableDiscreteEventMicroTasks)) { - // Flush microtask queue. - await null; - expect(Scheduler).toHaveYielded(['render: ']); - expect(input.value).toBe(''); - } else { - expect(Scheduler).toFlushAndYield(['render: ']); - expect(input.value).toBe(''); - } + // Flush microtask queue. + await null; + expect(Scheduler).toHaveYielded(['render: ']); + expect(input.value).toBe(''); }); // @gate experimental diff --git a/packages/react-dom/src/events/plugins/__tests__/SimpleEventPlugin-test.js b/packages/react-dom/src/events/plugins/__tests__/SimpleEventPlugin-test.js index 795eda90c83c..9af14ccd8680 100644 --- a/packages/react-dom/src/events/plugins/__tests__/SimpleEventPlugin-test.js +++ b/packages/react-dom/src/events/plugins/__tests__/SimpleEventPlugin-test.js @@ -470,24 +470,15 @@ describe('SimpleEventPlugin', function() { 'High-pri count: 7, Low-pri count: 0', ]); - if (gate(flags => flags.enableDiscreteEventMicroTasks)) { - // Flush the microtask queue - await null; - - // At the end, both counters should equal the total number of clicks - expect(Scheduler).toHaveYielded([ - 'High-pri count: 8, Low-pri count: 0', - ]); - expect(Scheduler).toFlushAndYield([ - 'High-pri count: 8, Low-pri count: 8', - ]); - } else { - // At the end, both counters should equal the total number of clicks - expect(Scheduler).toFlushAndYield([ - 'High-pri count: 8, Low-pri count: 0', - 'High-pri count: 8, Low-pri count: 8', - ]); - } + // Flush the microtask queue + await null; + + // At the end, both counters should equal the total number of clicks + expect(Scheduler).toHaveYielded(['High-pri count: 8, Low-pri count: 0']); + expect(Scheduler).toFlushAndYield([ + 'High-pri count: 8, Low-pri count: 8', + ]); + expect(button.textContent).toEqual('High-pri count: 8, Low-pri count: 8'); }); }); diff --git a/packages/react-noop-renderer/src/createReactNoop.js b/packages/react-noop-renderer/src/createReactNoop.js index 743470966b3f..1a7ccbd07fbc 100644 --- a/packages/react-noop-renderer/src/createReactNoop.js +++ b/packages/react-noop-renderer/src/createReactNoop.js @@ -27,10 +27,7 @@ import { LegacyRoot, } from 'react-reconciler/src/ReactRootTags'; -import { - enableNativeEventPriorityInference, - enableDiscreteEventMicroTasks, -} from 'shared/ReactFeatureFlags'; +import {enableNativeEventPriorityInference} from 'shared/ReactFeatureFlags'; import ReactSharedInternals from 'shared/ReactSharedInternals'; import enqueueTask from 'shared/enqueueTask'; const {IsSomeRendererActing} = ReactSharedInternals; @@ -376,7 +373,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) { cancelTimeout: clearTimeout, noTimeout: -1, - supportsMicrotasks: enableDiscreteEventMicroTasks, + supportsMicrotasks: true, scheduleMicrotask: typeof queueMicrotask === 'function' ? queueMicrotask diff --git a/packages/react-reconciler/src/__tests__/ReactSuspenseWithNoopRenderer-test.js b/packages/react-reconciler/src/__tests__/ReactSuspenseWithNoopRenderer-test.js index 8e8a512dacf4..8ec621be0d01 100644 --- a/packages/react-reconciler/src/__tests__/ReactSuspenseWithNoopRenderer-test.js +++ b/packages/react-reconciler/src/__tests__/ReactSuspenseWithNoopRenderer-test.js @@ -3518,56 +3518,6 @@ describe('ReactSuspenseWithNoopRenderer', () => { ); }); - // @gate enableCache - // @gate !enableDiscreteEventMicroTasks - it('regression: empty render at high priority causes update to be dropped', async () => { - // Reproduces a bug where flushDiscreteUpdates starts a new (empty) render - // pass which cancels a scheduled timeout and causes the fallback never to - // be committed. - function App({text, shouldSuspend}) { - return ( - <> - - }> - {shouldSuspend && } - - - ); - } - - const root = ReactNoop.createRoot(); - ReactNoop.discreteUpdates(() => { - // High pri - root.render(); - }); - // Low pri - root.render(); - - expect(Scheduler).toFlushAndYield([ - // Render the high pri update - 'A', - // Render the low pri update - 'A', - 'Suspend! [B]', - 'Loading...', - ]); - expect(root).toMatchRenderedOutput(); - - // Triggers erstwhile bug where flushDiscreteUpdates caused an empty render - // at a previously committed level - ReactNoop.flushDiscreteUpdates(); - - // Commit the placeholder - Scheduler.unstable_advanceTime(2000); - await advanceTimers(2000); - expect(root).toMatchRenderedOutput( - <> - - - , - ); - }); - // @gate experimental // @gate enableCache it('regression: ping at high priority causes update to be dropped', async () => { diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 0d83efe10332..4adc7ac9b4dd 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -150,8 +150,6 @@ export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; - export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb.js b/packages/shared/forks/ReactFeatureFlags.native-fb.js index b0dad1851fac..6c891df1b3ea 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb.js @@ -57,7 +57,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.native-oss.js b/packages/shared/forks/ReactFeatureFlags.native-oss.js index 7a34c7623cfd..4e12e63a4fa0 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-oss.js +++ b/packages/shared/forks/ReactFeatureFlags.native-oss.js @@ -56,7 +56,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.js index adb63e0a8df5..27dd0cdc9bda 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.js @@ -56,7 +56,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js index 5c18737ebec6..8d3f3a92ea23 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.native.js @@ -56,7 +56,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js index 9ef9ee181b60..5d14b1de5fc5 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js @@ -56,7 +56,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.testing.js b/packages/shared/forks/ReactFeatureFlags.testing.js index b3240c62dad3..12fcc75be187 100644 --- a/packages/shared/forks/ReactFeatureFlags.testing.js +++ b/packages/shared/forks/ReactFeatureFlags.testing.js @@ -56,7 +56,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.testing.www.js b/packages/shared/forks/ReactFeatureFlags.testing.www.js index 65eeaee98082..c89caeffcf06 100644 --- a/packages/shared/forks/ReactFeatureFlags.testing.www.js +++ b/packages/shared/forks/ReactFeatureFlags.testing.www.js @@ -56,7 +56,6 @@ export const enableUseRefAccessWarning = false; export const enableRecursiveCommitTraversal = false; export const disableSchedulerTimeoutInWorkLoop = false; -export const enableDiscreteEventMicroTasks = false; export const enableSyncMicroTasks = false; export const enableNativeEventPriorityInference = false; export const enableLazyContextPropagation = false; diff --git a/packages/shared/forks/ReactFeatureFlags.www-dynamic.js b/packages/shared/forks/ReactFeatureFlags.www-dynamic.js index a550d45be2d1..46dc190a6127 100644 --- a/packages/shared/forks/ReactFeatureFlags.www-dynamic.js +++ b/packages/shared/forks/ReactFeatureFlags.www-dynamic.js @@ -55,7 +55,6 @@ export const enableUseRefAccessWarning = __VARIANT__; export const enableProfilerNestedUpdateScheduledHook = __VARIANT__; export const disableSchedulerTimeoutInWorkLoop = __VARIANT__; -export const enableDiscreteEventMicroTasks = __VARIANT__; export const enableSyncMicroTasks = __VARIANT__; export const enableNativeEventPriorityInference = __VARIANT__; export const enableLazyContextPropagation = __VARIANT__; diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index e4d0b079166b..35bbe2cb1fbe 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -31,7 +31,6 @@ export const { enableUseRefAccessWarning, disableNativeComponentFrames, disableSchedulerTimeoutInWorkLoop, - enableDiscreteEventMicroTasks, enableSyncMicroTasks, enableNativeEventPriorityInference, enableLazyContextPropagation,