Skip to content

Commit 1c6f5f1

Browse files
committed
move getDevToolsData
1 parent b5f1a04 commit 1c6f5f1

12 files changed

Lines changed: 60 additions & 96 deletions

src/McpContext.ts

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,7 @@ import {Locator} from './third_party/index.js';
3535
import {PredefinedNetworkConditions} from './third_party/index.js';
3636
import {listPages} from './tools/pages.js';
3737
import {CLOSE_PAGE_ERROR} from './tools/ToolDefinition.js';
38-
import type {
39-
Context,
40-
DevToolsData,
41-
SupportedExtensions,
42-
} from './tools/ToolDefinition.js';
38+
import type {Context, SupportedExtensions} from './tools/ToolDefinition.js';
4339
import type {TraceResult} from './trace-processing/parse.js';
4440
import type {
4541
EmulationSettings,
@@ -643,47 +639,6 @@ export class McpContext implements Context {
643639
return this.#mcpPages.get(page)?.isolatedContextName;
644640
}
645641

646-
getDevToolsPage(page: Page): Page | undefined {
647-
return this.#mcpPages.get(page)?.devToolsPage;
648-
}
649-
650-
async getDevToolsData(page: McpPage): Promise<DevToolsData> {
651-
try {
652-
this.logger('Getting DevTools UI data');
653-
const devtoolsPage = this.getDevToolsPage(page.pptrPage);
654-
if (!devtoolsPage) {
655-
this.logger('No DevTools page detected');
656-
return {};
657-
}
658-
const {cdpRequestId, cdpBackendNodeId} = await devtoolsPage.evaluate(
659-
async () => {
660-
// @ts-expect-error no types
661-
const UI = await import('/bundled/ui/legacy/legacy.js');
662-
// @ts-expect-error no types
663-
const SDK = await import('/bundled/core/sdk/sdk.js');
664-
const request = UI.Context.Context.instance().flavor(
665-
SDK.NetworkRequest.NetworkRequest,
666-
);
667-
const node = UI.Context.Context.instance().flavor(
668-
SDK.DOMModel.DOMNode,
669-
);
670-
return {
671-
cdpRequestId: request?.requestId(),
672-
cdpBackendNodeId: node?.backendNodeId(),
673-
};
674-
},
675-
);
676-
return {cdpBackendNodeId, cdpRequestId};
677-
} catch (err) {
678-
this.logger('error getting devtools data', err);
679-
}
680-
return {};
681-
}
682-
683-
/**
684-
* Creates a text snapshot of a page.
685-
*/
686-
687642
async saveTemporaryFile(
688643
data: Uint8Array<ArrayBufferLike>,
689644
filename: string,

src/McpPage.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import type {
1515
} from './third_party/index.js';
1616
import type {ToolGroup, ToolDefinition} from './tools/inPage.js';
1717
import {takeSnapshot} from './tools/snapshot.js';
18-
import type {ContextPage, Context, Response} from './tools/ToolDefinition.js';
18+
import type {
19+
ContextPage,
20+
DevToolsData,
21+
Response,
22+
} from './tools/ToolDefinition.js';
1923
import type {
2024
EmulationSettings,
2125
GeolocationOptions,
@@ -136,7 +140,6 @@ export class McpPage implements ContextPage {
136140
toolName: string,
137141
params: Record<string, unknown>,
138142
response: Response,
139-
context: Context,
140143
): Promise<void> {
141144
// Creates array of ElementHandles from the UIDs in the params.
142145
// We do not replace the uids with the ElementsHandles yet, because
@@ -277,7 +280,7 @@ export class McpPage implements ContextPage {
277280
}
278281
const resultWithStashedElements = result.result;
279282
if (elementHandles.length) {
280-
this.textSnapshot = await TextSnapshot.create(this, context, {
283+
this.textSnapshot = await TextSnapshot.create(this, {
281284
extraHandles: elementHandles,
282285
});
283286
response.includeSnapshot();
@@ -370,4 +373,37 @@ export class McpPage implements ContextPage {
370373
}
371374
return;
372375
}
376+
377+
async getDevToolsData(): Promise<DevToolsData> {
378+
try {
379+
logger('Getting DevTools UI data');
380+
const devtoolsPage = this.devToolsPage;
381+
if (!devtoolsPage) {
382+
logger('No DevTools page detected');
383+
return {};
384+
}
385+
const {cdpRequestId, cdpBackendNodeId} = await devtoolsPage.evaluate(
386+
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+
const node = UI.Context.Context.instance().flavor(
395+
SDK.DOMModel.DOMNode,
396+
);
397+
return {
398+
cdpRequestId: request?.requestId(),
399+
cdpBackendNodeId: node?.backendNodeId(),
400+
};
401+
},
402+
);
403+
return {cdpBackendNodeId, cdpRequestId};
404+
} catch (err) {
405+
logger('error getting devtools data', err);
406+
}
407+
return {};
408+
}
373409
}

src/McpResponse.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ export class McpResponse implements Response {
444444
if (!this.#page) {
445445
throw new Error('Response must have a page');
446446
}
447-
this.#page.textSnapshot = await TextSnapshot.create(this.#page, context, {
447+
this.#page.textSnapshot = await TextSnapshot.create(this.#page, {
448448
verbose: this.#snapshotParams.verbose,
449449
devtoolsData: this.#devToolsData,
450450
});

src/TextSnapshot.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type {
1111
SerializedAXNode,
1212
ElementHandle,
1313
} from './third_party/index.js';
14-
import type {Context, DevToolsData} from './tools/ToolDefinition.js';
14+
import type {DevToolsData} from './tools/ToolDefinition.js';
1515
import type {TextSnapshotNode} from './types.js';
1616

1717
export class TextSnapshot {
@@ -46,7 +46,6 @@ export class TextSnapshot {
4646

4747
static async create(
4848
page: McpPage,
49-
context: Context,
5049
options: {
5150
verbose?: boolean;
5251
devtoolsData?: DevToolsData;
@@ -131,10 +130,12 @@ export class TextSnapshot {
131130
verbose,
132131
});
133132

134-
const data = options.devtoolsData ?? (await context.getDevToolsData(page));
133+
const data = options.devtoolsData ?? (await page.getDevToolsData());
135134
if (data?.cdpBackendNodeId) {
136135
snapshot.hasSelectedElement = true;
137-
snapshot.selectedElementUid = page.resolveCdpElementId(data.cdpBackendNodeId);
136+
snapshot.selectedElementUid = page.resolveCdpElementId(
137+
data.cdpBackendNodeId,
138+
);
138139
}
139140

140141
// Clean up unique IDs that we did not see anymore.

src/tools/ToolDefinition.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ export type Context = Readonly<{
204204
timeout?: number,
205205
page?: Page,
206206
): Promise<Element>;
207-
getDevToolsData(page: ContextPage): Promise<DevToolsData>;
208207
/**
209208
* Returns a reqid for a cdpRequestId.
210209
*/
@@ -253,8 +252,8 @@ export type ContextPage = Readonly<{
253252
toolName: string,
254253
params: Record<string, unknown>,
255254
response: Response,
256-
context: Context,
257255
): Promise<void>;
256+
getDevToolsData(): Promise<DevToolsData>;
258257
}>;
259258

260259
export function defineTool<Schema extends zod.ZodRawShape>(

src/tools/inPage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export const executeInPageTool = definePageTool({
7171
.optional()
7272
.describe('The JSON-stringified parameters to pass to the tool'),
7373
},
74-
handler: async (request, response, context) => {
74+
handler: async (request, response) => {
7575
const toolName = request.params.toolName;
7676
let params: Record<string, unknown> = {};
7777
if (request.params.params) {
@@ -102,6 +102,6 @@ export const executeInPageTool = definePageTool({
102102
);
103103
}
104104

105-
await request.page.executeInPageTool(toolName, params, response, context);
105+
await request.page.executeInPageTool(toolName, params, response);
106106
},
107107
});

src/tools/network.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export const listNetworkRequests = definePageTool({
7171
),
7272
},
7373
handler: async (request, response, context) => {
74-
const data = await context.getDevToolsData(request.page);
74+
const data = await request.page.getDevToolsData();
7575
response.attachDevToolsData(data);
7676
const reqid = data?.cdpRequestId
7777
? context.resolveCdpRequestId(request.page, data.cdpRequestId)
@@ -120,7 +120,7 @@ export const getNetworkRequest = definePageTool({
120120
responseFilePath: request.params.responseFilePath,
121121
});
122122
} else {
123-
const data = await context.getDevToolsData(request.page);
123+
const data = await request.page.getDevToolsData();
124124
response.attachDevToolsData(data);
125125
const reqid = data?.cdpRequestId
126126
? context.resolveCdpRequestId(request.page, data.cdpRequestId)

tests/McpContext.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ describe('McpContext', () => {
3232
value="Input"
3333
/>`,
3434
);
35-
page.textSnapshot = await TextSnapshot.create(page, context);
35+
page.textSnapshot = await TextSnapshot.create(page);
3636
assert.ok(await page.getElementByUid('1_1'));
37-
page.textSnapshot = await TextSnapshot.create(page, context);
37+
page.textSnapshot = await TextSnapshot.create(page);
3838
await page.getElementByUid('1_1');
3939
});
4040
});
@@ -92,7 +92,7 @@ describe('McpContext', () => {
9292
async (_response, context) => {
9393
const page = await context.newPage();
9494
await context.createPagesSnapshot();
95-
assert.ok(context.getDevToolsPage(page.pptrPage));
95+
assert.ok(page.devToolsPage);
9696
},
9797
{
9898
autoOpenDevTools: true,
@@ -104,7 +104,7 @@ describe('McpContext', () => {
104104
// Page 1: set content and snapshot
105105
const page1 = context.getSelectedMcpPage();
106106
await page1.pptrPage.setContent(html`<button>Page1 Button</button>`);
107-
page1.textSnapshot = await TextSnapshot.create(page1, context, {
107+
page1.textSnapshot = await TextSnapshot.create(page1, {
108108
verbose: false,
109109
});
110110

@@ -117,7 +117,7 @@ describe('McpContext', () => {
117117
const page2 = await context.newPage();
118118
context.selectPage(page2);
119119
await page2.pptrPage.setContent(html`<button>Page2 Button</button>`);
120-
page2.textSnapshot = await TextSnapshot.create(page2, context, {
120+
page2.textSnapshot = await TextSnapshot.create(page2, {
121121
verbose: false,
122122
});
123123

@@ -243,7 +243,7 @@ describe('McpContext', () => {
243243
}
244244

245245
// Verify it is not in the snapshot by default (due to role="none")
246-
page.textSnapshot = await TextSnapshot.create(page, context, {
246+
page.textSnapshot = await TextSnapshot.create(page, {
247247
verbose: false,
248248
extraHandles: [],
249249
});
@@ -265,7 +265,7 @@ describe('McpContext', () => {
265265
);
266266

267267
// Now take snapshot with extra handle
268-
page.textSnapshot = await TextSnapshot.create(page, context, {
268+
page.textSnapshot = await TextSnapshot.create(page, {
269269
verbose: false,
270270
extraHandles: [middleHandle],
271271
});

tests/tools/console.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ describe('console', () => {
206206
await page.pptrPage.setContent(
207207
'<input type="text" name="username" />',
208208
);
209-
page.textSnapshot = await TextSnapshot.create(page, context);
209+
page.textSnapshot = await TextSnapshot.create(page);
210210
await issuePromise;
211211
await listConsoleMessages().handler(
212212
{params: {}, page: context.getSelectedMcpPage()},
@@ -251,7 +251,7 @@ describe('console', () => {
251251
});
252252
</script>
253253
`);
254-
page.textSnapshot = await TextSnapshot.create(page, context);
254+
page.textSnapshot = await TextSnapshot.create(page);
255255
await issuePromise;
256256
const messages = context.getConsoleData(page);
257257
let issueMsg;

0 commit comments

Comments
 (0)