Skip to content

Commit 313f5e3

Browse files
author
Brian Vaughn
committed
DevTools: Add root and renderer version to inspected props panel
1 parent 099f737 commit 313f5e3

File tree

10 files changed

+112
-17
lines changed

10 files changed

+112
-17
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,10 @@ export function attach(
802802

803803
// Location of component in source coude.
804804
source,
805+
806+
rootType: null,
807+
rendererPackageName: null,
808+
rendererVersion: null,
805809
};
806810
}
807811

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,6 +2278,16 @@ export function attach(
22782278
}
22792279
}
22802280

2281+
let rootType = null;
2282+
let current = fiber;
2283+
while (current.return !== null) {
2284+
current = current.return;
2285+
}
2286+
const fiberRoot = current.stateNode;
2287+
if (fiberRoot != null && fiberRoot._debugRootType !== null) {
2288+
rootType = fiberRoot._debugRootType;
2289+
}
2290+
22812291
return {
22822292
id,
22832293

@@ -2318,6 +2328,10 @@ export function attach(
23182328

23192329
// Location of component in source coude.
23202330
source: _debugSource || null,
2331+
2332+
rootType,
2333+
rendererPackageName: renderer.rendererPackageName,
2334+
rendererVersion: renderer.version,
23212335
};
23222336
}
23232337

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export type ReactProviderType<T> = {
8787
export type ReactRenderer = {
8888
findFiberByHostInstance: (hostInstance: NativeType) => ?Fiber,
8989
version: string,
90+
rendererPackageName: string,
9091
bundleType: BundleType,
9192
// 16.9+
9293
overrideHookState?: ?(
@@ -207,10 +208,17 @@ export type InspectedElement = {|
207208
// List of owners
208209
owners: Array<Owner> | null,
209210

210-
// Location of component in source coude.
211+
// Location of component in source code.
211212
source: Source | null,
212213

213214
type: ElementType,
215+
216+
// Meta information about the root this element belongs to.
217+
rootType: string | null,
218+
219+
// Meta information about the renderer that created this element.
220+
rendererPackageName: string | null,
221+
rendererVersion: string | null,
214222
|};
215223

216224
export const InspectElementFullDataType = 'full-data';

packages/react-devtools-shared/src/devtools/views/Components/Badge.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ export default function Badge({
2626
type,
2727
children,
2828
}: Props) {
29-
let totalBadgeCount = 0;
30-
31-
if (hocDisplayNames !== null) {
32-
totalBadgeCount += hocDisplayNames.length;
29+
if (hocDisplayNames === null) {
30+
return null;
3331
}
3432

33+
const totalBadgeCount = hocDisplayNames.length;
34+
3535
return (
3636
<Fragment>
3737
<div className={`${styles.Badge} ${className || ''}`}>{children}</div>

packages/react-devtools-shared/src/devtools/views/Components/InspectedElementContext.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,9 @@ function InspectedElementContextController({children}: Props) {
208208
context,
209209
hooks,
210210
props,
211+
rendererPackageName,
212+
rendererVersion,
213+
rootType,
211214
state,
212215
key,
213216
} = ((data.value: any): InspectedElementBackend);
@@ -220,6 +223,9 @@ function InspectedElementContextController({children}: Props) {
220223
hasLegacyContext,
221224
id,
222225
key,
226+
rendererPackageName,
227+
rendererVersion,
228+
rootType,
223229
source,
224230
type,
225231
owners:

packages/react-devtools-shared/src/devtools/views/Components/SelectedElement.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,10 @@
153153
.ContextMenuIcon {
154154
margin-right: 0.5rem;
155155
}
156+
157+
.OwnersMetaField {
158+
padding-left: 1.25rem;
159+
white-space: nowrap;
160+
overflow: hidden;
161+
text-overflow: ellipsis;
162+
}

packages/react-devtools-shared/src/devtools/views/Components/SelectedElement.js

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -291,11 +291,13 @@ function InspectedElementView({
291291
hooks,
292292
owners,
293293
props,
294+
rendererPackageName,
295+
rendererVersion,
296+
rootType,
294297
source,
295298
state,
296299
} = inspectedElement;
297300

298-
const {ownerID} = useContext(TreeStateContext);
299301
const bridge = useContext(BridgeContext);
300302
const store = useContext(StoreContext);
301303

@@ -374,6 +376,15 @@ function InspectedElementView({
374376
};
375377
}
376378

379+
const rendererLabel =
380+
rendererPackageName !== null && rendererVersion !== null
381+
? `${rendererPackageName}@${rendererVersion}`
382+
: null;
383+
const showRenderedBy =
384+
(owners !== null && owners.length > 0) ||
385+
rendererLabel !== null ||
386+
rootType !== null;
387+
377388
return (
378389
<Fragment>
379390
<div className={styles.InspectedElement}>
@@ -415,19 +426,27 @@ function InspectedElementView({
415426

416427
<NativeStyleEditor />
417428

418-
{ownerID === null && owners !== null && owners.length > 0 && (
429+
{showRenderedBy && (
419430
<div className={styles.Owners}>
420431
<div className={styles.OwnersHeader}>rendered by</div>
421-
{owners.map(owner => (
422-
<OwnerView
423-
key={owner.id}
424-
displayName={owner.displayName || 'Anonymous'}
425-
hocDisplayNames={owner.hocDisplayNames}
426-
id={owner.id}
427-
isInStore={store.containsElement(owner.id)}
428-
type={owner.type}
429-
/>
430-
))}
432+
{owners !== null &&
433+
owners.length > 0 &&
434+
owners.map(owner => (
435+
<OwnerView
436+
key={owner.id}
437+
displayName={owner.displayName || 'Anonymous'}
438+
hocDisplayNames={owner.hocDisplayNames}
439+
id={owner.id}
440+
isInStore={store.containsElement(owner.id)}
441+
type={owner.type}
442+
/>
443+
))}
444+
{rootType !== null && (
445+
<div className={styles.OwnersMetaField}>{rootType}</div>
446+
)}
447+
{rendererLabel !== null && (
448+
<div className={styles.OwnersMetaField}>{rendererLabel}</div>
449+
)}
431450
</div>
432451
)}
433452

packages/react-devtools-shared/src/devtools/views/Components/types.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ export type InspectedElement = {|
8888
source: Source | null,
8989

9090
type: ElementType,
91+
92+
// Meta information about the root this element belongs to.
93+
rootType: string | null,
94+
95+
// Meta information about the renderer that created this element.
96+
rendererPackageName: string | null,
97+
rendererVersion: string | null,
9198
|};
9299

93100
// TODO: Add profiling type

packages/react-reconciler/src/ReactFiberRoot.new.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
} from 'shared/ReactFeatureFlags';
2525
import {unstable_getThreadID} from 'scheduler/tracing';
2626
import {initializeUpdateQueue} from './ReactUpdateQueue.new';
27+
import {LegacyRoot, BlockingRoot, ConcurrentRoot} from './ReactRootTags';
2728

2829
function FiberRootNode(containerInfo, tag, hydrate) {
2930
this.tag = tag;
@@ -60,6 +61,20 @@ function FiberRootNode(containerInfo, tag, hydrate) {
6061
if (enableSuspenseCallback) {
6162
this.hydrationCallbacks = null;
6263
}
64+
65+
if (__DEV__) {
66+
switch (tag) {
67+
case BlockingRoot:
68+
this._debugRootType = 'createBlockingRoot()';
69+
break;
70+
case ConcurrentRoot:
71+
this._debugRootType = 'createRoot()';
72+
break;
73+
case LegacyRoot:
74+
this._debugRootType = 'createLegacyRoot()';
75+
break;
76+
}
77+
}
6378
}
6479

6580
export function createFiberRoot(

packages/react-reconciler/src/ReactFiberRoot.old.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {unstable_getThreadID} from 'scheduler/tracing';
2222
import {NoPriority} from './SchedulerWithReactIntegration.old';
2323
import {initializeUpdateQueue} from './ReactUpdateQueue.old';
2424
import {clearPendingUpdates as clearPendingMutableSourceUpdates} from './ReactMutableSource.old';
25+
import {LegacyRoot, BlockingRoot, ConcurrentRoot} from './ReactRootTags';
2526

2627
function FiberRootNode(containerInfo, tag, hydrate) {
2728
this.tag = tag;
@@ -54,6 +55,20 @@ function FiberRootNode(containerInfo, tag, hydrate) {
5455
if (enableSuspenseCallback) {
5556
this.hydrationCallbacks = null;
5657
}
58+
59+
if (__DEV__) {
60+
switch (tag) {
61+
case BlockingRoot:
62+
this._debugRootType = 'createBlockingRoot()';
63+
break;
64+
case ConcurrentRoot:
65+
this._debugRootType = 'createRoot()';
66+
break;
67+
case LegacyRoot:
68+
this._debugRootType = 'createLegacyRoot()';
69+
break;
70+
}
71+
}
5772
}
5873

5974
export function createFiberRoot(

0 commit comments

Comments
 (0)