Fix highlighting timed out Suspense DOM node

This commit is contained in:
Dan Abramov
2019-04-05 13:19:35 +01:00
parent 4f5437edf7
commit 48a5aca127
3 changed files with 22 additions and 13 deletions
+2 -5
View File
@@ -210,11 +210,8 @@ export default class Agent extends EventEmitter {
}
let node: HTMLElement | null = null;
if (
renderer !== null &&
typeof renderer.getNativeFromReactElement === 'function'
) {
node = ((renderer.getNativeFromReactElement(id): any): HTMLElement);
if (renderer !== null) {
node = ((renderer.findNativeByFiberID(id): any): HTMLElement);
}
if (node != null) {
+19 -7
View File
@@ -1053,18 +1053,30 @@ export function attach(
currentRootID = -1;
}
// The naming is confusing.
// They deal with opaque nodes (fibers), not elements.
function getNativeFromReactElement(id: number) {
function findNativeByFiberID(id: number) {
try {
const primaryFiber = getPrimaryFiber(idToFiberMap.get(id));
const hostInstance = renderer.findHostInstanceByFiber(primaryFiber);
return hostInstance;
const fiber = findCurrentFiberUsingSlowPath(idToFiberMap.get(id));
if (fiber === null) {
return null;
}
const isTimedOutSuspense =
fiber.tag === SuspenseComponent && fiber.memoizedState !== null;
if (!isTimedOutSuspense) {
// Normal case.
return renderer.findHostInstanceByFiber(fiber);
} else {
// A timed-out Suspense's findDOMNode is useless.
// Try our best to find the fallback directly.
const maybeFallbackFiber =
(fiber.child && fiber.child.sibling) || fiber;
return renderer.findHostInstanceByFiber(maybeFallbackFiber);
}
} catch (err) {
// The fiber might have unmounted by now.
return null;
}
}
function getFiberIDFromNative(
hostInstance,
findNearestUnfilteredAncestor = false
@@ -1731,7 +1743,7 @@ export function attach(
getCommitDetails,
getFiberIDFromNative,
getInteractions,
getNativeFromReactElement,
findNativeByFiberID,
getProfilingDataForDownload,
getProfilingSummary,
handleCommitFiberRoot,
+1 -1
View File
@@ -86,9 +86,9 @@ export type ProfilingSummary = {|
export type RendererInterface = {
cleanup: () => void,
findNativeByFiberID: (id: number) => ?NativeType,
flushInitialOperations: () => void,
getCommitDetails: (rootID: number, commitIndex: number) => CommitDetails,
getNativeFromReactElement?: ?(component: Fiber) => ?NativeType,
getFiberIDFromNative: (
component: NativeType,
findNearestUnfilteredAncestor?: boolean