From 7e87df809052bf4f861e61cf8c6ee58cbdcf9743 Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Thu, 15 Mar 2018 19:28:21 -0700 Subject: [PATCH] Feature flag: Use custom requestIdleCallback even when native one exists (#12385) We'll use this in www to test whether the polyfill is better at scheduling high-pri async work than the native one. My preliminary tests suggest "yes" but it's hard to say for certain, given how difficult it is to consistently reproduce the starvation issues we've been seeing. --- packages/shared/ReactDOMFrameScheduling.js | 2 ++ packages/shared/ReactFeatureFlags.js | 2 ++ packages/shared/forks/ReactFeatureFlags.native-fabric.js | 1 + packages/shared/forks/ReactFeatureFlags.native.js | 1 + packages/shared/forks/ReactFeatureFlags.persistent.js | 1 + packages/shared/forks/ReactFeatureFlags.www.js | 1 + 6 files changed, 8 insertions(+) diff --git a/packages/shared/ReactDOMFrameScheduling.js b/packages/shared/ReactDOMFrameScheduling.js index 86ddc9360f..8e50bee944 100644 --- a/packages/shared/ReactDOMFrameScheduling.js +++ b/packages/shared/ReactDOMFrameScheduling.js @@ -17,6 +17,7 @@ import type {Deadline} from 'react-reconciler'; +import {alwaysUseRequestIdleCallbackPolyfill} from 'shared/ReactFeatureFlags'; import ExecutionEnvironment from 'fbjs/lib/ExecutionEnvironment'; import warning from 'fbjs/lib/warning'; @@ -69,6 +70,7 @@ if (!ExecutionEnvironment.canUseDOM) { clearTimeout(timeoutID); }; } else if ( + alwaysUseRequestIdleCallbackPolyfill || typeof requestIdleCallback !== 'function' || typeof cancelIdleCallback !== 'function' ) { diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index 18f1495cad..b20bd56a39 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -38,6 +38,8 @@ export const replayFailedUnitOfWorkWithInvokeGuardedCallback = __DEV__; // Warn about deprecated, async-unsafe lifecycles; relates to RFC #6: export const warnAboutDeprecatedLifecycles = false; +export const alwaysUseRequestIdleCallbackPolyfill = false; + // Only used in www builds. export function addUserTimingListener() { invariant(false, 'Not implemented.'); diff --git a/packages/shared/forks/ReactFeatureFlags.native-fabric.js b/packages/shared/forks/ReactFeatureFlags.native-fabric.js index dff3f834e9..06d87c3182 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fabric.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fabric.js @@ -24,6 +24,7 @@ export const replayFailedUnitOfWorkWithInvokeGuardedCallback = __DEV__; export const enableMutatingReconciler = false; export const enableNoopReconciler = false; export const enablePersistentReconciler = true; +export const alwaysUseRequestIdleCallbackPolyfill = false; // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.native.js b/packages/shared/forks/ReactFeatureFlags.native.js index 4a50214497..1c0ef01928 100644 --- a/packages/shared/forks/ReactFeatureFlags.native.js +++ b/packages/shared/forks/ReactFeatureFlags.native.js @@ -27,6 +27,7 @@ export const enableUserTimingAPI = __DEV__; export const enableMutatingReconciler = true; export const enableNoopReconciler = false; export const enablePersistentReconciler = false; +export const alwaysUseRequestIdleCallbackPolyfill = false; // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.persistent.js b/packages/shared/forks/ReactFeatureFlags.persistent.js index 86b60c97b4..d9aa80be57 100644 --- a/packages/shared/forks/ReactFeatureFlags.persistent.js +++ b/packages/shared/forks/ReactFeatureFlags.persistent.js @@ -25,6 +25,7 @@ export const replayFailedUnitOfWorkWithInvokeGuardedCallback = __DEV__; export const enableMutatingReconciler = false; export const enableNoopReconciler = false; export const enablePersistentReconciler = true; +export const alwaysUseRequestIdleCallbackPolyfill = false; // Only used in www builds. export function addUserTimingListener() { diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index c45ba2f06f..5cc50cc07f 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -17,6 +17,7 @@ export const { debugRenderPhaseSideEffectsForStrictMode, warnAboutDeprecatedLifecycles, replayFailedUnitOfWorkWithInvokeGuardedCallback, + alwaysUseRequestIdleCallbackPolyfill, } = require('ReactFeatureFlags'); // The rest of the flags are static for better dead code elimination.