browser-debugger-cli 0.6.1 → 0.6.2
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 +55 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js +9 -4
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +27 -24
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -1
- package/dist/__testutils__/daemonHelpers.d.ts +13 -1
- package/dist/__testutils__/daemonHelpers.d.ts.map +1 -1
- package/dist/__testutils__/daemonHelpers.js +54 -5
- package/dist/__testutils__/daemonHelpers.js.map +1 -1
- package/dist/cdp/protocol.d.ts.map +1 -1
- package/dist/cdp/protocol.js +9 -7
- package/dist/cdp/protocol.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +21 -6
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/dom/a11y.d.ts +18 -0
- package/dist/commands/dom/a11y.d.ts.map +1 -0
- package/dist/commands/dom/a11y.js +134 -0
- package/dist/commands/dom/a11y.js.map +1 -0
- package/dist/commands/dom/evalHelpers.js +1 -1
- package/dist/commands/dom/evalHelpers.js.map +1 -1
- package/dist/commands/dom/index.d.ts.map +1 -1
- package/dist/commands/dom/index.js +41 -20
- package/dist/commands/dom/index.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +2 -0
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +12 -4
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts +19 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js +212 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js.map +1 -0
- package/dist/daemon/launcher.d.ts.map +1 -1
- package/dist/daemon/launcher.js +4 -3
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
- package/dist/daemon/services/SessionService.js +1 -1
- package/dist/daemon/services/SessionService.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.js +251 -19
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js +19 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -1
- package/dist/ipc/transport/jsonl.d.ts +16 -0
- package/dist/ipc/transport/jsonl.d.ts.map +1 -1
- package/dist/ipc/transport/jsonl.js +25 -0
- package/dist/ipc/transport/jsonl.js.map +1 -1
- package/dist/session/chrome.js +2 -2
- package/dist/session/chrome.js.map +1 -1
- package/dist/session/cleanup.d.ts +21 -0
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +101 -1
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/lock.js +1 -1
- package/dist/session/lock.js.map +1 -1
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts +10 -0
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js +265 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js.map +1 -0
- package/dist/telemetry/a11y.d.ts +78 -0
- package/dist/telemetry/a11y.d.ts.map +1 -0
- package/dist/telemetry/a11y.js +280 -0
- package/dist/telemetry/a11y.js.map +1 -0
- package/dist/telemetry/dom.d.ts +1 -1
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +32 -1
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts +2 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts.map +1 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js +111 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js.map +1 -0
- package/dist/ui/formatters/a11y.d.ts +30 -0
- package/dist/ui/formatters/a11y.d.ts.map +1 -0
- package/dist/ui/formatters/a11y.js +178 -0
- package/dist/ui/formatters/a11y.js.map +1 -0
- package/dist/ui/formatters/preview.d.ts +2 -0
- package/dist/ui/formatters/preview.d.ts.map +1 -1
- package/dist/ui/formatters/preview.js +27 -4
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/semantic.d.ts +36 -0
- package/dist/ui/formatters/semantic.d.ts.map +1 -0
- package/dist/ui/formatters/semantic.js +98 -0
- package/dist/ui/formatters/semantic.js.map +1 -0
- package/dist/ui/formatters/status.js +1 -1
- package/dist/ui/formatters/status.js.map +1 -1
- package/dist/ui/messages/commands.d.ts +7 -0
- package/dist/ui/messages/commands.d.ts.map +1 -1
- package/dist/ui/messages/commands.js +9 -0
- package/dist/ui/messages/commands.js.map +1 -1
- package/dist/utils/__tests__/errors.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/errors.unit.test.js +255 -0
- package/dist/utils/__tests__/errors.unit.test.js.map +1 -0
- package/dist/utils/__tests__/http.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/http.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/http.unit.test.js +218 -0
- package/dist/utils/__tests__/http.unit.test.js.map +1 -0
- package/dist/utils/__tests__/process.unit.test.d.ts +14 -0
- package/dist/utils/__tests__/process.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/process.unit.test.js +124 -0
- package/dist/utils/__tests__/process.unit.test.js.map +1 -0
- package/dist/utils/__tests__/session.contract.test.js +1 -1
- package/dist/utils/__tests__/session.contract.test.js.map +1 -1
- package/package.json +22 -1
|
@@ -55,4 +55,25 @@ export declare function cleanupSession(): void;
|
|
|
55
55
|
* @returns True if cleanup was performed, false if daemon is running
|
|
56
56
|
*/
|
|
57
57
|
export declare function cleanupStaleDaemonPid(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Aggressively cleanup orphaned daemon processes.
|
|
60
|
+
*
|
|
61
|
+
* Finds and kills all node processes running dist/daemon.js that are not
|
|
62
|
+
* the currently tracked daemon. This prevents accumulation of zombie daemon
|
|
63
|
+
* processes from test failures, timeouts, or crashes.
|
|
64
|
+
*
|
|
65
|
+
* WHY: Stale daemon processes accumulate from test runs and failures, causing
|
|
66
|
+
* resource leaks and confusion. Aggressive cleanup prevents this.
|
|
67
|
+
*
|
|
68
|
+
* @returns Number of orphaned daemons killed
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const killedCount = cleanupOrphanedDaemons();
|
|
73
|
+
* if (killedCount > 0) {
|
|
74
|
+
* console.log(`Killed ${killedCount} orphaned daemon process(es)`);
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function cleanupOrphanedDaemons(): number;
|
|
58
79
|
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/session/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/session/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmHH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA0F7C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAyCrC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAoD/C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAuB/C"}
|
package/dist/session/cleanup.js
CHANGED
|
@@ -4,14 +4,15 @@
|
|
|
4
4
|
* Handles cleanup of session files (PID, metadata, lock, socket).
|
|
5
5
|
* WHY: Centralized cleanup logic ensures consistent cleanup across error paths and normal shutdown.
|
|
6
6
|
*/
|
|
7
|
+
import { execSync } from 'child_process';
|
|
7
8
|
import * as fs from 'fs';
|
|
8
9
|
import { getErrorMessage } from '../connection/errors.js';
|
|
9
10
|
import { createLogger } from '../ui/logging/index.js';
|
|
11
|
+
import { isProcessAlive, killChromeProcess } from '../utils/process.js';
|
|
10
12
|
import { readChromePid, clearChromePid } from './chrome.js';
|
|
11
13
|
import { acquireSessionLock, releaseSessionLock } from './lock.js';
|
|
12
14
|
import { getSessionFilePath, ensureSessionDir } from './paths.js';
|
|
13
15
|
import { readPid, cleanupPidFile, readPidFromFile } from './pid.js';
|
|
14
|
-
import { isProcessAlive, killChromeProcess } from './process.js';
|
|
15
16
|
const log = createLogger('cleanup');
|
|
16
17
|
function killOrphanedWorker(pid) {
|
|
17
18
|
try {
|
|
@@ -42,6 +43,65 @@ function killCachedChromeProcess(reason) {
|
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Find all orphaned daemon processes and return their PIDs.
|
|
48
|
+
*
|
|
49
|
+
* Orphaned daemons are node processes running dist/daemon.js that are not
|
|
50
|
+
* the currently tracked daemon in the PID file.
|
|
51
|
+
*
|
|
52
|
+
* @returns Array of orphaned daemon PIDs
|
|
53
|
+
*/
|
|
54
|
+
function findOrphanedDaemons() {
|
|
55
|
+
const orphanedPids = [];
|
|
56
|
+
try {
|
|
57
|
+
// Get currently tracked daemon PID (if any)
|
|
58
|
+
const daemonPidPath = getSessionFilePath('DAEMON_PID');
|
|
59
|
+
const currentDaemonPid = readPidFromFile(daemonPidPath);
|
|
60
|
+
// Find all node processes running dist/daemon.js
|
|
61
|
+
// Platform-specific ps command
|
|
62
|
+
const psCommand = process.platform === 'win32'
|
|
63
|
+
? 'wmic process where "commandline like \'%dist/daemon.js%\'" get processid'
|
|
64
|
+
: 'ps aux | grep -E "node.*dist/daemon\\.js" | grep -v grep';
|
|
65
|
+
const output = execSync(psCommand, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] });
|
|
66
|
+
// Parse PIDs from output
|
|
67
|
+
const lines = output.trim().split('\n');
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
// Extract PID based on platform
|
|
70
|
+
let pid;
|
|
71
|
+
if (process.platform === 'win32') {
|
|
72
|
+
// Windows: ProcessId column
|
|
73
|
+
const match = line.trim().match(/(\d+)/);
|
|
74
|
+
if (!match?.[1]) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
pid = parseInt(match[1], 10);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Unix/macOS: Second column in ps output
|
|
81
|
+
const parts = line.trim().split(/\s+/);
|
|
82
|
+
if (parts.length < 2 || !parts[1]) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
pid = parseInt(parts[1], 10);
|
|
86
|
+
}
|
|
87
|
+
if (Number.isNaN(pid)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Skip if this is the current daemon
|
|
91
|
+
if (currentDaemonPid && pid === currentDaemonPid) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
// Verify process is still alive
|
|
95
|
+
if (isProcessAlive(pid)) {
|
|
96
|
+
orphanedPids.push(pid);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
log.debug(`Failed to find orphaned daemons: ${getErrorMessage(error)}`);
|
|
102
|
+
}
|
|
103
|
+
return orphanedPids;
|
|
104
|
+
}
|
|
45
105
|
/**
|
|
46
106
|
* Cleanup stale session files if no active session is running.
|
|
47
107
|
*
|
|
@@ -257,4 +317,44 @@ export function cleanupStaleDaemonPid() {
|
|
|
257
317
|
}
|
|
258
318
|
}
|
|
259
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* Aggressively cleanup orphaned daemon processes.
|
|
322
|
+
*
|
|
323
|
+
* Finds and kills all node processes running dist/daemon.js that are not
|
|
324
|
+
* the currently tracked daemon. This prevents accumulation of zombie daemon
|
|
325
|
+
* processes from test failures, timeouts, or crashes.
|
|
326
|
+
*
|
|
327
|
+
* WHY: Stale daemon processes accumulate from test runs and failures, causing
|
|
328
|
+
* resource leaks and confusion. Aggressive cleanup prevents this.
|
|
329
|
+
*
|
|
330
|
+
* @returns Number of orphaned daemons killed
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* const killedCount = cleanupOrphanedDaemons();
|
|
335
|
+
* if (killedCount > 0) {
|
|
336
|
+
* console.log(`Killed ${killedCount} orphaned daemon process(es)`);
|
|
337
|
+
* }
|
|
338
|
+
* ```
|
|
339
|
+
*/
|
|
340
|
+
export function cleanupOrphanedDaemons() {
|
|
341
|
+
const orphanedPids = findOrphanedDaemons();
|
|
342
|
+
if (orphanedPids.length === 0) {
|
|
343
|
+
log.debug('No orphaned daemon processes found');
|
|
344
|
+
return 0;
|
|
345
|
+
}
|
|
346
|
+
log.info(`Found ${orphanedPids.length} orphaned daemon process(es): ${orphanedPids.join(', ')}`);
|
|
347
|
+
let killedCount = 0;
|
|
348
|
+
for (const pid of orphanedPids) {
|
|
349
|
+
try {
|
|
350
|
+
process.kill(pid, 'SIGKILL');
|
|
351
|
+
log.info(`Killed orphaned daemon process ${pid}`);
|
|
352
|
+
killedCount++;
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
log.debug(`Failed to kill orphaned daemon ${pid}: ${getErrorMessage(error)}`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return killedCount;
|
|
359
|
+
}
|
|
260
360
|
//# sourceMappingURL=cleanup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/session/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/session/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAEpC,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,0CAA0C,GAAG,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAc;IAC7C,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,iCAAiC,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC;IAEnE,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,CAAC;QACH,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,iCAAiC,SAAS,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;YAAS,CAAC;QACT,IAAI,aAAa,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAChD,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB;IAC1B,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,4CAA4C;QAC5C,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,gBAAgB,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QAExD,iDAAiD;QACjD,+BAA+B;QAC/B,MAAM,SAAS,GACb,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC1B,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,0DAA0D,CAAC;QAEjE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE7F,yBAAyB;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,gCAAgC;YAChC,IAAI,GAAW,CAAC;YAEhB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,4BAA4B;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,yCAAyC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClC,SAAS;gBACX,CAAC;gBACD,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,qCAAqC;YACrC,IAAI,gBAAgB,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,gCAAgC;YAChC,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,oCAAoC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB;IACjC,gBAAgB,EAAE,CAAC;IAEnB,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAE1C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sCAAsC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,wCAAwC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,EAAE,CAAC;QAC7B,IAAI,YAAY,GAAG,UAAU,KAAK,IAAI,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;QAErE,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,SAAS,KAAK,IAAI,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;QAEpE,IAAI,YAAY,IAAI,CAAC,WAAW,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxD,GAAG,CAAC,IAAI,CACN,yCAAyC,UAAU,oCAAoC,CACxF,CAAC;YACF,uBAAuB,CAAC,yBAAyB,CAAC,CAAC;YACnD,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC/B,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAE5C,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;QAEjD,cAAc,EAAE,CAAC;QAEjB,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,qCAAqC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,iCAAiC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAE3C,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,kBAAkB,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,cAAc;IAC5B,gCAAgC;IAChC,cAAc,EAAE,CAAC;IACjB,kBAAkB,EAAE,CAAC;IAErB,0BAA0B;IAC1B,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,qDAAqD;IACrD,yDAAyD;IACzD,4EAA4E;IAE5E,sBAAsB;IACtB,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,qCAAqC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,iCAAiC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,2DAA2D;IAC3D,wDAAwD;IACxD,uEAAuE;IAEvE,+DAA+D;IAC/D,yEAAyE;AAC3E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,aAAa,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,iCAAiC,SAAS,mBAAmB,CAAC,CAAC;QAExE,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,gCAAgC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,mCAAmC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,iCAAiC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAE3C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,iCAAiC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjG,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;YAClD,WAAW,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,kCAAkC,GAAG,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/session/lock.js
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
import * as fs from 'fs';
|
|
8
8
|
import { getErrorMessage } from '../connection/errors.js';
|
|
9
9
|
import { createLogger } from '../ui/logging/index.js';
|
|
10
|
+
import { isProcessAlive } from '../utils/process.js';
|
|
10
11
|
import { getSessionFilePath, ensureSessionDir } from './paths.js';
|
|
11
|
-
import { isProcessAlive } from './process.js';
|
|
12
12
|
const log = createLogger('session');
|
|
13
13
|
/**
|
|
14
14
|
* Type guard for NodeJS errno exceptions.
|
package/dist/session/lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/session/lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/session/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for accessibility tree pure functions.
|
|
3
|
+
*
|
|
4
|
+
* Tests the contract of pure functions:
|
|
5
|
+
* - buildTreeFromRawNodes: Tree construction from CDP nodes
|
|
6
|
+
* - parseQueryPattern: Pattern string parsing
|
|
7
|
+
* - queryA11yTree: Tree querying logic
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=a11y.unit.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.unit.test.d.ts","sourceRoot":"","sources":["../../../src/telemetry/__tests__/a11y.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for accessibility tree pure functions.
|
|
3
|
+
*
|
|
4
|
+
* Tests the contract of pure functions:
|
|
5
|
+
* - buildTreeFromRawNodes: Tree construction from CDP nodes
|
|
6
|
+
* - parseQueryPattern: Pattern string parsing
|
|
7
|
+
* - queryA11yTree: Tree querying logic
|
|
8
|
+
*/
|
|
9
|
+
import { strict as assert } from 'node:assert';
|
|
10
|
+
import { describe, test } from 'node:test';
|
|
11
|
+
import { buildTreeFromRawNodes, parseQueryPattern, queryA11yTree } from '../../telemetry/a11y.js';
|
|
12
|
+
describe('buildTreeFromRawNodes', () => {
|
|
13
|
+
test('builds tree from valid CDP nodes', () => {
|
|
14
|
+
const rawNodes = [
|
|
15
|
+
{
|
|
16
|
+
nodeId: '1',
|
|
17
|
+
ignored: false,
|
|
18
|
+
role: { type: 'role', value: 'RootWebArea' },
|
|
19
|
+
name: { type: 'computedString', value: 'Test Page' },
|
|
20
|
+
childIds: ['2', '3'],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
nodeId: '2',
|
|
24
|
+
ignored: false,
|
|
25
|
+
role: { type: 'role', value: 'button' },
|
|
26
|
+
name: { type: 'computedString', value: 'Submit' },
|
|
27
|
+
properties: [{ name: 'focusable', value: { type: 'boolean', value: true } }],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
nodeId: '3',
|
|
31
|
+
ignored: false,
|
|
32
|
+
role: { type: 'role', value: 'textbox' },
|
|
33
|
+
name: { type: 'computedString', value: 'Email' },
|
|
34
|
+
properties: [{ name: 'required', value: { type: 'boolean', value: true } }],
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
const tree = buildTreeFromRawNodes(rawNodes);
|
|
38
|
+
assert.equal(tree.count, 3, 'Should count all non-ignored nodes');
|
|
39
|
+
assert.equal(tree.root.role, 'RootWebArea', 'First node should be root');
|
|
40
|
+
assert.equal(tree.root.name, 'Test Page');
|
|
41
|
+
assert.ok(tree.nodes.has('1'), 'Should index node by nodeId');
|
|
42
|
+
assert.ok(tree.nodes.has('2'), 'Should index all nodes');
|
|
43
|
+
assert.ok(tree.nodes.has('3'), 'Should index all nodes');
|
|
44
|
+
});
|
|
45
|
+
test('filters out ignored nodes', () => {
|
|
46
|
+
const rawNodes = [
|
|
47
|
+
{
|
|
48
|
+
nodeId: '1',
|
|
49
|
+
ignored: false,
|
|
50
|
+
role: { type: 'role', value: 'button' },
|
|
51
|
+
name: { type: 'computedString', value: 'Click Me' },
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
nodeId: '2',
|
|
55
|
+
ignored: true,
|
|
56
|
+
ignoredReasons: [{ name: 'uninteresting', value: { type: 'boolean', value: true } }],
|
|
57
|
+
role: { type: 'role', value: 'none' },
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
nodeId: '3',
|
|
61
|
+
ignored: false,
|
|
62
|
+
role: { type: 'role', value: 'textbox' },
|
|
63
|
+
name: { type: 'computedString', value: 'Input' },
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
const tree = buildTreeFromRawNodes(rawNodes);
|
|
67
|
+
assert.equal(tree.count, 2, 'Should exclude ignored nodes');
|
|
68
|
+
assert.ok(tree.nodes.has('1'), 'Should include non-ignored nodes');
|
|
69
|
+
assert.ok(!tree.nodes.has('2'), 'Should exclude ignored node');
|
|
70
|
+
assert.ok(tree.nodes.has('3'), 'Should include non-ignored nodes');
|
|
71
|
+
});
|
|
72
|
+
test('extracts common properties (focusable, focused, disabled, required)', () => {
|
|
73
|
+
const rawNodes = [
|
|
74
|
+
{
|
|
75
|
+
nodeId: '1',
|
|
76
|
+
ignored: false,
|
|
77
|
+
role: { type: 'role', value: 'textbox' },
|
|
78
|
+
name: { type: 'computedString', value: 'Email' },
|
|
79
|
+
properties: [
|
|
80
|
+
{ name: 'focusable', value: { type: 'boolean', value: true } },
|
|
81
|
+
{ name: 'focused', value: { type: 'boolean', value: true } },
|
|
82
|
+
{ name: 'required', value: { type: 'boolean', value: true } },
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
const tree = buildTreeFromRawNodes(rawNodes);
|
|
87
|
+
const node = tree.nodes.get('1');
|
|
88
|
+
assert.ok(node);
|
|
89
|
+
assert.equal(node.focusable, true);
|
|
90
|
+
assert.equal(node.focused, true);
|
|
91
|
+
assert.equal(node.required, true);
|
|
92
|
+
});
|
|
93
|
+
test('stores non-standard properties in properties map', () => {
|
|
94
|
+
const rawNodes = [
|
|
95
|
+
{
|
|
96
|
+
nodeId: '1',
|
|
97
|
+
ignored: false,
|
|
98
|
+
role: { type: 'role', value: 'textbox' },
|
|
99
|
+
properties: [
|
|
100
|
+
{ name: 'invalid', value: { type: 'string', value: 'false' } },
|
|
101
|
+
{ name: 'editable', value: { type: 'string', value: 'plaintext' } },
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
const tree = buildTreeFromRawNodes(rawNodes);
|
|
106
|
+
const node = tree.nodes.get('1');
|
|
107
|
+
assert.ok(node);
|
|
108
|
+
assert.ok(node.properties);
|
|
109
|
+
assert.equal(node.properties['invalid'], 'false');
|
|
110
|
+
assert.equal(node.properties['editable'], 'plaintext');
|
|
111
|
+
});
|
|
112
|
+
test('throws error when no non-ignored nodes found', () => {
|
|
113
|
+
const rawNodes = [
|
|
114
|
+
{
|
|
115
|
+
nodeId: '1',
|
|
116
|
+
ignored: true,
|
|
117
|
+
ignoredReasons: [{ name: 'uninteresting', value: { type: 'boolean', value: true } }],
|
|
118
|
+
role: { type: 'role', value: 'none' },
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
assert.throws(() => buildTreeFromRawNodes(rawNodes), /No root node found/, 'Should throw when all nodes are ignored');
|
|
122
|
+
});
|
|
123
|
+
test('handles empty node array', () => {
|
|
124
|
+
const rawNodes = [];
|
|
125
|
+
assert.throws(() => buildTreeFromRawNodes(rawNodes), /No root node found/, 'Should throw for empty array');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('parseQueryPattern', () => {
|
|
129
|
+
test('parses single field pattern', () => {
|
|
130
|
+
const pattern = parseQueryPattern('role:button');
|
|
131
|
+
assert.equal(pattern.role, 'button');
|
|
132
|
+
assert.equal(pattern.name, undefined);
|
|
133
|
+
assert.equal(pattern.description, undefined);
|
|
134
|
+
});
|
|
135
|
+
test('parses multiple field pattern with AND logic', () => {
|
|
136
|
+
const pattern = parseQueryPattern('role:button name:Submit');
|
|
137
|
+
assert.equal(pattern.role, 'button');
|
|
138
|
+
assert.equal(pattern.name, 'Submit');
|
|
139
|
+
});
|
|
140
|
+
test('parses all three fields', () => {
|
|
141
|
+
const pattern = parseQueryPattern('role:button name:Submit description:Primary');
|
|
142
|
+
assert.equal(pattern.role, 'button');
|
|
143
|
+
assert.equal(pattern.name, 'Submit');
|
|
144
|
+
assert.equal(pattern.description, 'Primary');
|
|
145
|
+
});
|
|
146
|
+
test('handles values with spaces (takes first word)', () => {
|
|
147
|
+
const pattern = parseQueryPattern('role:button name:Submit Form');
|
|
148
|
+
assert.equal(pattern.role, 'button');
|
|
149
|
+
assert.equal(pattern.name, 'Submit');
|
|
150
|
+
});
|
|
151
|
+
test('handles description shorthand (desc)', () => {
|
|
152
|
+
const pattern = parseQueryPattern('desc:Main');
|
|
153
|
+
assert.equal(pattern.description, 'Main');
|
|
154
|
+
});
|
|
155
|
+
test('handles values with colons', () => {
|
|
156
|
+
const pattern = parseQueryPattern('name:Click:Me');
|
|
157
|
+
assert.equal(pattern.name, 'Click:Me');
|
|
158
|
+
});
|
|
159
|
+
test('ignores invalid fields', () => {
|
|
160
|
+
const pattern = parseQueryPattern('invalid:value role:button');
|
|
161
|
+
assert.equal(pattern.role, 'button');
|
|
162
|
+
assert.equal(Object.keys(pattern).length, 1, 'Should only include valid fields');
|
|
163
|
+
});
|
|
164
|
+
test('returns empty object for invalid pattern', () => {
|
|
165
|
+
const pattern = parseQueryPattern('invalid:value');
|
|
166
|
+
assert.deepEqual(pattern, {});
|
|
167
|
+
});
|
|
168
|
+
test('is case-insensitive for field names', () => {
|
|
169
|
+
const pattern = parseQueryPattern('ROLE:button Name:Submit DESC:Primary');
|
|
170
|
+
assert.equal(pattern.role, 'button');
|
|
171
|
+
assert.equal(pattern.name, 'Submit');
|
|
172
|
+
assert.equal(pattern.description, 'Primary');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('queryA11yTree', () => {
|
|
176
|
+
const tree = {
|
|
177
|
+
root: {
|
|
178
|
+
nodeId: '1',
|
|
179
|
+
role: 'RootWebArea',
|
|
180
|
+
name: 'Test Page',
|
|
181
|
+
},
|
|
182
|
+
nodes: new Map([
|
|
183
|
+
['1', { nodeId: '1', role: 'RootWebArea', name: 'Test Page' }],
|
|
184
|
+
['2', { nodeId: '2', role: 'button', name: 'Submit Form', focusable: true }],
|
|
185
|
+
['3', { nodeId: '3', role: 'button', name: 'Cancel', focusable: true }],
|
|
186
|
+
['4', { nodeId: '4', role: 'textbox', name: 'Email Address', required: true }],
|
|
187
|
+
['5', { nodeId: '5', role: 'textbox', name: 'Password', required: true }],
|
|
188
|
+
]),
|
|
189
|
+
count: 5,
|
|
190
|
+
};
|
|
191
|
+
test('queries by role only', () => {
|
|
192
|
+
const result = queryA11yTree(tree, { role: 'button' });
|
|
193
|
+
assert.equal(result.count, 2, 'Should find both buttons');
|
|
194
|
+
assert.equal(result.nodes.length, 2);
|
|
195
|
+
assert.ok(result.nodes.every((n) => n.role === 'button'), 'All results should be buttons');
|
|
196
|
+
});
|
|
197
|
+
test('queries by name only', () => {
|
|
198
|
+
const result = queryA11yTree(tree, { name: 'Email' });
|
|
199
|
+
assert.equal(result.count, 1);
|
|
200
|
+
assert.ok(result.nodes[0]);
|
|
201
|
+
assert.equal(result.nodes[0].name, 'Email Address');
|
|
202
|
+
});
|
|
203
|
+
test('queries with AND logic (role + name)', () => {
|
|
204
|
+
const result = queryA11yTree(tree, { role: 'button', name: 'Submit' });
|
|
205
|
+
assert.equal(result.count, 1);
|
|
206
|
+
assert.ok(result.nodes[0]);
|
|
207
|
+
assert.equal(result.nodes[0].name, 'Submit Form');
|
|
208
|
+
assert.equal(result.nodes[0].role, 'button');
|
|
209
|
+
});
|
|
210
|
+
test('name matching is case-insensitive', () => {
|
|
211
|
+
const result = queryA11yTree(tree, { name: 'submit' });
|
|
212
|
+
assert.equal(result.count, 1);
|
|
213
|
+
assert.ok(result.nodes[0]);
|
|
214
|
+
assert.equal(result.nodes[0].name, 'Submit Form');
|
|
215
|
+
});
|
|
216
|
+
test('name matching is substring match', () => {
|
|
217
|
+
const result = queryA11yTree(tree, { name: 'Form' });
|
|
218
|
+
assert.equal(result.count, 1);
|
|
219
|
+
assert.ok(result.nodes[0]);
|
|
220
|
+
assert.equal(result.nodes[0].name, 'Submit Form');
|
|
221
|
+
});
|
|
222
|
+
test('role matching is case-insensitive', () => {
|
|
223
|
+
const result = queryA11yTree(tree, { role: 'BUTTON' });
|
|
224
|
+
assert.equal(result.count, 2);
|
|
225
|
+
});
|
|
226
|
+
test('returns empty result when no matches', () => {
|
|
227
|
+
const result = queryA11yTree(tree, { role: 'heading' });
|
|
228
|
+
assert.equal(result.count, 0);
|
|
229
|
+
assert.equal(result.nodes.length, 0);
|
|
230
|
+
});
|
|
231
|
+
test('returns query pattern in result', () => {
|
|
232
|
+
const pattern = { role: 'button', name: 'Submit' };
|
|
233
|
+
const result = queryA11yTree(tree, pattern);
|
|
234
|
+
assert.deepEqual(result.pattern, pattern);
|
|
235
|
+
});
|
|
236
|
+
test('queries by description', () => {
|
|
237
|
+
const treeWithDesc = {
|
|
238
|
+
root: { nodeId: '1', role: 'button', name: 'Click' },
|
|
239
|
+
nodes: new Map([
|
|
240
|
+
['1', { nodeId: '1', role: 'button', name: 'Click', description: 'Primary action' }],
|
|
241
|
+
['2', { nodeId: '2', role: 'button', name: 'Cancel', description: 'Secondary action' }],
|
|
242
|
+
]),
|
|
243
|
+
count: 2,
|
|
244
|
+
};
|
|
245
|
+
const result = queryA11yTree(treeWithDesc, { description: 'Primary' });
|
|
246
|
+
assert.equal(result.count, 1);
|
|
247
|
+
assert.ok(result.nodes[0]);
|
|
248
|
+
assert.equal(result.nodes[0].description, 'Primary action');
|
|
249
|
+
});
|
|
250
|
+
test('handles nodes without name field', () => {
|
|
251
|
+
const treeWithoutNames = {
|
|
252
|
+
root: { nodeId: '1', role: 'generic' },
|
|
253
|
+
nodes: new Map([
|
|
254
|
+
['1', { nodeId: '1', role: 'generic' }],
|
|
255
|
+
['2', { nodeId: '2', role: 'button', name: 'Submit' }],
|
|
256
|
+
]),
|
|
257
|
+
count: 2,
|
|
258
|
+
};
|
|
259
|
+
const result = queryA11yTree(treeWithoutNames, { name: 'Submit' });
|
|
260
|
+
assert.equal(result.count, 1);
|
|
261
|
+
assert.ok(result.nodes[0]);
|
|
262
|
+
assert.equal(result.nodes[0].name, 'Submit');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
//# sourceMappingURL=a11y.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.unit.test.js","sourceRoot":"","sources":["../../../src/telemetry/__tests__/a11y.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Protocol } from '../connection/typed-cdp.js';
|
|
2
|
+
import type { A11yNode, A11yTree, A11yQueryPattern, A11yQueryResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds accessibility tree from raw CDP nodes.
|
|
5
|
+
*
|
|
6
|
+
* Pure function that filters out ignored nodes and builds the tree structure.
|
|
7
|
+
* Separated from collectA11yTree for easier unit testing.
|
|
8
|
+
*
|
|
9
|
+
* @param rawNodes - Raw AXNode array from CDP
|
|
10
|
+
* @returns Parsed accessibility tree
|
|
11
|
+
* @throws Error if no root node found
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildTreeFromRawNodes(rawNodes: Protocol.Accessibility.AXNode[]): A11yTree;
|
|
14
|
+
/**
|
|
15
|
+
* Collects the full accessibility tree from the page via IPC.
|
|
16
|
+
*
|
|
17
|
+
* Uses the worker's persistent CDP connection through callCDP for consistency
|
|
18
|
+
* with other DOM commands and to avoid connection conflicts.
|
|
19
|
+
*
|
|
20
|
+
* @returns Parsed and filtered accessibility tree
|
|
21
|
+
* @throws Error if CDP Accessibility domain fails
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectA11yTree(): Promise<A11yTree>;
|
|
24
|
+
/**
|
|
25
|
+
* Queries accessibility tree by pattern (role, name, description).
|
|
26
|
+
*
|
|
27
|
+
* Performs case-insensitive matching with AND logic for multiple fields.
|
|
28
|
+
*
|
|
29
|
+
* @param tree - Accessibility tree to search
|
|
30
|
+
* @param pattern - Query pattern with optional role, name, description
|
|
31
|
+
* @returns Query result with matching nodes
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // Find submit buttons
|
|
36
|
+
* queryA11yTree(tree, { role: 'button', name: 'Submit' });
|
|
37
|
+
*
|
|
38
|
+
* // Find all textboxes
|
|
39
|
+
* queryA11yTree(tree, { role: 'textbox' });
|
|
40
|
+
*
|
|
41
|
+
* // Find by name only
|
|
42
|
+
* queryA11yTree(tree, { name: 'Email' });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function queryA11yTree(tree: A11yTree, pattern: A11yQueryPattern): A11yQueryResult;
|
|
46
|
+
/**
|
|
47
|
+
* Parses query pattern string into A11yQueryPattern object.
|
|
48
|
+
*
|
|
49
|
+
* Supports format: "role:button name:Submit description:Main"
|
|
50
|
+
* Fields are separated by spaces, case-insensitive.
|
|
51
|
+
*
|
|
52
|
+
* @param patternString - Query pattern string
|
|
53
|
+
* @returns Parsed query pattern
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* parseQueryPattern('role:button name:Submit')
|
|
58
|
+
* // => { role: 'button', name: 'Submit' }
|
|
59
|
+
*
|
|
60
|
+
* parseQueryPattern('role:textbox')
|
|
61
|
+
* // => { role: 'textbox' }
|
|
62
|
+
*
|
|
63
|
+
* parseQueryPattern('name:Email')
|
|
64
|
+
* // => { name: 'Email' }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function parseQueryPattern(patternString: string): A11yQueryPattern;
|
|
68
|
+
/**
|
|
69
|
+
* Gets accessibility properties for a DOM node by CSS selector via IPC.
|
|
70
|
+
*
|
|
71
|
+
* Uses the worker's persistent CDP connection through callCDP for consistency.
|
|
72
|
+
*
|
|
73
|
+
* @param selector - CSS selector
|
|
74
|
+
* @returns A11y node or null if not found
|
|
75
|
+
* @throws Error if selector is invalid or element not found
|
|
76
|
+
*/
|
|
77
|
+
export declare function getA11yNodeBySelector(selector: string): Promise<A11yNode | null>;
|
|
78
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/telemetry/a11y.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExF;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,QAAQ,CAwBzF;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,CAAC,CAgBzD;AA6ED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAcxF;AAwCD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,CA2BzE;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyCtF"}
|