Skip to content

Commit a1ba33f

Browse files
hoxyqAndyPengc12
authored andcommitted
fix[devtools]: check if fiber is unmounted before trying to highlight (facebook#26983)
For React Native environment, we sometimes spam the console with warnings `"Could not find Fiber with id ..."`. This is an attempt to fix this or at least reduce the amount of such potential warnings being thrown. Now checking if fiber is already unnmounted before trying to get native nodes for fiber. This might happen if you try to inspect an element in DevTools, but at the time when event has been received, the element was already unmounted.
1 parent 22b81a0 commit a1ba33f

File tree

4 files changed

+26
-19
lines changed

4 files changed

+26
-19
lines changed

packages/react-devtools-shared/src/backend/legacy/renderer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,10 @@ export function attach(
11011101

11021102
function unpatchConsoleForStrictMode() {}
11031103

1104+
function hasFiberWithId(id: number): boolean {
1105+
return idToInternalInstanceMap.has(id);
1106+
}
1107+
11041108
return {
11051109
clearErrorsAndWarnings,
11061110
clearErrorsForFiberID,
@@ -1124,6 +1128,7 @@ export function attach(
11241128
handleCommitFiberRoot,
11251129
handleCommitFiberUnmount,
11261130
handlePostCommitFiberRoot,
1131+
hasFiberWithId,
11271132
inspectElement,
11281133
logElementToConsole,
11291134
overrideError,

packages/react-devtools-shared/src/backend/renderer.js

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,21 +2736,11 @@ export function attach(
27362736

27372737
function findNativeNodesForFiberID(id: number) {
27382738
try {
2739-
let fiber = findCurrentFiberUsingSlowPathById(id);
2739+
const fiber = findCurrentFiberUsingSlowPathById(id);
27402740
if (fiber === null) {
27412741
return null;
27422742
}
2743-
// Special case for a timed-out Suspense.
2744-
const isTimedOutSuspense =
2745-
fiber.tag === SuspenseComponent && fiber.memoizedState !== null;
2746-
if (isTimedOutSuspense) {
2747-
// A timed-out Suspense's findDOMNode is useless.
2748-
// Try our best to find the fallback directly.
2749-
const maybeFallbackFiber = fiber.child && fiber.child.sibling;
2750-
if (maybeFallbackFiber != null) {
2751-
fiber = maybeFallbackFiber;
2752-
}
2753-
}
2743+
27542744
const hostFibers = findAllCurrentHostFibers(id);
27552745
return hostFibers.map(hostFiber => hostFiber.stateNode).filter(Boolean);
27562746
} catch (err) {
@@ -2759,9 +2749,9 @@ export function attach(
27592749
}
27602750
}
27612751

2762-
function getDisplayNameForFiberID(id: number) {
2752+
function getDisplayNameForFiberID(id: number): null | string {
27632753
const fiber = idToArbitraryFiberMap.get(id);
2764-
return fiber != null ? getDisplayNameForFiber(((fiber: any): Fiber)) : null;
2754+
return fiber != null ? getDisplayNameForFiber(fiber) : null;
27652755
}
27662756

27672757
function getFiberForNative(hostInstance: NativeType) {
@@ -4456,6 +4446,10 @@ export function attach(
44564446
traceUpdatesEnabled = isEnabled;
44574447
}
44584448

4449+
function hasFiberWithId(id: number): boolean {
4450+
return idToArbitraryFiberMap.has(id);
4451+
}
4452+
44594453
return {
44604454
cleanup,
44614455
clearErrorsAndWarnings,
@@ -4476,6 +4470,7 @@ export function attach(
44764470
handleCommitFiberRoot,
44774471
handleCommitFiberUnmount,
44784472
handlePostCommitFiberRoot,
4473+
hasFiberWithId,
44794474
inspectElement,
44804475
logElementToConsole,
44814476
patchConsoleForStrictMode,

packages/react-devtools-shared/src/backend/types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ export type RendererInterface = {
379379
handleCommitFiberRoot: (fiber: Object, commitPriority?: number) => void,
380380
handleCommitFiberUnmount: (fiber: Object) => void,
381381
handlePostCommitFiberRoot: (fiber: Object) => void,
382+
hasFiberWithId: (id: number) => boolean,
382383
inspectElement: (
383384
requestID: number,
384385
id: number,

packages/react-devtools-shared/src/backend/views/Highlighter/index.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,21 @@ export default function setupHighlighter(
104104
const renderer = agent.rendererInterfaces[rendererID];
105105
if (renderer == null) {
106106
console.warn(`Invalid renderer id "${rendererID}" for element "${id}"`);
107+
108+
hideOverlay(agent);
109+
return;
107110
}
108111

109-
let nodes: ?Array<HTMLElement> = null;
110-
if (renderer != null) {
111-
nodes = ((renderer.findNativeNodesForFiberID(
112-
id,
113-
): any): ?Array<HTMLElement>);
112+
// In some cases fiber may already be unmounted
113+
if (!renderer.hasFiberWithId(id)) {
114+
hideOverlay(agent);
115+
return;
114116
}
115117

118+
const nodes: ?Array<HTMLElement> = (renderer.findNativeNodesForFiberID(
119+
id,
120+
): any);
121+
116122
if (nodes != null && nodes[0] != null) {
117123
const node = nodes[0];
118124
// $FlowFixMe[method-unbinding]

0 commit comments

Comments
 (0)