mcp-accessibility-scanner 3.0.1 → 3.2.0
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 +265 -12
- package/index.d.ts +1 -1
- package/lib/browserContextFactory.js +1161 -94
- package/lib/browserContextFactory.js.map +1 -1
- package/lib/browserServerBackend.js +199 -22
- package/lib/browserServerBackend.js.map +1 -1
- package/lib/browserSessions.js +172 -0
- package/lib/browserSessions.js.map +1 -0
- package/lib/config.js +48 -7
- package/lib/config.js.map +1 -1
- package/lib/context.js +321 -71
- package/lib/context.js.map +1 -1
- package/lib/extension/cdpRelay.js +5 -0
- package/lib/extension/cdpRelay.js.map +1 -1
- package/lib/extension/extensionContextFactory.js +12 -1
- package/lib/extension/extensionContextFactory.js.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/mcp/http.js +194 -44
- package/lib/mcp/http.js.map +1 -1
- package/lib/mcp/inProcessTransport.js.map +1 -1
- package/lib/mcp/mdb.js +7 -9
- package/lib/mcp/mdb.js.map +1 -1
- package/lib/mcp/proxyBackend.js +76 -18
- package/lib/mcp/proxyBackend.js.map +1 -1
- package/lib/mcp/server.js +70 -41
- package/lib/mcp/server.js.map +1 -1
- package/lib/mcp/sharedClientSlot.js +134 -0
- package/lib/mcp/sharedClientSlot.js.map +1 -0
- package/lib/mcp/tool.js +3 -0
- package/lib/mcp/tool.js.map +1 -1
- package/lib/networkPolicy.js +73 -0
- package/lib/networkPolicy.js.map +1 -0
- package/lib/program.js +91 -12
- package/lib/program.js.map +1 -1
- package/lib/response.js +16 -3
- package/lib/response.js.map +1 -1
- package/lib/sessionLog.js +36 -6
- package/lib/sessionLog.js.map +1 -1
- package/lib/tab.js +149 -18
- package/lib/tab.js.map +1 -1
- package/lib/tools/auditKeyboard.js +204 -4
- package/lib/tools/auditKeyboard.js.map +1 -1
- package/lib/tools/auditScreenReader.js +823 -0
- package/lib/tools/auditScreenReader.js.map +1 -0
- package/lib/tools/auditSite.js +268 -90
- package/lib/tools/auditSite.js.map +1 -1
- package/lib/tools/axe.js +479 -21
- package/lib/tools/axe.js.map +1 -1
- package/lib/tools/dialogs.js +18 -4
- package/lib/tools/dialogs.js.map +1 -1
- package/lib/tools/evaluate.js +34 -5
- package/lib/tools/evaluate.js.map +1 -1
- package/lib/tools/network.js +136 -8
- package/lib/tools/network.js.map +1 -1
- package/lib/tools/pdf.js +5 -2
- package/lib/tools/pdf.js.map +1 -1
- package/lib/tools/scanPageMatrix.js +135 -47
- package/lib/tools/scanPageMatrix.js.map +1 -1
- package/lib/tools/screenshot.js +8 -4
- package/lib/tools/screenshot.js.map +1 -1
- package/lib/tools/session.js +53 -0
- package/lib/tools/session.js.map +1 -0
- package/lib/tools/snapshot.js +266 -8
- package/lib/tools/snapshot.js.map +1 -1
- package/lib/tools/tool.js.map +1 -1
- package/lib/tools/utils.js +62 -6
- package/lib/tools/utils.js.map +1 -1
- package/lib/tools.js +11 -2
- package/lib/tools.js.map +1 -1
- package/lib/utils/dataUrl.js +58 -35
- package/lib/utils/dataUrl.js.map +1 -1
- package/lib/utils/fileUtils.js +35 -0
- package/lib/utils/fileUtils.js.map +1 -1
- package/lib/utils/guid.js +8 -0
- package/lib/utils/guid.js.map +1 -1
- package/lib/utils/jsSource.js +187 -0
- package/lib/utils/jsSource.js.map +1 -0
- package/lib/vscode/browserContextFactory.js +87 -0
- package/lib/vscode/browserContextFactory.js.map +1 -0
- package/lib/vscode/host.js +189 -33
- package/lib/vscode/host.js.map +1 -1
- package/lib/vscode/main.js +3 -35
- package/lib/vscode/main.js.map +1 -1
- package/package.json +13 -9
package/lib/config.js
CHANGED
|
@@ -17,7 +17,7 @@ import fs from 'node:fs';
|
|
|
17
17
|
import os from 'node:os';
|
|
18
18
|
import path from 'node:path';
|
|
19
19
|
import { devices } from 'playwright';
|
|
20
|
-
import { sanitizeForFilePath } from './utils/fileUtils.js';
|
|
20
|
+
import { safeIsoTimestampForFileName, sanitizeForFilePath } from './utils/fileUtils.js';
|
|
21
21
|
const defaultConfig = {
|
|
22
22
|
browser: {
|
|
23
23
|
browserName: 'chromium',
|
|
@@ -43,7 +43,7 @@ const defaultConfig = {
|
|
|
43
43
|
},
|
|
44
44
|
};
|
|
45
45
|
export async function resolveConfig(config) {
|
|
46
|
-
return mergeConfig(defaultConfig, config);
|
|
46
|
+
return validateResolvedConfig(mergeConfig(defaultConfig, config));
|
|
47
47
|
}
|
|
48
48
|
export async function resolveCLIConfig(cliOptions) {
|
|
49
49
|
const configInFile = await loadConfig(cliOptions.config);
|
|
@@ -51,7 +51,21 @@ export async function resolveCLIConfig(cliOptions) {
|
|
|
51
51
|
const envOverrides = configFromCLIOptions(envOptions);
|
|
52
52
|
const cliOverrides = configFromCLIOptions(cliOptions);
|
|
53
53
|
const result = mergeCLIConfigSources(configInFile, envOverrides, cliOverrides);
|
|
54
|
-
return applyMobileConfig(result, configInFile, envOverrides, cliOverrides, envOptions, cliOptions);
|
|
54
|
+
return validateResolvedConfig(applyMobileConfig(result, configInFile, envOverrides, cliOverrides, envOptions, cliOptions));
|
|
55
|
+
}
|
|
56
|
+
// A blank outputDir is an explicit value with no usable meaning, and both
|
|
57
|
+
// ways of tolerating it go wrong silently: honoring it would fail on
|
|
58
|
+
// mkdir('') only at the first artifact write — deep into a run — while
|
|
59
|
+
// treating it as omitted (what a truthiness check on the resolved value does)
|
|
60
|
+
// would quietly redirect artifacts the user configured a destination for
|
|
61
|
+
// into a temp directory. Rejected here instead, at startup like the other
|
|
62
|
+
// config validations, on the merged result so every source (config file,
|
|
63
|
+
// env, CLI, programmatic Config) is covered. Only undefined/null count as
|
|
64
|
+
// omitted — the nullish semantics the fallback historically used.
|
|
65
|
+
function validateResolvedConfig(config) {
|
|
66
|
+
if (config.outputDir !== undefined && config.outputDir !== null && !String(config.outputDir).trim())
|
|
67
|
+
throw new Error('outputDir must not be blank: provide a directory path, or omit the option to use a temp directory.');
|
|
68
|
+
return config;
|
|
55
69
|
}
|
|
56
70
|
function mergeCLIConfigSources(configInFile, envOverrides, cliOverrides, mobileOverride, mobileSource) {
|
|
57
71
|
let result = defaultConfig;
|
|
@@ -237,10 +251,37 @@ async function loadConfig(configFile) {
|
|
|
237
251
|
throw new Error(`Failed to load config file: ${configFile}, ${error}`);
|
|
238
252
|
}
|
|
239
253
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
254
|
+
// One fallback output directory per resolved config — i.e. per server, which
|
|
255
|
+
// resolves its FullConfig once and hands the same object to every consumer.
|
|
256
|
+
// Recomputing the timestamped path per call scattered one audit's artifacts
|
|
257
|
+
// (screenshots, JSON reports, traces, session logs) across a different temp
|
|
258
|
+
// directory per millisecond tick. Keyed weakly on the config object so two
|
|
259
|
+
// server instances in one process still get distinct fallback directories.
|
|
260
|
+
const defaultOutputDirs = new WeakMap();
|
|
261
|
+
/**
|
|
262
|
+
* Resolves the output directory this config's artifacts land in, memoizing
|
|
263
|
+
* the timestamped fallback when no `outputDir` is configured. Exported so a
|
|
264
|
+
* config that crosses an identity boundary — the VS Code integration
|
|
265
|
+
* serializes it into a spawned provider process, where JSON.parse mints a new
|
|
266
|
+
* object the WeakMap has never seen — can materialize the resolved fallback
|
|
267
|
+
* into the serialized copy instead of letting the other side mint a second
|
|
268
|
+
* temp root.
|
|
269
|
+
*/
|
|
270
|
+
export function resolveOutputDir(config) {
|
|
271
|
+
if (config.outputDir)
|
|
272
|
+
return config.outputDir;
|
|
273
|
+
let outputDir = defaultOutputDirs.get(config);
|
|
274
|
+
if (!outputDir) {
|
|
275
|
+
// The random token keeps two servers starting in the same millisecond
|
|
276
|
+
// from sharing a fallback directory — the per-call timestamp used to
|
|
277
|
+
// make that unlikely; a per-server one no longer would.
|
|
278
|
+
outputDir = path.join(os.tmpdir(), 'playwright-mcp-output', safeIsoTimestampForFileName());
|
|
279
|
+
defaultOutputDirs.set(config, outputDir);
|
|
280
|
+
}
|
|
281
|
+
return outputDir;
|
|
282
|
+
}
|
|
283
|
+
export async function outputFile(config, name) {
|
|
284
|
+
const outputDir = resolveOutputDir(config);
|
|
244
285
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
245
286
|
const fileName = sanitizeForFilePath(name);
|
|
246
287
|
return path.join(outputDir, fileName);
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/context.js
CHANGED
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import debug from 'debug';
|
|
17
17
|
import { logUnhandledError } from './utils/log.js';
|
|
18
|
+
import { createShortGuid } from './utils/guid.js';
|
|
18
19
|
import { Tab } from './tab.js';
|
|
19
20
|
import { outputFile } from './config.js';
|
|
21
|
+
import { ensureNetworkPolicyRoutes } from './networkPolicy.js';
|
|
20
22
|
const testDebug = debug('pw:mcp:test');
|
|
21
23
|
class ContextRegistry {
|
|
22
24
|
_contexts = new Set();
|
|
@@ -31,10 +33,52 @@ class ContextRegistry {
|
|
|
31
33
|
}
|
|
32
34
|
}
|
|
33
35
|
const contextRegistry = new ContextRegistry();
|
|
36
|
+
const traceHubs = new WeakMap();
|
|
37
|
+
async function acquireTrace(browserContext) {
|
|
38
|
+
let hub = traceHubs.get(browserContext);
|
|
39
|
+
if (!hub) {
|
|
40
|
+
const created = {
|
|
41
|
+
users: 0,
|
|
42
|
+
// The name is unique per context: with --isolated (or a remote/CDP
|
|
43
|
+
// browser) several sessions' contexts share the browser's one cached
|
|
44
|
+
// tracesDir, and a fixed name would make every context write the same
|
|
45
|
+
// trace.trace/trace.network files — concurrent corruption, and later
|
|
46
|
+
// sessions overwriting earlier traces. The 'trace' prefix is kept
|
|
47
|
+
// because the printed viewer URL (…/trace.json) is served as a
|
|
48
|
+
// prefix-matched descriptor over the traces directory.
|
|
49
|
+
ready: browserContext.tracing.start({
|
|
50
|
+
name: `trace-${createShortGuid()}`,
|
|
51
|
+
screenshots: false,
|
|
52
|
+
snapshots: true,
|
|
53
|
+
sources: false,
|
|
54
|
+
}),
|
|
55
|
+
};
|
|
56
|
+
traceHubs.set(browserContext, created);
|
|
57
|
+
created.ready.catch(() => {
|
|
58
|
+
if (traceHubs.get(browserContext) === created)
|
|
59
|
+
traceHubs.delete(browserContext);
|
|
60
|
+
});
|
|
61
|
+
hub = created;
|
|
62
|
+
}
|
|
63
|
+
hub.users++;
|
|
64
|
+
try {
|
|
65
|
+
await hub.ready;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
hub.users--;
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function releaseTrace(browserContext) {
|
|
73
|
+
const hub = traceHubs.get(browserContext);
|
|
74
|
+
if (!hub || --hub.users)
|
|
75
|
+
return;
|
|
76
|
+
traceHubs.delete(browserContext);
|
|
77
|
+
await browserContext.tracing.stop();
|
|
78
|
+
}
|
|
34
79
|
export class Context {
|
|
35
80
|
tools;
|
|
36
81
|
config;
|
|
37
|
-
sessionLog;
|
|
38
82
|
options;
|
|
39
83
|
_browserContextPromise;
|
|
40
84
|
_browserContextFactory;
|
|
@@ -42,12 +86,26 @@ export class Context {
|
|
|
42
86
|
_currentTab;
|
|
43
87
|
_clientInfo;
|
|
44
88
|
_closeBrowserContextPromise;
|
|
45
|
-
|
|
89
|
+
// A multiset, not a single slot: tool calls on one Context can overlap, and
|
|
90
|
+
// with a single marker the first call to finish would clear it while the
|
|
91
|
+
// second still ran — letting the session TTL reaper (or a session close)
|
|
92
|
+
// dispose the browser mid-operation.
|
|
93
|
+
_runningTools = [];
|
|
94
|
+
// In-flight download saves (Tab hands them over as they start). A download
|
|
95
|
+
// outlives the tool call that triggered it — the response reports it as
|
|
96
|
+
// "still downloading" — so disposal must wait for these before closing the
|
|
97
|
+
// browser, or saveAs() is aborted mid-stream and the reported file ends up
|
|
98
|
+
// missing or partial (the stateless HTTP path disposes the backend's
|
|
99
|
+
// default context the moment the response closes).
|
|
100
|
+
_pendingDownloads = new Set();
|
|
46
101
|
_abortController = new AbortController();
|
|
102
|
+
_removePageObserver;
|
|
103
|
+
_inputRecorder;
|
|
104
|
+
// Resolved from options.sessionLog at the first browser context launch.
|
|
105
|
+
_sessionLog;
|
|
47
106
|
constructor(options) {
|
|
48
107
|
this.tools = options.tools;
|
|
49
108
|
this.config = options.config;
|
|
50
|
-
this.sessionLog = options.sessionLog;
|
|
51
109
|
this.options = options;
|
|
52
110
|
this._browserContextFactory = options.browserContextFactory;
|
|
53
111
|
this._clientInfo = options.clientInfo;
|
|
@@ -57,12 +115,36 @@ export class Context {
|
|
|
57
115
|
static async disposeAll() {
|
|
58
116
|
await contextRegistry.disposeAll();
|
|
59
117
|
}
|
|
118
|
+
get sessionLog() {
|
|
119
|
+
return this._sessionLog;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Resolves this context's `--save-session` log through the supplier handed
|
|
123
|
+
* in by the backend that created it, caching the result. Called at the
|
|
124
|
+
* first browser context launch, and by the owning backend for routed tool
|
|
125
|
+
* calls: a no-browser tool (e.g. browser_default_timeout) routed to a
|
|
126
|
+
* freshly opened session must land in the opener backend's log even though
|
|
127
|
+
* the session has not launched a browser yet — reading the cached field
|
|
128
|
+
* alone would silently skip it.
|
|
129
|
+
*/
|
|
130
|
+
async resolveSessionLog() {
|
|
131
|
+
this._sessionLog ??= await this.options.sessionLog?.();
|
|
132
|
+
return this._sessionLog;
|
|
133
|
+
}
|
|
60
134
|
tabs() {
|
|
61
135
|
return this._tabs;
|
|
62
136
|
}
|
|
63
137
|
currentTab() {
|
|
64
138
|
return this._currentTab;
|
|
65
139
|
}
|
|
140
|
+
// Resolves within this session's own wrappers: on a shared (non-isolated
|
|
141
|
+
// CDP) context, several sessions wrap the same page, and an event belongs
|
|
142
|
+
// to whichever session is asking — a global page→tab map would hand every
|
|
143
|
+
// session the last writer's wrapper and lose the entry when that session
|
|
144
|
+
// closes.
|
|
145
|
+
tabForPage(page) {
|
|
146
|
+
return this._tabs.find(tab => tab.page === page);
|
|
147
|
+
}
|
|
66
148
|
currentTabOrDie() {
|
|
67
149
|
if (!this._currentTab)
|
|
68
150
|
throw new Error('No open pages available. Use the "browser_navigate" tool to navigate to a page first.');
|
|
@@ -97,7 +179,17 @@ export class Context {
|
|
|
97
179
|
return url;
|
|
98
180
|
}
|
|
99
181
|
async outputFile(name) {
|
|
100
|
-
return outputFile(this.config,
|
|
182
|
+
return outputFile(this.config, name);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The registry behind `browser_session_open` / `browser_session_close`.
|
|
186
|
+
* Provided by BrowserServerBackend; absent when the Context is constructed
|
|
187
|
+
* outside of it (e.g. directly in tests).
|
|
188
|
+
*/
|
|
189
|
+
browserSessions() {
|
|
190
|
+
if (!this.options.browserSessions)
|
|
191
|
+
throw new Error('Browser session management is not available in this environment.');
|
|
192
|
+
return this.options.browserSessions;
|
|
101
193
|
}
|
|
102
194
|
_onPageCreated(page) {
|
|
103
195
|
const tab = new Tab(this, page, tab => this._onPageClosed(tab));
|
|
@@ -121,22 +213,122 @@ export class Context {
|
|
|
121
213
|
await this._closeBrowserContextPromise;
|
|
122
214
|
this._closeBrowserContextPromise = undefined;
|
|
123
215
|
}
|
|
216
|
+
/** True while ANY tool call is running in this Context, overlap included. */
|
|
124
217
|
isRunningTool() {
|
|
125
|
-
return this.
|
|
218
|
+
return this._runningTools.length > 0;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Registers an in-flight download save. Disposal waits (bounded) for the
|
|
222
|
+
* registered saves before closing the browser context, and the session TTL
|
|
223
|
+
* reaper holds off like it does for running tools — a download routinely
|
|
224
|
+
* outlives the tool call that started it. The save's rejection is handled
|
|
225
|
+
* here (logged): an aborted download must not surface as an unhandled
|
|
226
|
+
* rejection.
|
|
227
|
+
*/
|
|
228
|
+
trackPendingDownload(promise) {
|
|
229
|
+
const settled = promise.catch(logUnhandledError);
|
|
230
|
+
this._pendingDownloads.add(settled);
|
|
231
|
+
void settled.then(() => this._pendingDownloads.delete(settled));
|
|
126
232
|
}
|
|
127
|
-
|
|
128
|
-
|
|
233
|
+
/** True while a download save is still writing its file. */
|
|
234
|
+
hasPendingDownloads() {
|
|
235
|
+
return this._pendingDownloads.size > 0;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Waits for in-flight download saves, bounded at 30s: the same order as the
|
|
239
|
+
* default navigation timeout, so a download that network conditions allow
|
|
240
|
+
* to finish gets to — while disposal (a stateless HTTP response closing,
|
|
241
|
+
* process shutdown, the TTL reaper) can never hang indefinitely on a
|
|
242
|
+
* stalled download. Past the cap the download is abandoned, exactly as
|
|
243
|
+
* every download was before this wait existed. Loops because a page can
|
|
244
|
+
* start another download while an earlier one is awaited; the cap spans
|
|
245
|
+
* the whole wait, not each download.
|
|
246
|
+
*/
|
|
247
|
+
async _waitForPendingDownloads(timeoutMs = 30_000) {
|
|
248
|
+
const deadline = Date.now() + timeoutMs;
|
|
249
|
+
while (this._pendingDownloads.size) {
|
|
250
|
+
const remaining = deadline - Date.now();
|
|
251
|
+
if (remaining <= 0)
|
|
252
|
+
return;
|
|
253
|
+
let timer;
|
|
254
|
+
try {
|
|
255
|
+
await Promise.race([
|
|
256
|
+
Promise.all([...this._pendingDownloads]),
|
|
257
|
+
new Promise(resolve => {
|
|
258
|
+
timer = setTimeout(resolve, remaining);
|
|
259
|
+
timer.unref?.();
|
|
260
|
+
}),
|
|
261
|
+
]);
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
clearTimeout(timer);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Marks a tool call as running and returns the release callback for that
|
|
270
|
+
* specific call (idempotent, and releasing out of completion order is
|
|
271
|
+
* fine). isRunningTool() stays true until every overlapping call released.
|
|
272
|
+
*/
|
|
273
|
+
beginToolCall(name) {
|
|
274
|
+
this._runningTools.push(name);
|
|
275
|
+
let released = false;
|
|
276
|
+
return () => {
|
|
277
|
+
if (released)
|
|
278
|
+
return;
|
|
279
|
+
released = true;
|
|
280
|
+
const index = this._runningTools.lastIndexOf(name);
|
|
281
|
+
if (index !== -1)
|
|
282
|
+
this._runningTools.splice(index, 1);
|
|
283
|
+
};
|
|
129
284
|
}
|
|
130
285
|
async _closeBrowserContextImpl() {
|
|
131
286
|
if (!this._browserContextPromise)
|
|
132
287
|
return;
|
|
133
288
|
testDebug('close context');
|
|
289
|
+
// Unpublished BEFORE the download drain below: the drain can hold this
|
|
290
|
+
// close open for up to 30s, and with the promise still published a tool
|
|
291
|
+
// call arriving in that window (browser_navigate after the last tab
|
|
292
|
+
// closed with a download pending) was handed the closing context — its
|
|
293
|
+
// fresh tab was silently torn down when the drain settled. Unpublishing
|
|
294
|
+
// first routes such calls into _setupBrowserContext(), whose
|
|
295
|
+
// _closeBrowserContextPromise check rejects them with the existing
|
|
296
|
+
// "Another browser context is being closed" error.
|
|
134
297
|
const promise = this._browserContextPromise;
|
|
135
298
|
this._browserContextPromise = undefined;
|
|
136
|
-
await promise.then(async ({ browserContext, close }) => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
299
|
+
await promise.then(async ({ browserContext, close, closeStarting }) => {
|
|
300
|
+
// Advance notice for the factory, ahead of the download drain: the
|
|
301
|
+
// persistent factory uses it to tell a stable-profile holder that is
|
|
302
|
+
// closing apart from one that is concurrently alive, so a default
|
|
303
|
+
// context arriving mid-drain waits for the release instead of being
|
|
304
|
+
// silently demoted to a disposable profile.
|
|
305
|
+
closeStarting?.();
|
|
306
|
+
// Before the browser goes away — whoever is closing it: a stateless
|
|
307
|
+
// HTTP response's disposal, browser_session_close, the TTL reaper, the
|
|
308
|
+
// last tab closing — give in-flight download saves their bounded
|
|
309
|
+
// window to finish, so the files tool responses reported as "still
|
|
310
|
+
// downloading" actually materialize.
|
|
311
|
+
await this._waitForPendingDownloads();
|
|
312
|
+
this._detachFromBrowserContext();
|
|
313
|
+
// close() is the factory's only cleanup hook — for storage-state
|
|
314
|
+
// sessions it also removes the disposable profile — and this close
|
|
315
|
+
// attempt is the only one (_browserContextPromise is already cleared),
|
|
316
|
+
// so a failing trace stop must not skip it.
|
|
317
|
+
try {
|
|
318
|
+
if (this.config.saveTrace)
|
|
319
|
+
await releaseTrace(browserContext);
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
// The symmetric race to the tolerated "already started" on setup: on
|
|
323
|
+
// a shared context the sibling that closed first already stopped the
|
|
324
|
+
// one recording, which is an expected shutdown, not an error worth
|
|
325
|
+
// logging. Anything else still surfaces.
|
|
326
|
+
if (!(error instanceof Error && /already stopped|Must start tracing before stopping/i.test(error.message)))
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
await close();
|
|
331
|
+
}
|
|
140
332
|
});
|
|
141
333
|
}
|
|
142
334
|
async dispose() {
|
|
@@ -145,15 +337,21 @@ export class Context {
|
|
|
145
337
|
contextRegistry.unregister(this);
|
|
146
338
|
}
|
|
147
339
|
async _setupRequestInterception(context) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
340
|
+
await ensureNetworkPolicyRoutes(this.config, context);
|
|
341
|
+
}
|
|
342
|
+
// The browser context can outlive this session (non-isolated CDP siblings
|
|
343
|
+
// share it), so the session's observers must not: a leftover 'page'
|
|
344
|
+
// listener would keep creating tabs inside a disposed Context, and the tab
|
|
345
|
+
// wrappers' own page listeners would pile up with session churn.
|
|
346
|
+
_detachFromBrowserContext() {
|
|
347
|
+
this._removePageObserver?.();
|
|
348
|
+
this._removePageObserver = undefined;
|
|
349
|
+
this._inputRecorder?.dispose();
|
|
350
|
+
this._inputRecorder = undefined;
|
|
351
|
+
for (const tab of this._tabs)
|
|
352
|
+
tab.dispose();
|
|
353
|
+
this._tabs = [];
|
|
354
|
+
this._currentTab = undefined;
|
|
157
355
|
}
|
|
158
356
|
_ensureBrowserContext() {
|
|
159
357
|
if (!this._browserContextPromise) {
|
|
@@ -168,25 +366,40 @@ export class Context {
|
|
|
168
366
|
if (this._closeBrowserContextPromise)
|
|
169
367
|
throw new Error('Another browser context is being closed.');
|
|
170
368
|
// TODO: move to the browser context factory to make it based on isolation mode.
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
await this.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
for
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
await
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
369
|
+
// The factory gets the most recently started call's name — with overlap
|
|
370
|
+
// that is the call whose execution is creating the context right now.
|
|
371
|
+
const result = await this._browserContextFactory.createContext(this._clientInfo, this._abortController.signal, this._runningTools[this._runningTools.length - 1], { browserSession: this.options.browserSession });
|
|
372
|
+
// The factory handed ownership over with close(); a setup failure past
|
|
373
|
+
// this point would otherwise discard that callback with the browser still
|
|
374
|
+
// running — and, for storage-state sessions, the disposable profile
|
|
375
|
+
// pinned forever.
|
|
376
|
+
try {
|
|
377
|
+
const { browserContext } = result;
|
|
378
|
+
await this._setupRequestInterception(browserContext);
|
|
379
|
+
// First real use of this context: resolve — and, once per backend,
|
|
380
|
+
// create — the session log before deciding whether to record input.
|
|
381
|
+
await this.resolveSessionLog();
|
|
382
|
+
if (this.sessionLog)
|
|
383
|
+
this._inputRecorder = await InputRecorder.create(this, browserContext);
|
|
384
|
+
for (const page of browserContext.pages())
|
|
385
|
+
this._onPageCreated(page);
|
|
386
|
+
const onPage = (page) => this._onPageCreated(page);
|
|
387
|
+
browserContext.on('page', onPage);
|
|
388
|
+
this._removePageObserver = () => browserContext.off('page', onPage);
|
|
389
|
+
if (this.config.saveTrace)
|
|
390
|
+
await acquireTrace(browserContext);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
// The shared context may survive this close (siblings hold it), so the
|
|
394
|
+
// observers registered above must come off explicitly.
|
|
395
|
+
this._detachFromBrowserContext();
|
|
396
|
+
await result.close().catch(() => { });
|
|
397
|
+
throw error;
|
|
186
398
|
}
|
|
187
399
|
return result;
|
|
188
400
|
}
|
|
189
401
|
}
|
|
402
|
+
const recorderHubs = new WeakMap();
|
|
190
403
|
export class InputRecorder {
|
|
191
404
|
_context;
|
|
192
405
|
_browserContext;
|
|
@@ -196,44 +409,81 @@ export class InputRecorder {
|
|
|
196
409
|
}
|
|
197
410
|
static async create(context, browserContext) {
|
|
198
411
|
const recorder = new InputRecorder(context, browserContext);
|
|
199
|
-
|
|
412
|
+
let hub = recorderHubs.get(browserContext);
|
|
413
|
+
if (!hub) {
|
|
414
|
+
const recorders = new Set();
|
|
415
|
+
const dispatch = (handle) => {
|
|
416
|
+
// A tool call drives the page through Playwright, and the recorder
|
|
417
|
+
// cannot attribute a DOM event to the session that caused it — so
|
|
418
|
+
// while any session sharing this context runs a tool, the events are
|
|
419
|
+
// automation for every session's log, not user actions. (A real user
|
|
420
|
+
// action racing a sibling's tool call is suppressed with them — the
|
|
421
|
+
// same trade-off a single session already accepts for its own runs.)
|
|
422
|
+
for (const registered of recorders) {
|
|
423
|
+
if (registered._context.isRunningTool())
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
for (const registered of recorders)
|
|
427
|
+
handle(registered);
|
|
428
|
+
};
|
|
429
|
+
const created = {
|
|
430
|
+
recorders,
|
|
431
|
+
ready: browserContext._enableRecorder({
|
|
432
|
+
mode: 'recording',
|
|
433
|
+
recorderMode: 'api',
|
|
434
|
+
}, {
|
|
435
|
+
actionAdded: (page, data, code) => {
|
|
436
|
+
dispatch(registered => registered._actionAdded(page, data, code));
|
|
437
|
+
},
|
|
438
|
+
actionUpdated: (page, data, code) => {
|
|
439
|
+
dispatch(registered => registered._actionUpdated(page, data, code));
|
|
440
|
+
},
|
|
441
|
+
signalAdded: (page, data) => {
|
|
442
|
+
dispatch(registered => registered._signalAdded(page, data));
|
|
443
|
+
},
|
|
444
|
+
}),
|
|
445
|
+
};
|
|
446
|
+
created.ready.catch(() => {
|
|
447
|
+
if (recorderHubs.get(browserContext) === created)
|
|
448
|
+
recorderHubs.delete(browserContext);
|
|
449
|
+
});
|
|
450
|
+
recorderHubs.set(browserContext, created);
|
|
451
|
+
hub = created;
|
|
452
|
+
}
|
|
453
|
+
hub.recorders.add(recorder);
|
|
454
|
+
try {
|
|
455
|
+
await hub.ready;
|
|
456
|
+
}
|
|
457
|
+
catch (error) {
|
|
458
|
+
hub.recorders.delete(recorder);
|
|
459
|
+
throw error;
|
|
460
|
+
}
|
|
200
461
|
return recorder;
|
|
201
462
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return;
|
|
227
|
-
const tab = Tab.forPage(page);
|
|
228
|
-
const navigateAction = {
|
|
229
|
-
name: 'navigate',
|
|
230
|
-
url: data.signal.url,
|
|
231
|
-
signals: [],
|
|
232
|
-
};
|
|
233
|
-
if (tab)
|
|
234
|
-
sessionLog.logUserAction(navigateAction, tab, `await page.goto('${data.signal.url}');`, false);
|
|
235
|
-
},
|
|
236
|
-
});
|
|
463
|
+
dispose() {
|
|
464
|
+
recorderHubs.get(this._browserContext)?.recorders.delete(this);
|
|
465
|
+
}
|
|
466
|
+
_actionAdded(page, data, code) {
|
|
467
|
+
const tab = this._context.tabForPage(page);
|
|
468
|
+
if (tab)
|
|
469
|
+
this._context.sessionLog.logUserAction(data.action, tab, code, false);
|
|
470
|
+
}
|
|
471
|
+
_actionUpdated(page, data, code) {
|
|
472
|
+
const tab = this._context.tabForPage(page);
|
|
473
|
+
if (tab)
|
|
474
|
+
this._context.sessionLog.logUserAction(data.action, tab, code, true);
|
|
475
|
+
}
|
|
476
|
+
_signalAdded(page, data) {
|
|
477
|
+
if (data.signal.name !== 'navigation')
|
|
478
|
+
return;
|
|
479
|
+
const tab = this._context.tabForPage(page);
|
|
480
|
+
const navigateAction = {
|
|
481
|
+
name: 'navigate',
|
|
482
|
+
url: data.signal.url,
|
|
483
|
+
signals: [],
|
|
484
|
+
};
|
|
485
|
+
if (tab)
|
|
486
|
+
this._context.sessionLog.logUserAction(navigateAction, tab, `await page.goto('${data.signal.url}');`, false);
|
|
237
487
|
}
|
|
238
488
|
}
|
|
239
489
|
//# sourceMappingURL=context.js.map
|