From d7f1c4a9300725197e12b0d8c5ce9a10ded5f7e9 Mon Sep 17 00:00:00 2001 From: Scott Goodfriend Date: Thu, 27 Oct 2022 12:25:40 -0700 Subject: [PATCH] Fiber cleanup fixes A transcription of https://slack-github.com/slack/react/compare/v16.11.0; however, Quip's version of React has ReactFiberCommitWork.new.js and ReactFiberCommitWork.old.js. The old.js files required adding commitUnount implementations for other React HostConfigs (Noops seemed to be fine for all of them). TODO: 1. Verify this fixes the fiber leak: https://app.slack.com/client/T5J4Q04QG/threads?multi_team=1#:~:text=to%20have%20a-,fiber%20leak,-that%20also%20holds --- packages/react-art/src/ReactARTHostConfig.js | 6 ++++++ packages/react-dom/src/client/ReactDOMComponentTree.js | 6 ++++++ packages/react-dom/src/client/ReactDOMHostConfig.js | 7 +++++++ .../react-native-renderer/src/ReactNativeHostConfig.js | 6 ++++++ .../react-reconciler/src/ReactFiberCommitWork.new.js | 10 ++++++++++ .../react-reconciler/src/ReactFiberCommitWork.old.js | 10 ++++++++++ .../react-test-renderer/src/ReactTestHostConfig.js | 6 ++++++ 7 files changed, 51 insertions(+) diff --git a/packages/react-art/src/ReactARTHostConfig.js b/packages/react-art/src/ReactARTHostConfig.js index 459f714b90c..6afa063abf5 100644 --- a/packages/react-art/src/ReactARTHostConfig.js +++ b/packages/react-art/src/ReactARTHostConfig.js @@ -403,6 +403,12 @@ export function commitUpdate( instance._applyProps(instance, newProps, oldProps); } +export function commitUnmount( + domElement: Instance, +): void { + // Noop +} + export function hideInstance(instance) { instance.hide(); } diff --git a/packages/react-dom/src/client/ReactDOMComponentTree.js b/packages/react-dom/src/client/ReactDOMComponentTree.js index fbf0a81e290..f8bc8487149 100644 --- a/packages/react-dom/src/client/ReactDOMComponentTree.js +++ b/packages/react-dom/src/client/ReactDOMComponentTree.js @@ -183,6 +183,12 @@ export function getNodeFromInstance(inst: Fiber): Instance | TextInstance { invariant(false, 'getNodeFromInstance: Invalid argument.'); } +export function cleanupNode(node) { + node[internalInstanceKey] = null; + node[internalEventHandlersKey] = null; + node[internalContainerInstanceKey] = null; +} + export function getFiberCurrentPropsFromNode( node: Instance | TextInstance | SuspenseInstance, ): Props { diff --git a/packages/react-dom/src/client/ReactDOMHostConfig.js b/packages/react-dom/src/client/ReactDOMHostConfig.js index e5ce50add75..b97a28f5c56 100644 --- a/packages/react-dom/src/client/ReactDOMHostConfig.js +++ b/packages/react-dom/src/client/ReactDOMHostConfig.js @@ -25,6 +25,7 @@ import { getFiberFromScopeInstance, getInstanceFromNode as getInstanceFromNodeDOMTree, isContainerMarkedAsRoot, + cleanupNode, } from './ReactDOMComponentTree'; import {hasRole} from './DOMAccessibilityRoles'; import { @@ -428,6 +429,12 @@ export function commitUpdate( updateProperties(domElement, updatePayload, type, oldProps, newProps); } +export function commitUnmount( + domElement: Instance, +): void { + cleanupNode(domElement); +} + export function resetTextContent(domElement: Instance): void { setTextContent(domElement, ''); } diff --git a/packages/react-native-renderer/src/ReactNativeHostConfig.js b/packages/react-native-renderer/src/ReactNativeHostConfig.js index 0369755c136..e6e7db2498b 100644 --- a/packages/react-native-renderer/src/ReactNativeHostConfig.js +++ b/packages/react-native-renderer/src/ReactNativeHostConfig.js @@ -356,6 +356,12 @@ export function commitUpdate( } } +export function commitUnmount( + domElement: Instance, +): void { + // Noop +} + export function insertBefore( parentInstance: Instance, child: Instance | TextInstance, diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.new.js b/packages/react-reconciler/src/ReactFiberCommitWork.new.js index 4e9acfae113..e98f3c89475 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.new.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.new.js @@ -98,6 +98,7 @@ import { supportsHydration, commitMount, commitUpdate, + commitUnmount as commitHostUnmount, resetTextContent, commitTextUpdate, appendChild, @@ -1060,6 +1061,15 @@ function commitUnmount( } case HostComponent: { safelyDetachRef(current, nearestMountedAncestor); + if (commitHostUnmount) { + commitHostUnmount(current.stateNode); + } + return; + } + case HostText: { + if (commitHostUnmount) { + commitHostUnmount(current.stateNode); + } return; } case HostPortal: { diff --git a/packages/react-reconciler/src/ReactFiberCommitWork.old.js b/packages/react-reconciler/src/ReactFiberCommitWork.old.js index e094e5bd9b5..e8d7a3c0f97 100644 --- a/packages/react-reconciler/src/ReactFiberCommitWork.old.js +++ b/packages/react-reconciler/src/ReactFiberCommitWork.old.js @@ -87,6 +87,7 @@ import { supportsHydration, commitMount, commitUpdate, + commitUnmount as commitHostUnmount, resetTextContent, commitTextUpdate, appendChild, @@ -918,6 +919,15 @@ function commitUnmount( } case HostComponent: { safelyDetachRef(current); + if (commitHostUnmount) { + commitHostUnmount(current.stateNode); + } + return; + } + case HostText: { + if (commitHostUnmount) { + commitHostUnmount(current.stateNode); + } return; } case HostPortal: { diff --git a/packages/react-test-renderer/src/ReactTestHostConfig.js b/packages/react-test-renderer/src/ReactTestHostConfig.js index b244810736d..d2b4dd0092b 100644 --- a/packages/react-test-renderer/src/ReactTestHostConfig.js +++ b/packages/react-test-renderer/src/ReactTestHostConfig.js @@ -240,6 +240,12 @@ export function commitUpdate( instance.props = newProps; } +export function commitUnmount( + domElement: Instance, +): void { + // Noop +} + export function commitMount( instance: Instance, type: string,