Skip to content

Commit 654b1ab

Browse files
committed
feat: read elements from DevTools UI
1 parent 796aed7 commit 654b1ab

File tree

1 file changed

+44
-23
lines changed

1 file changed

+44
-23
lines changed

src/McpContext.ts

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -378,35 +378,56 @@ export class McpContext implements Context {
378378
return this.#pageToDevToolsPage.get(page);
379379
}
380380

381-
async getDevToolsData(): Promise<undefined | {requestId?: number}> {
381+
async getDevToolsData(): Promise<
382+
undefined | {requestId?: number; uid?: string}
383+
> {
382384
try {
383385
const selectedPage = this.getSelectedPage();
384386
const devtoolsPage = this.getDevToolsPage(selectedPage);
385387
if (devtoolsPage) {
386-
const cdpRequestId = await devtoolsPage.evaluate(async () => {
387-
// @ts-expect-error no types
388-
const UI = await import('/bundled/ui/legacy/legacy.js');
389-
// @ts-expect-error no types
390-
const SDK = await import('/bundled/core/sdk/sdk.js');
391-
const request = UI.Context.Context.instance().flavor(
392-
SDK.NetworkRequest.NetworkRequest,
393-
);
394-
return request?.requestId();
395-
});
396-
if (!cdpRequestId) {
397-
this.logger('no context request');
398-
return;
399-
}
400-
const request = this.#networkCollector.find(selectedPage, request => {
401-
// @ts-expect-error id is internal.
402-
return request.id === cdpRequestId;
403-
});
404-
if (!request) {
405-
this.logger('no collected request for ' + cdpRequestId);
388+
const {cdpRequestId, cdpBackendNodeId} = await devtoolsPage.evaluate(
389+
async () => {
390+
// @ts-expect-error no types
391+
const UI = await import('/bundled/ui/legacy/legacy.js');
392+
// @ts-expect-error no types
393+
const SDK = await import('/bundled/core/sdk/sdk.js');
394+
const request = UI.Context.Context.instance().flavor(
395+
SDK.NetworkRequest.NetworkRequest,
396+
);
397+
const node = UI.Context.Context.instance().flavor(
398+
SDK.DOMModel.DOMNode,
399+
);
400+
return {
401+
cdpRequestId: request?.requestId(),
402+
cdpBackendNodeId: node?.backendNodeId(),
403+
};
404+
},
405+
);
406+
const resolveNetworkRequestId = () => {
407+
if (!cdpRequestId) {
408+
this.logger('no context request');
409+
return;
410+
}
411+
const request = this.#networkCollector.find(selectedPage, request => {
412+
// @ts-expect-error id is internal.
413+
return request.id === cdpRequestId;
414+
});
415+
if (!request) {
416+
this.logger('no collected request for ' + cdpRequestId);
417+
return;
418+
}
419+
return this.#networkCollector.getIdForResource(request);
420+
};
421+
const resolveNodeUid = (): string | undefined => {
422+
if (!cdpBackendNodeId) {
423+
this.logger('no cdpBackendNodeId');
424+
return;
425+
}
406426
return;
407-
}
427+
};
408428
return {
409-
requestId: this.#networkCollector.getIdForResource(request),
429+
requestId: resolveNetworkRequestId(),
430+
uid: resolveNodeUid(),
410431
};
411432
} else {
412433
this.logger('no devtools page deteched');

0 commit comments

Comments
 (0)