refactor: use response page in formatting (#2349)

This commit is contained in:
Alex Rudenko
2026-07-13 09:55:37 +02:00
committed by GitHub
parent 78ccb193e0
commit c53c1ec4c9
6 changed files with 22 additions and 45 deletions
-5
View File
@@ -10,7 +10,6 @@ import os from 'node:os';
import path from 'node:path';
import {fileURLToPath, pathToFileURL} from 'node:url';
import type {TargetUniverse} from './devtools/DevtoolsUtils.js';
import {overrideDevToolsGlobals} from './devtools/DevtoolsUtils.js';
import {HeapSnapshotManager} from './HeapSnapshotManager.js';
import type {
@@ -284,10 +283,6 @@ export class McpContext implements Context {
return outputPath;
}
getDevToolsUniverse(page: McpPage): TargetUniverse | null {
return page.devtoolsUniverse ?? null;
}
async newPage(
background?: boolean,
isolatedContextName?: string,
-11
View File
@@ -43,7 +43,6 @@ import type {
GeolocationOptions,
TextSnapshotNode,
} from './types.js';
import {type WithSymbolId, stableIdSymbol} from './utils/id.js';
import {
getNetworkMultiplierFromString,
WaitForHelper,
@@ -512,16 +511,6 @@ export class McpPage implements ContextPage {
return {};
}
getConsoleMessageStableId(
message: ConsoleMessage | Error | DevTools.AggregatedIssue | UncaughtError,
): number {
return (message as WithSymbolId<typeof message>)[stableIdSymbol] ?? -1;
}
getNetworkRequestStableId(request: HTTPRequest): number {
return (request as WithSymbolId<typeof request>)[stableIdSymbol] ?? -1;
}
async restoreEmulation() {
const currentSetting = this.emulationSettings;
await this.emulate(currentSetting);
+20 -16
View File
@@ -40,6 +40,7 @@ import type {
TextContent,
JSONSchema7Definition,
Extension,
HTTPRequest,
} from './third_party/index.js';
import {handleDialog} from './tools/pages.js';
import type {ToolGroups} from './tools/thirdPartyDeveloper.js';
@@ -52,6 +53,8 @@ import type {
} from './tools/ToolDefinition.js';
import type {InsightName, TraceResult} from './trace-processing/parse.js';
import {getInsightOutput, getTraceSummary} from './trace-processing/parse.js';
import type {WithSymbolId} from './utils/id.js';
import {stableIdSymbol} from './utils/id.js';
import {paginate} from './utils/pagination.js';
import type {PaginationOptions} from './utils/types.js';
import type {WaitForEventsResult} from './WaitForHelper.js';
@@ -615,8 +618,7 @@ export class McpResponse implements Response {
);
const formatter = await NetworkFormatter.from(request, {
requestId: this.#attachedNetworkRequestId,
requestIdResolver: req =>
context.getSelectedMcpPage().getNetworkRequestStableId(req),
requestIdResolver: req => this.getNetworkRequestStableId(req),
fetchData: true,
requestFilePath: this.#attachedNetworkRequestOptions?.requestFilePath,
responseFilePath: this.#attachedNetworkRequestOptions?.responseFilePath,
@@ -640,7 +642,7 @@ export class McpResponse implements Response {
const consoleMessageStableId = this.#attachedConsoleMessageId;
if ('args' in message || message instanceof UncaughtError) {
const consoleMessage = message as ConsoleMessage | UncaughtError;
const devTools = context.getDevToolsUniverse(this.#page);
const devTools = this.#page.devtoolsUniverse;
detailedConsoleMessage = await ConsoleFormatter.from(consoleMessage, {
id: consoleMessageStableId,
fetchDetailedData: true,
@@ -725,18 +727,14 @@ export class McpResponse implements Response {
await Promise.all(
messages.map(
async (item): Promise<ConsoleFormatter | IssueFormatter | null> => {
const consoleMessageStableId = context
.getSelectedMcpPage()
.getConsoleMessageStableId(item);
const consoleMessageStableId =
this.getConsoleMessageStableId(item);
if ('args' in item || item instanceof UncaughtError) {
const consoleMessage = item as ConsoleMessage | UncaughtError;
const devTools = page
? context.getDevToolsUniverse(page)
: null;
return await ConsoleFormatter.from(consoleMessage, {
id: consoleMessageStableId,
fetchDetailedData: false,
devTools: devTools ?? undefined,
devTools: page ? page.devtoolsUniverse : undefined,
});
}
if (item instanceof DevTools.AggregatedIssue) {
@@ -779,13 +777,9 @@ export class McpResponse implements Response {
networkRequests = await Promise.all(
requests.map(request =>
NetworkFormatter.from(request, {
requestId: context
.getSelectedMcpPage()
.getNetworkRequestStableId(request),
requestId: this.getNetworkRequestStableId(request),
selectedInDevToolsUI:
context
.getSelectedMcpPage()
.getNetworkRequestStableId(request) ===
this.getNetworkRequestStableId(request) ===
this.#networkRequestsOptions?.networkRequestIdInDevToolsUI,
fetchData: false,
saveFile: (data, filename, extension) =>
@@ -818,6 +812,16 @@ export class McpResponse implements Response {
);
}
getConsoleMessageStableId(
message: ConsoleMessage | Error | DevTools.AggregatedIssue | UncaughtError,
): number {
return (message as WithSymbolId<typeof message>)[stableIdSymbol] ?? -1;
}
getNetworkRequestStableId(request: HTTPRequest): number {
return (request as WithSymbolId<typeof request>)[stableIdSymbol] ?? -1;
}
async format(
toolName: string,
context: McpContext,
-9
View File
@@ -232,9 +232,6 @@ describe('McpContext', () => {
sinon
.stub(context.getSelectedMcpPage(), 'getNetworkRequests')
.returns([mockRequest]);
sinon
.stub(context.getSelectedMcpPage(), 'getNetworkRequestStableId')
.returns(123);
response.setIncludeNetworkRequests(true);
const result = await response.handle('test', context);
@@ -252,9 +249,6 @@ describe('McpContext', () => {
sinon
.stub(context.getSelectedMcpPage(), 'getNetworkRequestById')
.returns(mockRequest);
sinon
.stub(context.getSelectedMcpPage(), 'getNetworkRequestStableId')
.returns(456);
response.attachNetworkRequest(456);
const result = await response.handle('test', context);
@@ -280,9 +274,6 @@ describe('McpContext', () => {
sinon
.stub(context.getSelectedMcpPage(), 'getNetworkRequestById')
.returns(mockRequest);
sinon
.stub(context.getSelectedMcpPage(), 'getNetworkRequestStableId')
.returns(789);
// Use os.tmpdir() so validatePath passes on all platforms (macOS tmpdir
// is /var/folders/..., not /tmp, so hardcoded /tmp paths are rejected).
+1 -3
View File
@@ -412,9 +412,7 @@ describe('console', () => {
}
}
assert.ok(issueMsg);
const id = context
.getSelectedMcpPage()
.getConsoleMessageStableId(issueMsg);
const id = response.getConsoleMessageStableId(issueMsg);
assert.ok(id);
await listConsoleMessages().handler(
{params: {types: ['issue']}, page: context.getSelectedMcpPage()},
+1 -1
View File
@@ -212,7 +212,7 @@ describe('emulation', () => {
it('applies cpu throttling to secondary session', async () => {
await withMcpContext(async (response, context) => {
const mcpPage = context.getSelectedMcpPage();
const universe = context.getDevToolsUniverse(mcpPage);
const universe = mcpPage.devtoolsUniverse;
assert.ok(universe);
const sendSpy = mock.method(universe.session, 'send');