From 38f668f95f82c7bf1fb4a893edf220d1320ebfcc Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 26 Jan 2021 17:09:51 -0700 Subject: [PATCH 1/6] Queue discrete events in microtask --- packages/react-art/src/ReactARTHostConfig.js | 3 +++ .../react-dom/src/client/ReactDOMHostConfig.js | 15 +++++++++++++++ .../src/ReactFabricHostConfig.js | 3 +++ .../src/ReactNativeHostConfig.js | 3 +++ .../src/ReactTestHostConfig.js | 15 +++++++++++++++ 5 files changed, 39 insertions(+) diff --git a/packages/react-art/src/ReactARTHostConfig.js b/packages/react-art/src/ReactARTHostConfig.js index 43a563e90aa23..ad2d73062240e 100644 --- a/packages/react-art/src/ReactARTHostConfig.js +++ b/packages/react-art/src/ReactARTHostConfig.js @@ -330,6 +330,9 @@ export function getChildHostContext() { export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; +export function queueMicrotask() { + invariant(false, 'Not implemented.'); +} export function shouldSetTextContent(type, props) { return ( diff --git a/packages/react-dom/src/client/ReactDOMHostConfig.js b/packages/react-dom/src/client/ReactDOMHostConfig.js index 8de2f2c5c7ca4..c0f0c52fdbb86 100644 --- a/packages/react-dom/src/client/ReactDOMHostConfig.js +++ b/packages/react-dom/src/client/ReactDOMHostConfig.js @@ -384,6 +384,21 @@ export const scheduleTimeout: any = export const cancelTimeout: any = typeof clearTimeout === 'function' ? clearTimeout : (undefined: any); export const noTimeout = -1; +export const queueMicrotask: (Function => void) | undefined = + typeof queueMicrotask === 'function' + ? queueMicrotask + : typeof Promise !== 'undefined' + ? callback => + Promise.resolve(null) + .then(callback) + .catch(handleErrorInNextTick) + : scheduleTimeout; + +function handleErrorInNextTick(error) { + setTimeout(() => { + throw error; + }); +} // ------------------- // Mutation diff --git a/packages/react-native-renderer/src/ReactFabricHostConfig.js b/packages/react-native-renderer/src/ReactFabricHostConfig.js index 636542e8d426b..a960f26c5fd0a 100644 --- a/packages/react-native-renderer/src/ReactFabricHostConfig.js +++ b/packages/react-native-renderer/src/ReactFabricHostConfig.js @@ -348,6 +348,9 @@ export const warnsIfNotActing = false; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; +export function queueMicrotask() { + invariant(false, 'Not implemented.'); +} // ------------------- // Persistence diff --git a/packages/react-native-renderer/src/ReactNativeHostConfig.js b/packages/react-native-renderer/src/ReactNativeHostConfig.js index eba0a2b90462b..69cb665d26d03 100644 --- a/packages/react-native-renderer/src/ReactNativeHostConfig.js +++ b/packages/react-native-renderer/src/ReactNativeHostConfig.js @@ -247,6 +247,9 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; +export function queueMicrotask() { + invariant(false, 'Not implemented.'); +} export function shouldSetTextContent(type: string, props: Props): boolean { // TODO (bvaughn) Revisit this decision. diff --git a/packages/react-test-renderer/src/ReactTestHostConfig.js b/packages/react-test-renderer/src/ReactTestHostConfig.js index a6d661d5fe9cc..eb5ceaa51404b 100644 --- a/packages/react-test-renderer/src/ReactTestHostConfig.js +++ b/packages/react-test-renderer/src/ReactTestHostConfig.js @@ -220,6 +220,21 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; +export const queueMicrotask = + typeof queueMicrotask === 'function' + ? queueMicrotask + : typeof Promise !== 'undefined' + ? callback => + Promise.resolve(null) + .then(callback) + .catch(handleErrorInNextTick) + : scheduleTimeout; + +function handleErrorInNextTick(error) { + setTimeout(() => { + throw error; + }); +} export const noTimeout = -1; // ------------------- From 725b9524eedbe4dea2055e7454317388fa17a1a7 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 26 Jan 2021 19:16:34 -0700 Subject: [PATCH 2/6] Fix flow types --- packages/react-art/src/ReactARTHostConfig.js | 2 +- packages/react-dom/src/client/ReactDOMHostConfig.js | 6 +++--- packages/react-native-renderer/src/ReactFabricHostConfig.js | 2 +- packages/react-native-renderer/src/ReactNativeHostConfig.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/react-art/src/ReactARTHostConfig.js b/packages/react-art/src/ReactARTHostConfig.js index ad2d73062240e..703d2c21c679d 100644 --- a/packages/react-art/src/ReactARTHostConfig.js +++ b/packages/react-art/src/ReactARTHostConfig.js @@ -330,7 +330,7 @@ export function getChildHostContext() { export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; -export function queueMicrotask() { +export function queueMicrotask(callback: Function) { invariant(false, 'Not implemented.'); } diff --git a/packages/react-dom/src/client/ReactDOMHostConfig.js b/packages/react-dom/src/client/ReactDOMHostConfig.js index c0f0c52fdbb86..969f6f88b02a6 100644 --- a/packages/react-dom/src/client/ReactDOMHostConfig.js +++ b/packages/react-dom/src/client/ReactDOMHostConfig.js @@ -384,9 +384,9 @@ export const scheduleTimeout: any = export const cancelTimeout: any = typeof clearTimeout === 'function' ? clearTimeout : (undefined: any); export const noTimeout = -1; -export const queueMicrotask: (Function => void) | undefined = - typeof queueMicrotask === 'function' - ? queueMicrotask +export const queueMicrotask: any = + typeof global.queueMicrotask === 'function' + ? global.queueMicrotask : typeof Promise !== 'undefined' ? callback => Promise.resolve(null) diff --git a/packages/react-native-renderer/src/ReactFabricHostConfig.js b/packages/react-native-renderer/src/ReactFabricHostConfig.js index a960f26c5fd0a..7329a5f04a043 100644 --- a/packages/react-native-renderer/src/ReactFabricHostConfig.js +++ b/packages/react-native-renderer/src/ReactFabricHostConfig.js @@ -348,7 +348,7 @@ export const warnsIfNotActing = false; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; -export function queueMicrotask() { +export function queueMicrotask(callback: Function) { invariant(false, 'Not implemented.'); } diff --git a/packages/react-native-renderer/src/ReactNativeHostConfig.js b/packages/react-native-renderer/src/ReactNativeHostConfig.js index 69cb665d26d03..5f64845f31421 100644 --- a/packages/react-native-renderer/src/ReactNativeHostConfig.js +++ b/packages/react-native-renderer/src/ReactNativeHostConfig.js @@ -247,7 +247,7 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const noTimeout = -1; -export function queueMicrotask() { +export function queueMicrotask(callback: Function) { invariant(false, 'Not implemented.'); } From 4e76093e1973855d9b6a4b19a50c7e28ee8bff64 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 26 Jan 2021 19:19:43 -0700 Subject: [PATCH 3/6] Add to createReactNoop --- .../react-noop-renderer/src/createReactNoop.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/react-noop-renderer/src/createReactNoop.js b/packages/react-noop-renderer/src/createReactNoop.js index ec2a6d714b4f9..76be58e4a80dd 100644 --- a/packages/react-noop-renderer/src/createReactNoop.js +++ b/packages/react-noop-renderer/src/createReactNoop.js @@ -29,6 +29,7 @@ import { import ReactSharedInternals from 'shared/ReactSharedInternals'; import enqueueTask from 'shared/enqueueTask'; +import {scheduleTimeout} from 'react-dom/src/client/ReactDOMHostConfig'; const {IsSomeRendererActing} = ReactSharedInternals; type Container = { @@ -371,6 +372,19 @@ function createReactNoop(reconciler: Function, useMutation: boolean) { scheduleTimeout: setTimeout, cancelTimeout: clearTimeout, noTimeout: -1, + queueMicrotask: + typeof queueMicrotask === 'function' + ? queueMicrotask + : typeof Promise !== 'undefined' + ? callback => + Promise.resolve(null) + .then(callback) + .catch(error => { + setTimeout(() => { + throw error; + }); + }) + : scheduleTimeout, prepareForCommit(): null | Object { return null; From 11907deb96bb757d41cb016d8976c0cc6d939f5f Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 26 Jan 2021 19:53:55 -0700 Subject: [PATCH 4/6] More flow types --- packages/react-test-renderer/src/ReactTestHostConfig.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-test-renderer/src/ReactTestHostConfig.js b/packages/react-test-renderer/src/ReactTestHostConfig.js index eb5ceaa51404b..026c74bd96657 100644 --- a/packages/react-test-renderer/src/ReactTestHostConfig.js +++ b/packages/react-test-renderer/src/ReactTestHostConfig.js @@ -221,10 +221,10 @@ export const warnsIfNotActing = true; export const scheduleTimeout = setTimeout; export const cancelTimeout = clearTimeout; export const queueMicrotask = - typeof queueMicrotask === 'function' - ? queueMicrotask + typeof global.queueMicrotask === 'function' + ? global.queueMicrotask : typeof Promise !== 'undefined' - ? callback => + ? (callback: Function) => Promise.resolve(null) .then(callback) .catch(handleErrorInNextTick) From 5d50687100bab962ca56fa202cca6df3689d6764 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 26 Jan 2021 21:25:10 -0700 Subject: [PATCH 5/6] Remove import --- packages/react-noop-renderer/src/createReactNoop.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-noop-renderer/src/createReactNoop.js b/packages/react-noop-renderer/src/createReactNoop.js index 76be58e4a80dd..15bb2e28fb838 100644 --- a/packages/react-noop-renderer/src/createReactNoop.js +++ b/packages/react-noop-renderer/src/createReactNoop.js @@ -29,7 +29,6 @@ import { import ReactSharedInternals from 'shared/ReactSharedInternals'; import enqueueTask from 'shared/enqueueTask'; -import {scheduleTimeout} from 'react-dom/src/client/ReactDOMHostConfig'; const {IsSomeRendererActing} = ReactSharedInternals; type Container = { @@ -384,7 +383,7 @@ function createReactNoop(reconciler: Function, useMutation: boolean) { throw error; }); }) - : scheduleTimeout, + : setTimeout, prepareForCommit(): null | Object { return null; From ccfee9ad3b20ab38ed7a263fdf7861244e729212 Mon Sep 17 00:00:00 2001 From: Rick Hanlon Date: Tue, 26 Jan 2021 21:57:48 -0700 Subject: [PATCH 6/6] Add to custom HostConfig as well --- .../react-reconciler/src/forks/ReactFiberHostConfig.custom.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js b/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js index 60e06740ad769..e195b898749f8 100644 --- a/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js +++ b/packages/react-reconciler/src/forks/ReactFiberHostConfig.custom.js @@ -54,6 +54,7 @@ export const shouldSetTextContent = $$$hostConfig.shouldSetTextContent; export const createTextInstance = $$$hostConfig.createTextInstance; export const scheduleTimeout = $$$hostConfig.scheduleTimeout; export const cancelTimeout = $$$hostConfig.cancelTimeout; +export const queueMicrotask = $$$hostConfig.queueMicrotask; export const noTimeout = $$$hostConfig.noTimeout; export const now = $$$hostConfig.now; export const isPrimaryRenderer = $$$hostConfig.isPrimaryRenderer;