Skip to content

Commit 7a6b59f

Browse files
committed
move logic to agent
1 parent b7d225a commit 7a6b59f

File tree

5 files changed

+43
-55
lines changed

5 files changed

+43
-55
lines changed

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@ import type {
3939
RendererInterface,
4040
} from './types';
4141
import type {ComponentFilter} from '../types';
42-
import {
43-
isSynchronousXHRSupported,
44-
getBestMatchingRendererInterface,
45-
} from './utils';
42+
import {isSynchronousXHRSupported} from './utils';
4643
import type {BrowserTheme} from 'react-devtools-shared/src/devtools/views/DevTools';
4744

4845
const debug = (methodName, ...args) => {
@@ -312,21 +309,42 @@ export default class Agent extends EventEmitter<{|
312309
return renderer.getInstanceAndStyle(id);
313310
}
314311

315-
getIDForNode(node: Object): number | null {
316-
const renderers = [];
312+
getBestMatchingRendererInterface(node: Object): RendererInterface | null {
313+
let bestMatch = null;
317314
for (const rendererID in this._rendererInterfaces) {
318315
const renderer = ((this._rendererInterfaces[
319316
(rendererID: any)
320317
]: any): RendererInterface);
321-
renderers.push(renderer);
318+
const fiber = renderer.getFiberForNative(node);
319+
if (fiber != null) {
320+
// check if fiber.stateNode is matching the original hostInstance
321+
if (fiber.stateNode === node) {
322+
return renderer;
323+
} else {
324+
bestMatch = renderer;
325+
}
326+
}
322327
}
323-
const rendererInterface = getBestMatchingRendererInterface(renderers, node);
328+
// if an exact match is not found, return the best match as fallback
329+
return bestMatch;
330+
}
331+
332+
getIDForNode(node: Object): number | null {
333+
const rendererInterface = this.getBestMatchingRendererInterface(node);
324334
if (rendererInterface != null) {
325335
return rendererInterface.getFiberIDForNative(node, true);
326336
}
327337
return null;
328338
}
329339

340+
getDisplayNameForNode(node: Object): string | null {
341+
const rendererInterface = this.getBestMatchingRendererInterface(node);
342+
if (rendererInterface != null) {
343+
return rendererInterface.getDisplayNameForFiberID(node, true);
344+
}
345+
return null;
346+
}
347+
330348
getBackendVersion = () => {
331349
const version = process.env.DEVTOOLS_VERSION;
332350
if (version) {

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

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -274,24 +274,3 @@ export function isSynchronousXHRSupported(): boolean {
274274
window.document.featurePolicy.allowsFeature('sync-xhr')
275275
);
276276
}
277-
278-
export function getBestMatchingRendererInterface(
279-
rendererInterfaces: Iterable<RendererInterface>,
280-
node: Object,
281-
): RendererInterface | null {
282-
let bestMatch = null;
283-
// eslint-disable-next-line no-for-of-loops/no-for-of-loops
284-
for (const renderer of rendererInterfaces) {
285-
const fiber = renderer.getFiberForNative(node);
286-
if (fiber != null) {
287-
// check if fiber.stateNode is matching the original hostInstance
288-
if (fiber.stateNode === node) {
289-
return renderer;
290-
} else {
291-
bestMatch = renderer;
292-
}
293-
}
294-
}
295-
// if an exact match is not found, return the best match as fallback
296-
return bestMatch;
297-
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
* @flow
88
*/
99

10+
import type Agent from 'react-devtools-shared/src/backend/agent';
11+
1012
import Overlay from './Overlay';
1113

1214
const SHOW_DURATION = 2000;
@@ -26,6 +28,7 @@ export function hideOverlay() {
2628
export function showOverlay(
2729
elements: Array<HTMLElement> | null,
2830
componentName: string | null,
31+
agent: Agent,
2932
hideAfterTimeout: boolean,
3033
) {
3134
// TODO (npm-packages) Detect RN and support it somehow
@@ -42,7 +45,7 @@ export function showOverlay(
4245
}
4346

4447
if (overlay === null) {
45-
overlay = new Overlay();
48+
overlay = new Overlay(agent);
4649
}
4750

4851
overlay.inspect(elements, componentName);

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

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@
88
*/
99

1010
import {getElementDimensions, getNestedBoundingClientRect} from '../utils';
11-
import {getBestMatchingRendererInterface} from '../../utils';
1211

13-
const assign = Object.assign;
14-
15-
import type {DevToolsHook} from 'react-devtools-shared/src/backend/types';
1612
import type {Rect} from '../utils';
13+
import type Agent from 'react-devtools-shared/src/backend/agent';
1714

1815
type Box = {|top: number, left: number, width: number, height: number|};
1916

17+
const assign = Object.assign;
18+
2019
// Note that the Overlay components are not affected by the active Theme,
2120
// because they highlight elements in the main Chrome window (outside of devtools).
2221
// The colors below were chosen to roughly match those used by Chrome devtools.
@@ -154,8 +153,9 @@ export default class Overlay {
154153
container: HTMLElement;
155154
tip: OverlayTip;
156155
rects: Array<OverlayRect>;
156+
agent: Agent;
157157

158-
constructor() {
158+
constructor(agent: Agent) {
159159
// Find the root window, because overlays are positioned relative to it.
160160
const currentWindow = window.__REACT_DEVTOOLS_TARGET_WINDOW__ || window;
161161
this.window = currentWindow;
@@ -171,6 +171,8 @@ export default class Overlay {
171171
this.tip = new OverlayTip(doc, this.container);
172172
this.rects = [];
173173

174+
this.agent = agent;
175+
174176
doc.body.appendChild(this.container);
175177
}
176178

@@ -231,24 +233,10 @@ export default class Overlay {
231233
name = elements[0].nodeName.toLowerCase();
232234

233235
const node = elements[0];
234-
const hook: DevToolsHook =
235-
node.ownerDocument.defaultView.__REACT_DEVTOOLS_GLOBAL_HOOK__;
236-
if (hook != null && hook.rendererInterfaces != null) {
237-
const rendererInterface = getBestMatchingRendererInterface(
238-
hook.rendererInterfaces.values(),
239-
node,
240-
);
241-
let ownerName = null;
242-
if (rendererInterface !== null) {
243-
const id = rendererInterface.getFiberIDForNative(node, true);
244-
if (id !== null) {
245-
ownerName = rendererInterface.getDisplayNameForFiberID(id, true);
246-
}
247-
}
248-
249-
if (ownerName) {
250-
name += ' (in ' + ownerName + ')';
251-
}
236+
const ownerName = this.agent.getDisplayNameForNode(node);
237+
238+
if (ownerName) {
239+
name += ' (in ' + ownerName + ')';
252240
}
253241
}
254242

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ export default function setupHighlighter(
118118
node.scrollIntoView({block: 'nearest', inline: 'nearest'});
119119
}
120120

121-
showOverlay(nodes, displayName, hideAfterTimeout);
121+
showOverlay(nodes, displayName, agent, hideAfterTimeout);
122122

123123
if (openNativeElementsPanel) {
124124
window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$0 = node;
@@ -171,7 +171,7 @@ export default function setupHighlighter(
171171

172172
// Don't pass the name explicitly.
173173
// It will be inferred from DOM tag and Fiber owner.
174-
showOverlay([target], null, false);
174+
showOverlay([target], null, agent, false);
175175

176176
selectFiberForNode(target);
177177
}

0 commit comments

Comments
 (0)