Skip to content

Commit d6c06c5

Browse files
authored
refactor: make cdp resolvers use McpPage (#1060)
Makes cdp resolvers scoped to the page. Once collectors are per McpPage, the entire method could be moved to McpPage.
1 parent 40c241b commit d6c06c5

File tree

5 files changed

+33
-24
lines changed

5 files changed

+33
-24
lines changed

src/McpContext.ts

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,12 @@ export class McpContext implements Context {
207207
return this.#requestPage?.pptrPage ?? this.getSelectedPptrPage();
208208
}
209209

210-
resolveCdpRequestId(cdpRequestId: string): number | undefined {
211-
const selectedPage = this.#resolveTargetPage();
210+
resolveCdpRequestId(page: McpPage, cdpRequestId: string): number | undefined {
212211
if (!cdpRequestId) {
213212
this.logger('no network request');
214213
return;
215214
}
216-
const request = this.#networkCollector.find(selectedPage, request => {
215+
const request = this.#networkCollector.find(page.pptrPage, request => {
217216
// @ts-expect-error id is internal.
218217
return request.id === cdpRequestId;
219218
});
@@ -225,31 +224,27 @@ export class McpContext implements Context {
225224
}
226225

227226
resolveCdpElementId(
227+
page: McpPage,
228228
cdpBackendNodeId: number,
229-
page?: Page,
230229
): string | undefined {
231230
if (!cdpBackendNodeId) {
232231
this.logger('no cdpBackendNodeId');
233232
return;
234233
}
235-
const snapshots = page
236-
? [this.#mcpPages.get(page)?.textSnapshot].filter(Boolean)
237-
: [...this.#mcpPages.values()].map(mp => mp.textSnapshot).filter(Boolean);
238-
if (!snapshots.length) {
234+
const snapshot = page.textSnapshot;
235+
if (!snapshot) {
239236
this.logger('no text snapshot');
240237
return;
241238
}
242239
// TODO: index by backendNodeId instead.
243-
for (const snapshot of snapshots) {
244-
const queue = [snapshot!.root];
245-
while (queue.length) {
246-
const current = queue.pop()!;
247-
if (current.backendNodeId === cdpBackendNodeId) {
248-
return current.id;
249-
}
250-
for (const child of current.children) {
251-
queue.push(child);
252-
}
240+
const queue = [snapshot.root];
241+
while (queue.length) {
242+
const current = queue.pop()!;
243+
if (current.backendNodeId === cdpBackendNodeId) {
244+
return current.id;
245+
}
246+
for (const child of current.children) {
247+
queue.push(child);
253248
}
254249
}
255250
return;
@@ -971,8 +966,8 @@ export class McpContext implements Context {
971966
if (data?.cdpBackendNodeId) {
972967
snapshot.hasSelectedElement = true;
973968
snapshot.selectedElementUid = this.resolveCdpElementId(
969+
mcpPage,
974970
data?.cdpBackendNodeId,
975-
page,
976971
);
977972
}
978973

src/McpResponse.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,19 @@ export class McpResponse implements Response {
320320
devTools: devTools ?? undefined,
321321
});
322322
} else if (message instanceof DevTools.AggregatedIssue) {
323+
if (!this.#page) {
324+
throw new Error(`Response must have an McpPage`);
325+
}
323326
const formatter = new IssueFormatter(message, {
324327
id: consoleMessageStableId,
325-
requestIdResolver: context.resolveCdpRequestId.bind(context),
326-
elementIdResolver: context.resolveCdpElementId.bind(context),
328+
requestIdResolver: context.resolveCdpRequestId.bind(
329+
context,
330+
this.#page,
331+
),
332+
elementIdResolver: context.resolveCdpElementId.bind(
333+
context,
334+
this.#page,
335+
),
327336
});
328337
if (!formatter.isValid()) {
329338
throw new Error(

src/tools/ToolDefinition.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,10 @@ export type Context = Readonly<{
179179
/**
180180
* Returns a reqid for a cdpRequestId.
181181
*/
182-
resolveCdpRequestId(cdpRequestId: string): number | undefined;
182+
resolveCdpRequestId(
183+
page: ContextPage,
184+
cdpRequestId: string,
185+
): number | undefined;
183186
getScreenRecorder(): {recorder: ScreenRecorder; filePath: string} | null;
184187
setScreenRecorder(
185188
data: {recorder: ScreenRecorder; filePath: string} | null,

src/tools/network.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export const listNetworkRequests = definePageTool({
7474
const data = await context.getDevToolsData();
7575
response.attachDevToolsData(data);
7676
const reqid = data?.cdpRequestId
77-
? context.resolveCdpRequestId(data.cdpRequestId)
77+
? context.resolveCdpRequestId(request.page, data.cdpRequestId)
7878
: undefined;
7979
response.setIncludeNetworkRequests(true, {
8080
pageSize: request.params.pageSize,
@@ -123,7 +123,7 @@ export const getNetworkRequest = definePageTool({
123123
const data = await context.getDevToolsData();
124124
response.attachDevToolsData(data);
125125
const reqid = data?.cdpRequestId
126-
? context.resolveCdpRequestId(data.cdpRequestId)
126+
? context.resolveCdpRequestId(request.page, data.cdpRequestId)
127127
: undefined;
128128
if (reqid) {
129129
response.attachNetworkRequest(reqid, {

tests/tools/console.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ describe('console', () => {
212212
context,
213213
);
214214
const response2 = new McpResponse({} as ParsedArguments);
215+
response2.setPage(context.getSelectedMcpPage());
215216
await getConsoleMessage.handler(
216217
{params: {msgid: 1}, page: context.getSelectedMcpPage()},
217218
response2,
@@ -267,6 +268,7 @@ describe('console', () => {
267268
context,
268269
);
269270
const response2 = new McpResponse({} as ParsedArguments);
271+
response2.setPage(context.getSelectedMcpPage());
270272
await getConsoleMessage.handler(
271273
{params: {msgid: id}, page: context.getSelectedMcpPage()},
272274
response2,

0 commit comments

Comments
 (0)