mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
Add back skipUnmountedBoundaries flag only for www (#23383)
There are a few internal tests that still need to be updated, so I'm adding this flag back for www only. The desired behavior rolled out to 10% public, so we're confident there are no issues. The open source behavior remains (skipUnmountedBoundaries = true).
This commit is contained in:
@@ -42,6 +42,7 @@ describe('ReactErrorBoundaries', () => {
|
||||
PropTypes = require('prop-types');
|
||||
ReactFeatureFlags = require('shared/ReactFeatureFlags');
|
||||
ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;
|
||||
ReactFeatureFlags.skipUnmountedBoundaries = true;
|
||||
ReactDOM = require('react-dom');
|
||||
React = require('react');
|
||||
act = require('jest-react').act;
|
||||
|
||||
@@ -35,6 +35,7 @@ import {
|
||||
enableSchedulingProfiler,
|
||||
disableSchedulerTimeoutInWorkLoop,
|
||||
enableStrictEffects,
|
||||
skipUnmountedBoundaries,
|
||||
enableUpdaterTracking,
|
||||
enableCache,
|
||||
enableTransitionTracing,
|
||||
@@ -2537,7 +2538,13 @@ export function captureCommitPhaseError(
|
||||
return;
|
||||
}
|
||||
|
||||
let fiber = nearestMountedAncestor;
|
||||
let fiber = null;
|
||||
if (skipUnmountedBoundaries) {
|
||||
fiber = nearestMountedAncestor;
|
||||
} else {
|
||||
fiber = sourceFiber.return;
|
||||
}
|
||||
|
||||
while (fiber !== null) {
|
||||
if (fiber.tag === HostRoot) {
|
||||
captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);
|
||||
@@ -2570,9 +2577,14 @@ export function captureCommitPhaseError(
|
||||
}
|
||||
|
||||
if (__DEV__) {
|
||||
// TODO: Until we re-land skipUnmountedBoundaries (see #20147), this warning
|
||||
// will fire for errors that are thrown by destroy functions inside deleted
|
||||
// trees. What it should instead do is propagate the error to the parent of
|
||||
// the deleted tree. In the meantime, do not add this warning to the
|
||||
// allowlist; this is only for our internal use.
|
||||
console.error(
|
||||
'Internal React error: Attempted to capture a commit phase error ' +
|
||||
'inside a detached tree. This indicates a bug in React. Potential ' +
|
||||
'inside a detached tree. This indicates a bug in React. Likely ' +
|
||||
'causes include deleting the same fiber more than once, committing an ' +
|
||||
'already-finished tree, or an inconsistent return pointer.\n\n' +
|
||||
'Error message:\n\n%s',
|
||||
|
||||
@@ -35,6 +35,7 @@ import {
|
||||
enableSchedulingProfiler,
|
||||
disableSchedulerTimeoutInWorkLoop,
|
||||
enableStrictEffects,
|
||||
skipUnmountedBoundaries,
|
||||
enableUpdaterTracking,
|
||||
enableCache,
|
||||
enableTransitionTracing,
|
||||
@@ -2537,7 +2538,13 @@ export function captureCommitPhaseError(
|
||||
return;
|
||||
}
|
||||
|
||||
let fiber = nearestMountedAncestor;
|
||||
let fiber = null;
|
||||
if (skipUnmountedBoundaries) {
|
||||
fiber = nearestMountedAncestor;
|
||||
} else {
|
||||
fiber = sourceFiber.return;
|
||||
}
|
||||
|
||||
while (fiber !== null) {
|
||||
if (fiber.tag === HostRoot) {
|
||||
captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);
|
||||
@@ -2570,9 +2577,14 @@ export function captureCommitPhaseError(
|
||||
}
|
||||
|
||||
if (__DEV__) {
|
||||
// TODO: Until we re-land skipUnmountedBoundaries (see #20147), this warning
|
||||
// will fire for errors that are thrown by destroy functions inside deleted
|
||||
// trees. What it should instead do is propagate the error to the parent of
|
||||
// the deleted tree. In the meantime, do not add this warning to the
|
||||
// allowlist; this is only for our internal use.
|
||||
console.error(
|
||||
'Internal React error: Attempted to capture a commit phase error ' +
|
||||
'inside a detached tree. This indicates a bug in React. Potential ' +
|
||||
'inside a detached tree. This indicates a bug in React. Likely ' +
|
||||
'causes include deleting the same fiber more than once, committing an ' +
|
||||
'already-finished tree, or an inconsistent return pointer.\n\n' +
|
||||
'Error message:\n\n%s',
|
||||
|
||||
@@ -2351,6 +2351,7 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
};
|
||||
});
|
||||
|
||||
// @gate skipUnmountedBoundaries
|
||||
it('should use the nearest still-mounted boundary if there are no unmounted boundaries', () => {
|
||||
act(() => {
|
||||
ReactNoop.render(
|
||||
@@ -2376,6 +2377,7 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
// @gate skipUnmountedBoundaries
|
||||
it('should skip unmounted boundaries and use the nearest still-mounted boundary', () => {
|
||||
function Conditional({showChildren}) {
|
||||
if (showChildren) {
|
||||
@@ -2418,6 +2420,7 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
// @gate skipUnmountedBoundaries
|
||||
it('should call getDerivedStateFromError in the nearest still-mounted boundary', () => {
|
||||
function Conditional({showChildren}) {
|
||||
if (showChildren) {
|
||||
@@ -2461,6 +2464,7 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
// @gate skipUnmountedBoundaries
|
||||
it('should rethrow error if there are no still-mounted boundaries', () => {
|
||||
function Conditional({showChildren}) {
|
||||
if (showChildren) {
|
||||
@@ -3186,6 +3190,7 @@ describe('ReactHooksWithNoopRenderer', () => {
|
||||
]);
|
||||
});
|
||||
|
||||
// @gate skipUnmountedBoundaries
|
||||
it('catches errors thrown in useLayoutEffect', () => {
|
||||
class ErrorBoundary extends React.Component {
|
||||
state = {error: null};
|
||||
|
||||
@@ -1017,6 +1017,7 @@ describe('ReactIncrementalErrorHandling', () => {
|
||||
expect(Scheduler).toFlushAndYield(['Foo']);
|
||||
});
|
||||
|
||||
// @gate skipUnmountedBoundaries
|
||||
it('should not attempt to recover an unmounting error boundary', () => {
|
||||
class Parent extends React.Component {
|
||||
componentWillUnmount() {
|
||||
|
||||
@@ -28,6 +28,10 @@ export const enablePersistentOffscreenHostContainer = false;
|
||||
// like migrating internal callers or performance testing.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// This rolled out to 10% public in www, so we should be able to land, but some
|
||||
// internal tests need to be updated. The open source behavior is correct.
|
||||
export const skipUnmountedBoundaries = true;
|
||||
|
||||
// Destroy layout effects for components that are hidden because something
|
||||
// suspended in an update and recreate them when they are shown again (after the
|
||||
// suspended boundary has resolved). Note that this should be an uncommon use
|
||||
|
||||
@@ -56,6 +56,7 @@ export const enableComponentStackLocations = false;
|
||||
export const enableLegacyFBSupport = false;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = false;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = true;
|
||||
|
||||
@@ -47,6 +47,7 @@ export const enableComponentStackLocations = false;
|
||||
export const enableLegacyFBSupport = false;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = false;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = false;
|
||||
|
||||
@@ -47,6 +47,7 @@ export const enableComponentStackLocations = true;
|
||||
export const enableLegacyFBSupport = false;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = false;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = false;
|
||||
|
||||
@@ -43,6 +43,7 @@ export const enableComponentStackLocations = false;
|
||||
export const enableLegacyFBSupport = false;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = false;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = false;
|
||||
|
||||
@@ -47,6 +47,7 @@ export const enableComponentStackLocations = true;
|
||||
export const enableLegacyFBSupport = false;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = false;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = false;
|
||||
|
||||
@@ -47,6 +47,7 @@ export const enableComponentStackLocations = true;
|
||||
export const enableLegacyFBSupport = false;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = false;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = false;
|
||||
|
||||
@@ -47,6 +47,7 @@ export const enableComponentStackLocations = true;
|
||||
export const enableLegacyFBSupport = !__EXPERIMENTAL__;
|
||||
export const enableFilterEmptyStringAttributesDOM = false;
|
||||
export const disableNativeComponentFrames = false;
|
||||
export const skipUnmountedBoundaries = true;
|
||||
export const deletedTreeCleanUpLevel = 3;
|
||||
export const enableSuspenseLayoutEffectSemantics = false;
|
||||
export const enableGetInspectorDataForInstanceInProduction = false;
|
||||
|
||||
@@ -17,6 +17,7 @@ export const warnAboutSpreadingKeyToJSX = __VARIANT__;
|
||||
export const disableInputAttributeSyncing = __VARIANT__;
|
||||
export const enableFilterEmptyStringAttributesDOM = __VARIANT__;
|
||||
export const enableLegacyFBSupport = __VARIANT__;
|
||||
export const skipUnmountedBoundaries = __VARIANT__;
|
||||
export const enableUseRefAccessWarning = __VARIANT__;
|
||||
export const deletedTreeCleanUpLevel = __VARIANT__ ? 3 : 1;
|
||||
export const enableProfilerNestedUpdateScheduledHook = __VARIANT__;
|
||||
|
||||
@@ -24,6 +24,7 @@ export const {
|
||||
enableLegacyFBSupport,
|
||||
deferRenderPhaseUpdateToNextBatch,
|
||||
enableDebugTracing,
|
||||
skipUnmountedBoundaries,
|
||||
createRootStrictEffectsByDefault,
|
||||
enableUseRefAccessWarning,
|
||||
disableNativeComponentFrames,
|
||||
|
||||
Reference in New Issue
Block a user