@buoy-gg/highlight-updates 7.0.40 โ 7.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/lib/commonjs/highlight-updates/utils/CommitProfiler.js +10 -1
- package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +31 -22
- package/lib/commonjs/highlight-updates/utils/rawEventEmitter.web.js +12 -0
- package/lib/commonjs/highlight-updates/utils/screenElements.js +24 -3
- package/lib/module/highlight-updates/utils/CommitProfiler.js +10 -1
- package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +18 -9
- package/lib/module/highlight-updates/utils/rawEventEmitter.web.js +3 -0
- package/lib/module/highlight-updates/utils/screenElements.js +24 -3
- package/lib/typescript/highlight-updates/utils/CommitProfiler.d.ts.map +1 -1
- package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts +0 -26
- package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts.map +1 -1
- package/lib/typescript/highlight-updates/utils/rawEventEmitter.web.d.ts +3 -0
- package/lib/typescript/highlight-updates/utils/rawEventEmitter.web.d.ts.map +1 -0
- package/lib/typescript/highlight-updates/utils/screenElements.d.ts +0 -19
- package/lib/typescript/highlight-updates/utils/screenElements.d.ts.map +1 -1
- package/lib/web/index.mjs +39 -0
- package/package.json +34 -14
package/README.md
CHANGED
|
@@ -81,3 +81,7 @@ Use a Free or Pro Buoy account. History limits and paid features vary by tool; s
|
|
|
81
81
|
๐ [Full docs](https://buoy.gg/buoy/latest/docs/tools/highlight-updates) ยท [All Buoy tools](https://github.com/Buoy-gg/buoy)
|
|
82
82
|
|
|
83
83
|
Proprietary software. ยฉ Buoy LLC. [Terms](https://buoy.gg/terms)
|
|
84
|
+
|
|
85
|
+
## Web support (unreleased)
|
|
86
|
+
|
|
87
|
+
Import @buoy-gg/core/web/register before React DOM to capture roots and renders. The shared inspector measures DOM elements. The browser build is available in this checkout and has not been published yet. See the [web setup guide](https://buoy.gg/buoy/latest/docs/web-preview) for registration, dependencies, and browser boundaries.
|
|
@@ -297,7 +297,16 @@ function handleCommit(root) {
|
|
|
297
297
|
if (visited > MAX_FIBERS_PER_COMMIT) break;
|
|
298
298
|
let skipSubtree = false;
|
|
299
299
|
const composite = isCompositeTag(fiber.tag);
|
|
300
|
-
|
|
300
|
+
|
|
301
|
+
// Buoy's own tree โ the floating menu, open tool sheets, the Bench REC
|
|
302
|
+
// bar โ hangs under one View marked __buoyDevToolsRoot. Name matching
|
|
303
|
+
// missed most of it (ExpandableWindowControls, RunningPanel, anonymous
|
|
304
|
+
// compiled components), so a Bench recording's "top re-renderers" was
|
|
305
|
+
// mostly Buoy redrawing its own recording UI. The marker is structural,
|
|
306
|
+
// so this can't hide app components the way a name prefix did.
|
|
307
|
+
if (fiber.memoizedProps?.__buoyDevToolsRoot) {
|
|
308
|
+
skipSubtree = true;
|
|
309
|
+
} else if (composite) {
|
|
301
310
|
const compositeName = getComponentName(fiber);
|
|
302
311
|
// Only Buoy's render-tracking UI gets its SUBTREE pruned โ walking it
|
|
303
312
|
// feeds its own renders back in and loops. Everything else that's merely
|
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _utils = require("@buoy-gg/shared-ui/utils");
|
|
8
|
+
var _ProfilerInterceptor = require("./ProfilerInterceptor");
|
|
9
|
+
var _reactNative = require("react-native");
|
|
10
|
+
var _RenderTracker = require("./RenderTracker");
|
|
11
|
+
var _screenElements = require("./screenElements");
|
|
12
|
+
var _tapMatch = require("./tapMatch");
|
|
13
|
+
var _PerformanceLogger = require("./PerformanceLogger");
|
|
14
|
+
var _RenderCauseDetector = require("./RenderCauseDetector");
|
|
15
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
16
|
+
var _devtoolsComponentNames = require("./devtoolsComponentNames");
|
|
1
17
|
/**
|
|
2
18
|
* Highlight Updates Controller
|
|
3
19
|
*
|
|
@@ -26,20 +42,6 @@
|
|
|
26
42
|
*/
|
|
27
43
|
|
|
28
44
|
"use strict";
|
|
29
|
-
|
|
30
|
-
Object.defineProperty(exports, "__esModule", {
|
|
31
|
-
value: true
|
|
32
|
-
});
|
|
33
|
-
exports.default = void 0;
|
|
34
|
-
var _ProfilerInterceptor = require("./ProfilerInterceptor");
|
|
35
|
-
var _reactNative = require("react-native");
|
|
36
|
-
var _RenderTracker = require("./RenderTracker");
|
|
37
|
-
var _screenElements = require("./screenElements");
|
|
38
|
-
var _tapMatch = require("./tapMatch");
|
|
39
|
-
var _PerformanceLogger = require("./PerformanceLogger");
|
|
40
|
-
var _RenderCauseDetector = require("./RenderCauseDetector");
|
|
41
|
-
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
42
|
-
var _devtoolsComponentNames = require("./devtoolsComponentNames");
|
|
43
45
|
// State
|
|
44
46
|
let globalEnabled = false; // User-controlled toggle for visual highlights
|
|
45
47
|
// When true, tracking + measurement + storage all run as normal, but the
|
|
@@ -85,6 +87,8 @@ function debugLog(message, data) {
|
|
|
85
87
|
* Get the public instance from a stateNode (the node passed in traceUpdates)
|
|
86
88
|
*/
|
|
87
89
|
function getPublicInstance(stateNode) {
|
|
90
|
+
const dom = (0, _utils.getDOMPublicInstance)(stateNode);
|
|
91
|
+
if (dom) return dom;
|
|
88
92
|
if (!stateNode) return null;
|
|
89
93
|
const node = stateNode;
|
|
90
94
|
|
|
@@ -109,6 +113,8 @@ function getPublicInstance(stateNode) {
|
|
|
109
113
|
* Get native tag from public instance or stateNode
|
|
110
114
|
*/
|
|
111
115
|
function getNativeTag(instance) {
|
|
116
|
+
const dom = (0, _utils.getDOMNodeHandle)(instance);
|
|
117
|
+
if (dom !== null) return dom;
|
|
112
118
|
if (instance == null) return null;
|
|
113
119
|
const inst = instance;
|
|
114
120
|
|
|
@@ -147,7 +153,7 @@ function extractComponentInfo(stateNode) {
|
|
|
147
153
|
|
|
148
154
|
// Try to get props from various locations
|
|
149
155
|
// Fabric: canonical.internalInstanceHandle, Paper: _internalInstanceHandle, RN CLI DEV: _internalFiberInstanceHandleDEV
|
|
150
|
-
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
|
|
156
|
+
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || (0, _utils.getDOMFiber)(node);
|
|
151
157
|
const currentProps = node?.canonical?.currentProps;
|
|
152
158
|
const pendingProps = node?.canonical?.pendingProps;
|
|
153
159
|
const fiberPendingProps = fiber?.pendingProps;
|
|
@@ -490,7 +496,7 @@ function isOurOverlayNode(stateNode) {
|
|
|
490
496
|
// Fabric: fiber is at canonical.internalInstanceHandle
|
|
491
497
|
// Paper/Legacy: fiber is at _internalInstanceHandle directly on stateNode
|
|
492
498
|
// RN CLI DEV: fiber is at _internalFiberInstanceHandleDEV
|
|
493
|
-
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
|
|
499
|
+
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || (0, _utils.getDOMFiber)(node);
|
|
494
500
|
|
|
495
501
|
// Get nativeTag for caching
|
|
496
502
|
const nativeTag = getNativeTag(stateNode) || getNativeTag(node?.canonical?.publicInstance);
|
|
@@ -504,6 +510,7 @@ function isOurOverlayNode(stateNode) {
|
|
|
504
510
|
// the cache and can't poison it.
|
|
505
511
|
const benchMode = (0, _devtoolsComponentNames.isCapturingBuoyToolRenders)();
|
|
506
512
|
const excludeDevTools = !benchMode && _RenderTracker.RenderTracker.getSettings().excludeDevTools;
|
|
513
|
+
if (excludeDevTools && (0, _utils.isDOMElement)(stateNode) && stateNode.closest('[data-buoy-root]')) return true;
|
|
507
514
|
|
|
508
515
|
// Check cache first (O(1)) - but only for the current excludeDevTools setting
|
|
509
516
|
// When excludeDevTools is false, skip cache to re-evaluate all nodes
|
|
@@ -926,7 +933,7 @@ function handleTraceUpdates(nodes) {
|
|
|
926
933
|
let renderCause;
|
|
927
934
|
if (trackCauses && batchNativeTags) {
|
|
928
935
|
const node = stateNode;
|
|
929
|
-
const fiber = node
|
|
936
|
+
const fiber = getFiberFromNode(node);
|
|
930
937
|
renderCause = (0, _RenderCauseDetector.detectRenderCause)(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
|
|
931
938
|
}
|
|
932
939
|
_RenderTracker.RenderTracker.trackRender({
|
|
@@ -962,7 +969,7 @@ function handleTraceUpdates(nodes) {
|
|
|
962
969
|
let renderCause;
|
|
963
970
|
if (trackCauses && batchNativeTags) {
|
|
964
971
|
const node = stateNode;
|
|
965
|
-
const fiber = node
|
|
972
|
+
const fiber = getFiberFromNode(node);
|
|
966
973
|
renderCause = (0, _RenderCauseDetector.detectRenderCause)(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
|
|
967
974
|
}
|
|
968
975
|
_RenderTracker.RenderTracker.emitRenderEvent({
|
|
@@ -1058,7 +1065,7 @@ function measureNode(publicInstance) {
|
|
|
1058
1065
|
}
|
|
1059
1066
|
function getFiberFromNode(stateNode) {
|
|
1060
1067
|
const node = stateNode;
|
|
1061
|
-
return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || null;
|
|
1068
|
+
return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || (0, _utils.getDOMFiber)(node) || null;
|
|
1062
1069
|
}
|
|
1063
1070
|
|
|
1064
1071
|
/**
|
|
@@ -1170,7 +1177,7 @@ async function locateComponent(params) {
|
|
|
1170
1177
|
const scrollIntoView = params.scrollIntoView !== false;
|
|
1171
1178
|
const margin = typeof params.margin === "number" ? params.margin : 12;
|
|
1172
1179
|
const renders = _RenderTracker.RenderTracker.getRenders();
|
|
1173
|
-
|
|
1180
|
+
const locateFromScreen = async () => {
|
|
1174
1181
|
const described = await (0, _screenElements.describeScreen)();
|
|
1175
1182
|
const q = (params.query ?? "").trim().toLowerCase();
|
|
1176
1183
|
let best;
|
|
@@ -1226,7 +1233,8 @@ async function locateComponent(params) {
|
|
|
1226
1233
|
componentName: best.el.name,
|
|
1227
1234
|
testID: best.el.testID
|
|
1228
1235
|
};
|
|
1229
|
-
}
|
|
1236
|
+
};
|
|
1237
|
+
if (renders.length === 0) return locateFromScreen();
|
|
1230
1238
|
|
|
1231
1239
|
// Rank candidates (skip ranking when an explicit nativeTag was given).
|
|
1232
1240
|
const q = (params.query ?? "").trim().toLowerCase();
|
|
@@ -1246,7 +1254,8 @@ async function locateComponent(params) {
|
|
|
1246
1254
|
}));
|
|
1247
1255
|
const targetTag = params.nativeTag ?? (ranked.length > 0 ? ranked[0].r.nativeTag : undefined);
|
|
1248
1256
|
if (targetTag == null) {
|
|
1249
|
-
|
|
1257
|
+
const located = await locateFromScreen();
|
|
1258
|
+
return located.matched ? located : {
|
|
1250
1259
|
matched: false,
|
|
1251
1260
|
reason: "no-match",
|
|
1252
1261
|
candidates
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "resolveRawEventEmitter", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _utils.resolveDOMEventEmitter;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _utils = require("@buoy-gg/shared-ui/utils");
|
|
@@ -7,6 +7,7 @@ exports.describeScreen = describeScreen;
|
|
|
7
7
|
exports.resolveTouchTarget = resolveTouchTarget;
|
|
8
8
|
exports.tapElement = tapElement;
|
|
9
9
|
exports.waitFor = waitFor;
|
|
10
|
+
var _utils = require("@buoy-gg/shared-ui/utils");
|
|
10
11
|
var _reactNative = require("react-native");
|
|
11
12
|
var _tapMatch = require("./tapMatch");
|
|
12
13
|
/**
|
|
@@ -167,6 +168,8 @@ function traverseFiberTree(fiber, callback, depth = 0, visited = new Set()) {
|
|
|
167
168
|
|
|
168
169
|
/** Get a measurable public instance from a host fiber's stateNode. */
|
|
169
170
|
function getPublicInstance(stateNode) {
|
|
171
|
+
const dom = (0, _utils.getDOMPublicInstance)(stateNode);
|
|
172
|
+
if (dom) return dom;
|
|
170
173
|
if (!stateNode) return null;
|
|
171
174
|
const node = stateNode;
|
|
172
175
|
if (node.canonical?.publicInstance) return node.canonical.publicInstance;
|
|
@@ -179,6 +182,8 @@ function getPublicInstance(stateNode) {
|
|
|
179
182
|
return null;
|
|
180
183
|
}
|
|
181
184
|
function getNativeTag(stateNode) {
|
|
185
|
+
const dom = (0, _utils.getDOMNodeHandle)(stateNode);
|
|
186
|
+
if (dom !== null) return dom;
|
|
182
187
|
if (stateNode == null) return null;
|
|
183
188
|
const n = stateNode;
|
|
184
189
|
if (typeof n.__nativeTag === "number") return n.__nativeTag;
|
|
@@ -253,6 +258,15 @@ function findScrollAncestor(fiber) {
|
|
|
253
258
|
*/
|
|
254
259
|
async function scrollIntoView(targetFiber, publicInstance, stateNode, margin) {
|
|
255
260
|
try {
|
|
261
|
+
if ((0, _utils.isDOMElement)(stateNode)) {
|
|
262
|
+
stateNode.scrollIntoView({
|
|
263
|
+
block: 'nearest',
|
|
264
|
+
inline: 'nearest',
|
|
265
|
+
behavior: 'instant'
|
|
266
|
+
});
|
|
267
|
+
await new Promise(resolve => setTimeout(resolve, 16));
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
256
270
|
const ancestor = findScrollAncestor(targetFiber);
|
|
257
271
|
if (!ancestor) return false;
|
|
258
272
|
const inst = publicInstance;
|
|
@@ -325,7 +339,7 @@ function getOwningComponentName(fiber) {
|
|
|
325
339
|
return null;
|
|
326
340
|
}
|
|
327
341
|
function getProps(fiber) {
|
|
328
|
-
return fiber?.memoizedProps ?? fiber?.pendingProps ?? null;
|
|
342
|
+
return (0, _utils.getDOMControlProps)(fiber?.stateNode, fiber?.memoizedProps ?? fiber?.pendingProps ?? null);
|
|
329
343
|
}
|
|
330
344
|
|
|
331
345
|
/**
|
|
@@ -478,6 +492,8 @@ function measureInstance(instance) {
|
|
|
478
492
|
|
|
479
493
|
// --- Collection -----------------------------------------------------------
|
|
480
494
|
|
|
495
|
+
/** Native hosts behind `ActivityIndicator` (iOS, Android). */
|
|
496
|
+
const SPINNER_HOSTS = new Set(["RCTActivityIndicatorView", "AndroidProgressBar"]);
|
|
481
497
|
function collectCandidates() {
|
|
482
498
|
const roots = getAllFiberRoots();
|
|
483
499
|
if (roots.length === 0) return [];
|
|
@@ -508,8 +524,13 @@ function collectCandidates() {
|
|
|
508
524
|
let text = getVisibleText(props);
|
|
509
525
|
const roleInteractive = role === "button" || role === "link" || role === "menuitem" || role === "tab" || role === "switch" || role === "checkbox";
|
|
510
526
|
|
|
527
|
+
// A spinner carries no text, label or handler, so it earned no row and
|
|
528
|
+
// "is this screen still loading?" had no answer. The host view is the
|
|
529
|
+
// signal: RN renders every ActivityIndicator through one of these.
|
|
530
|
+
const spinner = typeof fiber.type === "string" && SPINNER_HOSTS.has(fiber.type) && props.animating !== false;
|
|
531
|
+
|
|
511
532
|
// A fiber earns a row only if it carries a real signal.
|
|
512
|
-
if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive) {
|
|
533
|
+
if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive && !spinner) {
|
|
513
534
|
return;
|
|
514
535
|
}
|
|
515
536
|
|
|
@@ -572,7 +593,7 @@ function collectCandidates() {
|
|
|
572
593
|
const candidate = {
|
|
573
594
|
nativeTag,
|
|
574
595
|
name,
|
|
575
|
-
role,
|
|
596
|
+
role: role ?? (spinner ? "progressbar" : undefined),
|
|
576
597
|
testID,
|
|
577
598
|
label,
|
|
578
599
|
text,
|
|
@@ -293,7 +293,16 @@ function handleCommit(root) {
|
|
|
293
293
|
if (visited > MAX_FIBERS_PER_COMMIT) break;
|
|
294
294
|
let skipSubtree = false;
|
|
295
295
|
const composite = isCompositeTag(fiber.tag);
|
|
296
|
-
|
|
296
|
+
|
|
297
|
+
// Buoy's own tree โ the floating menu, open tool sheets, the Bench REC
|
|
298
|
+
// bar โ hangs under one View marked __buoyDevToolsRoot. Name matching
|
|
299
|
+
// missed most of it (ExpandableWindowControls, RunningPanel, anonymous
|
|
300
|
+
// compiled components), so a Bench recording's "top re-renderers" was
|
|
301
|
+
// mostly Buoy redrawing its own recording UI. The marker is structural,
|
|
302
|
+
// so this can't hide app components the way a name prefix did.
|
|
303
|
+
if (fiber.memoizedProps?.__buoyDevToolsRoot) {
|
|
304
|
+
skipSubtree = true;
|
|
305
|
+
} else if (composite) {
|
|
297
306
|
const compositeName = getComponentName(fiber);
|
|
298
307
|
// Only Buoy's render-tracking UI gets its SUBTREE pruned โ walking it
|
|
299
308
|
// feeds its own renders back in and loops. Everything else that's merely
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getDOMFiber, getDOMNodeHandle, getDOMPublicInstance, isDOMElement } from "@buoy-gg/shared-ui/utils";
|
|
1
4
|
/**
|
|
2
5
|
* Highlight Updates Controller
|
|
3
6
|
*
|
|
@@ -26,7 +29,6 @@
|
|
|
26
29
|
*/
|
|
27
30
|
|
|
28
31
|
"use strict";
|
|
29
|
-
|
|
30
32
|
import { installProfilerInterceptor, uninstallProfilerInterceptor, setComparisonCallback } from "./ProfilerInterceptor";
|
|
31
33
|
import { findNodeHandle, UIManager, Dimensions, PixelRatio } from "react-native";
|
|
32
34
|
import { RenderTracker } from "./RenderTracker";
|
|
@@ -81,6 +83,8 @@ function debugLog(message, data) {
|
|
|
81
83
|
* Get the public instance from a stateNode (the node passed in traceUpdates)
|
|
82
84
|
*/
|
|
83
85
|
function getPublicInstance(stateNode) {
|
|
86
|
+
const dom = getDOMPublicInstance(stateNode);
|
|
87
|
+
if (dom) return dom;
|
|
84
88
|
if (!stateNode) return null;
|
|
85
89
|
const node = stateNode;
|
|
86
90
|
|
|
@@ -105,6 +109,8 @@ function getPublicInstance(stateNode) {
|
|
|
105
109
|
* Get native tag from public instance or stateNode
|
|
106
110
|
*/
|
|
107
111
|
function getNativeTag(instance) {
|
|
112
|
+
const dom = getDOMNodeHandle(instance);
|
|
113
|
+
if (dom !== null) return dom;
|
|
108
114
|
if (instance == null) return null;
|
|
109
115
|
const inst = instance;
|
|
110
116
|
|
|
@@ -143,7 +149,7 @@ function extractComponentInfo(stateNode) {
|
|
|
143
149
|
|
|
144
150
|
// Try to get props from various locations
|
|
145
151
|
// Fabric: canonical.internalInstanceHandle, Paper: _internalInstanceHandle, RN CLI DEV: _internalFiberInstanceHandleDEV
|
|
146
|
-
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
|
|
152
|
+
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || getDOMFiber(node);
|
|
147
153
|
const currentProps = node?.canonical?.currentProps;
|
|
148
154
|
const pendingProps = node?.canonical?.pendingProps;
|
|
149
155
|
const fiberPendingProps = fiber?.pendingProps;
|
|
@@ -486,7 +492,7 @@ function isOurOverlayNode(stateNode) {
|
|
|
486
492
|
// Fabric: fiber is at canonical.internalInstanceHandle
|
|
487
493
|
// Paper/Legacy: fiber is at _internalInstanceHandle directly on stateNode
|
|
488
494
|
// RN CLI DEV: fiber is at _internalFiberInstanceHandleDEV
|
|
489
|
-
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV;
|
|
495
|
+
const fiber = node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || getDOMFiber(node);
|
|
490
496
|
|
|
491
497
|
// Get nativeTag for caching
|
|
492
498
|
const nativeTag = getNativeTag(stateNode) || getNativeTag(node?.canonical?.publicInstance);
|
|
@@ -500,6 +506,7 @@ function isOurOverlayNode(stateNode) {
|
|
|
500
506
|
// the cache and can't poison it.
|
|
501
507
|
const benchMode = isCapturingBuoyToolRenders();
|
|
502
508
|
const excludeDevTools = !benchMode && RenderTracker.getSettings().excludeDevTools;
|
|
509
|
+
if (excludeDevTools && isDOMElement(stateNode) && stateNode.closest('[data-buoy-root]')) return true;
|
|
503
510
|
|
|
504
511
|
// Check cache first (O(1)) - but only for the current excludeDevTools setting
|
|
505
512
|
// When excludeDevTools is false, skip cache to re-evaluate all nodes
|
|
@@ -922,7 +929,7 @@ function handleTraceUpdates(nodes) {
|
|
|
922
929
|
let renderCause;
|
|
923
930
|
if (trackCauses && batchNativeTags) {
|
|
924
931
|
const node = stateNode;
|
|
925
|
-
const fiber = node
|
|
932
|
+
const fiber = getFiberFromNode(node);
|
|
926
933
|
renderCause = detectRenderCause(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
|
|
927
934
|
}
|
|
928
935
|
RenderTracker.trackRender({
|
|
@@ -958,7 +965,7 @@ function handleTraceUpdates(nodes) {
|
|
|
958
965
|
let renderCause;
|
|
959
966
|
if (trackCauses && batchNativeTags) {
|
|
960
967
|
const node = stateNode;
|
|
961
|
-
const fiber = node
|
|
968
|
+
const fiber = getFiberFromNode(node);
|
|
962
969
|
renderCause = detectRenderCause(rect.id, fiber, batchNativeTags, settings.debugLogLevel);
|
|
963
970
|
}
|
|
964
971
|
RenderTracker.emitRenderEvent({
|
|
@@ -1054,7 +1061,7 @@ function measureNode(publicInstance) {
|
|
|
1054
1061
|
}
|
|
1055
1062
|
function getFiberFromNode(stateNode) {
|
|
1056
1063
|
const node = stateNode;
|
|
1057
|
-
return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || null;
|
|
1064
|
+
return node?.canonical?.internalInstanceHandle || node?._internalInstanceHandle || node?._internalFiberInstanceHandleDEV || getDOMFiber(node) || null;
|
|
1058
1065
|
}
|
|
1059
1066
|
|
|
1060
1067
|
/**
|
|
@@ -1166,7 +1173,7 @@ async function locateComponent(params) {
|
|
|
1166
1173
|
const scrollIntoView = params.scrollIntoView !== false;
|
|
1167
1174
|
const margin = typeof params.margin === "number" ? params.margin : 12;
|
|
1168
1175
|
const renders = RenderTracker.getRenders();
|
|
1169
|
-
|
|
1176
|
+
const locateFromScreen = async () => {
|
|
1170
1177
|
const described = await describeScreen();
|
|
1171
1178
|
const q = (params.query ?? "").trim().toLowerCase();
|
|
1172
1179
|
let best;
|
|
@@ -1222,7 +1229,8 @@ async function locateComponent(params) {
|
|
|
1222
1229
|
componentName: best.el.name,
|
|
1223
1230
|
testID: best.el.testID
|
|
1224
1231
|
};
|
|
1225
|
-
}
|
|
1232
|
+
};
|
|
1233
|
+
if (renders.length === 0) return locateFromScreen();
|
|
1226
1234
|
|
|
1227
1235
|
// Rank candidates (skip ranking when an explicit nativeTag was given).
|
|
1228
1236
|
const q = (params.query ?? "").trim().toLowerCase();
|
|
@@ -1242,7 +1250,8 @@ async function locateComponent(params) {
|
|
|
1242
1250
|
}));
|
|
1243
1251
|
const targetTag = params.nativeTag ?? (ranked.length > 0 ? ranked[0].r.nativeTag : undefined);
|
|
1244
1252
|
if (targetTag == null) {
|
|
1245
|
-
|
|
1253
|
+
const located = await locateFromScreen();
|
|
1254
|
+
return located.matched ? located : {
|
|
1246
1255
|
matched: false,
|
|
1247
1256
|
reason: "no-match",
|
|
1248
1257
|
candidates
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { getDOMControlProps, getDOMNodeHandle, getDOMPublicInstance, isDOMElement } from "@buoy-gg/shared-ui/utils";
|
|
3
4
|
/**
|
|
4
5
|
* On-device screen element discovery + in-JS tap.
|
|
5
6
|
*
|
|
@@ -161,6 +162,8 @@ function traverseFiberTree(fiber, callback, depth = 0, visited = new Set()) {
|
|
|
161
162
|
|
|
162
163
|
/** Get a measurable public instance from a host fiber's stateNode. */
|
|
163
164
|
function getPublicInstance(stateNode) {
|
|
165
|
+
const dom = getDOMPublicInstance(stateNode);
|
|
166
|
+
if (dom) return dom;
|
|
164
167
|
if (!stateNode) return null;
|
|
165
168
|
const node = stateNode;
|
|
166
169
|
if (node.canonical?.publicInstance) return node.canonical.publicInstance;
|
|
@@ -173,6 +176,8 @@ function getPublicInstance(stateNode) {
|
|
|
173
176
|
return null;
|
|
174
177
|
}
|
|
175
178
|
function getNativeTag(stateNode) {
|
|
179
|
+
const dom = getDOMNodeHandle(stateNode);
|
|
180
|
+
if (dom !== null) return dom;
|
|
176
181
|
if (stateNode == null) return null;
|
|
177
182
|
const n = stateNode;
|
|
178
183
|
if (typeof n.__nativeTag === "number") return n.__nativeTag;
|
|
@@ -247,6 +252,15 @@ function findScrollAncestor(fiber) {
|
|
|
247
252
|
*/
|
|
248
253
|
async function scrollIntoView(targetFiber, publicInstance, stateNode, margin) {
|
|
249
254
|
try {
|
|
255
|
+
if (isDOMElement(stateNode)) {
|
|
256
|
+
stateNode.scrollIntoView({
|
|
257
|
+
block: 'nearest',
|
|
258
|
+
inline: 'nearest',
|
|
259
|
+
behavior: 'instant'
|
|
260
|
+
});
|
|
261
|
+
await new Promise(resolve => setTimeout(resolve, 16));
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
250
264
|
const ancestor = findScrollAncestor(targetFiber);
|
|
251
265
|
if (!ancestor) return false;
|
|
252
266
|
const inst = publicInstance;
|
|
@@ -319,7 +333,7 @@ function getOwningComponentName(fiber) {
|
|
|
319
333
|
return null;
|
|
320
334
|
}
|
|
321
335
|
function getProps(fiber) {
|
|
322
|
-
return fiber?.memoizedProps ?? fiber?.pendingProps ?? null;
|
|
336
|
+
return getDOMControlProps(fiber?.stateNode, fiber?.memoizedProps ?? fiber?.pendingProps ?? null);
|
|
323
337
|
}
|
|
324
338
|
|
|
325
339
|
/**
|
|
@@ -472,6 +486,8 @@ function measureInstance(instance) {
|
|
|
472
486
|
|
|
473
487
|
// --- Collection -----------------------------------------------------------
|
|
474
488
|
|
|
489
|
+
/** Native hosts behind `ActivityIndicator` (iOS, Android). */
|
|
490
|
+
const SPINNER_HOSTS = new Set(["RCTActivityIndicatorView", "AndroidProgressBar"]);
|
|
475
491
|
function collectCandidates() {
|
|
476
492
|
const roots = getAllFiberRoots();
|
|
477
493
|
if (roots.length === 0) return [];
|
|
@@ -502,8 +518,13 @@ function collectCandidates() {
|
|
|
502
518
|
let text = getVisibleText(props);
|
|
503
519
|
const roleInteractive = role === "button" || role === "link" || role === "menuitem" || role === "tab" || role === "switch" || role === "checkbox";
|
|
504
520
|
|
|
521
|
+
// A spinner carries no text, label or handler, so it earned no row and
|
|
522
|
+
// "is this screen still loading?" had no answer. The host view is the
|
|
523
|
+
// signal: RN renders every ActivityIndicator through one of these.
|
|
524
|
+
const spinner = typeof fiber.type === "string" && SPINNER_HOSTS.has(fiber.type) && props.animating !== false;
|
|
525
|
+
|
|
505
526
|
// A fiber earns a row only if it carries a real signal.
|
|
506
|
-
if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive) {
|
|
527
|
+
if (!hasPress && !hasValue && !hasText && !testID && !label && !text && !roleInteractive && !spinner) {
|
|
507
528
|
return;
|
|
508
529
|
}
|
|
509
530
|
|
|
@@ -566,7 +587,7 @@ function collectCandidates() {
|
|
|
566
587
|
const candidate = {
|
|
567
588
|
nativeTag,
|
|
568
589
|
name,
|
|
569
|
-
role,
|
|
590
|
+
role: role ?? (spinner ? "progressbar" : undefined),
|
|
570
591
|
testID,
|
|
571
592
|
label,
|
|
572
593
|
text,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommitProfiler.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/CommitProfiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"CommitProfiler.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/CommitProfiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,oBAAoB,CAAC;AA0b5B,iBAAS,WAAW,IAAI,OAAO,CAI9B;AAED,iBAAS,WAAW,IAAI,OAAO,CAE9B;AAED;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAUvD;AAED,uEAAuE;AACvE,iBAAS,WAAW,IAAI,oBAAoB,GAAG,IAAI,CA4ClD;AAMD,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
|
|
@@ -1,29 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Highlight Updates Controller
|
|
3
|
-
*
|
|
4
|
-
* Standalone implementation that replicates React DevTools' "Highlight updates
|
|
5
|
-
* when components render" feature WITHOUT requiring DevTools to be connected.
|
|
6
|
-
*
|
|
7
|
-
* Architecture:
|
|
8
|
-
* This controller directly enables the DevTools backend's traceUpdates feature
|
|
9
|
-
* by calling setTraceUpdatesEnabled(true) on each renderer interface. This is
|
|
10
|
-
* the same function that DevTools' frontend calls when you check the
|
|
11
|
-
* "Highlight updates when components render" checkbox.
|
|
12
|
-
*
|
|
13
|
-
* Key insight: The rendererInterfaces are available on the global hook even
|
|
14
|
-
* without DevTools frontend connected. We just need to enable tracing directly.
|
|
15
|
-
*
|
|
16
|
-
* Flow:
|
|
17
|
-
* 1. User enables highlights via toggle()
|
|
18
|
-
* 2. We call rendererInterface.setTraceUpdatesEnabled(true) on all renderers
|
|
19
|
-
* 3. DevTools backend now tracks renders and emits 'traceUpdates' events
|
|
20
|
-
* 4. We subscribe to 'traceUpdates' via hook.sub()
|
|
21
|
-
* 5. When components re-render, we receive the Set of host stateNodes
|
|
22
|
-
* 6. We measure each node and render colored border highlights
|
|
23
|
-
*
|
|
24
|
-
* This gives us 100% accuracy with DevTools behavior because we're using the
|
|
25
|
-
* exact same detection code - we're just enabling it programmatically.
|
|
26
|
-
*/
|
|
27
1
|
interface HighlightRect {
|
|
28
2
|
id: number;
|
|
29
3
|
x: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HighlightUpdatesController.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/HighlightUpdatesController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HighlightUpdatesController.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/HighlightUpdatesController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawEventEmitter.web.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/rawEventEmitter.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* On-device screen element discovery + in-JS tap.
|
|
3
|
-
*
|
|
4
|
-
* This powers the MCP "describe_screen" / "tap_element" tools. It walks the
|
|
5
|
-
* live React fiber tree (all renderers), collects the meaningful / interactive
|
|
6
|
-
* elements on the current screen, and measures each one's on-screen rect โ the
|
|
7
|
-
* same idea as the desktop screenshot tool's component-locate, but producing a
|
|
8
|
-
* whole-screen list with normalized tap coordinates instead of a single crop.
|
|
9
|
-
*
|
|
10
|
-
* Tapping is done PURELY in JS: we resolve the target element, find the nearest
|
|
11
|
-
* `onPress` handler up its fiber chain, and invoke it with a synthetic press
|
|
12
|
-
* event. No screenshots, no OS-level touch injection, and it works on physical
|
|
13
|
-
* devices โ because Buoy runs INSIDE the app (unlike external simulator drivers
|
|
14
|
-
* that have to inject an OS touch at a pixel coordinate).
|
|
15
|
-
*
|
|
16
|
-
* Fiber traversal is adapted from image-overlay/utils/fiberScanner.ts and
|
|
17
|
-
* debug-borders/utils/fiberTreeTraversal.js; the fiber-access triad matches the
|
|
18
|
-
* rest of highlight-updates (Fabric / Paper / RN-CLI-dev).
|
|
19
|
-
*/
|
|
20
1
|
export interface ScreenElement {
|
|
21
2
|
nativeTag: number | null;
|
|
22
3
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenElements.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/screenElements.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenElements.d.ts","sourceRoot":"","sources":["../../../../src/highlight-updates/utils/screenElements.ts"],"names":[],"mappings":"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"}
|