Skip to content

Commit dadbe57

Browse files
committed
[DevTools] Clear element inspection if host element not owned by any renderer is selected
1 parent cbc4d40 commit dadbe57

File tree

4 files changed

+15
-7
lines changed

4 files changed

+15
-7
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -940,9 +940,17 @@ export default class Agent extends EventEmitter<{
940940

941941
selectNode(target: HostInstance): void {
942942
const match = this.getIDForHostInstance(target);
943-
if (match !== null) {
944-
this._bridge.send('selectElement', match.id);
945-
}
943+
this._bridge.send(
944+
'selectElement',
945+
match !== null
946+
? match.id
947+
: // If you click outside a React root in the Elements panel, we want to give
948+
// feedback that no selection is possible so we clear the selection.
949+
// Otherwise clicking outside a React root is indistinguishable from clicking
950+
// a different host node that leads to the same selected React element
951+
// due to Component filters
952+
null,
953+
);
946954
}
947955

948956
registerRendererInterface(

packages/react-devtools-shared/src/bridge.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ export type BackendEvents = {
214214
profilingStatus: [boolean],
215215
reloadAppForProfiling: [],
216216
saveToClipboard: [string],
217-
selectElement: [number],
217+
selectElement: [number | null],
218218
shutdown: [],
219219
stopInspectingHost: [boolean],
220220
scrollTo: [{left: number, top: number, right: number, bottom: number}],

packages/react-devtools-shared/src/devtools/store.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export default class Store extends EventEmitter<{
147147
enableSuspenseTab: [],
148148
error: [Error],
149149
hookSettings: [$ReadOnly<DevToolsHookSettings>],
150-
hostInstanceSelected: [Element['id']],
150+
hostInstanceSelected: [Element['id'] | null],
151151
settingsUpdated: [$ReadOnly<DevToolsHookSettings>],
152152
mutated: [
153153
[
@@ -2381,7 +2381,7 @@ export default class Store extends EventEmitter<{
23812381
this._bridge.send('getHookSettings'); // Warm up cached hook settings
23822382
};
23832383

2384-
onHostInstanceSelected: (elementId: number) => void = elementId => {
2384+
onHostInstanceSelected: (elementId: number | null) => void = elementId => {
23852385
if (this._lastSelectedHostInstanceElementId === elementId) {
23862386
return;
23872387
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,7 @@ function TreeContextController({
967967

968968
// Listen for host element selections.
969969
useEffect(() => {
970-
const handler = (id: Element['id']) =>
970+
const handler = (id: Element['id'] | null) =>
971971
transitionDispatch({type: 'SELECT_ELEMENT_BY_ID', payload: id});
972972

973973
store.addListener('hostInstanceSelected', handler);

0 commit comments

Comments
 (0)