# microsoft/playwright — codebase unpack

> Canonical page: https://codevetter.com/unpack/playwright

This is a deterministic Repo Unpack scan of microsoft/playwright — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: b630e71fcda7885885c459bcbb88e5bfa7c0a1ac (2026-10-01)
- Last upstream commit: feat(api): add APIRequestContext.cookies and clearCookies (#43052)
- Generated by codevetter 1.15.0 on 2026-10-02
- 2660 files scanned · 26.6 MB

Source inspection; upstream code and tests were not executed.

## Languages

- TypeScript: 1386 files
- HTML: 310 files
- Markdown: 279 files
- JavaScript: 181 files
- CSS: 94 files
- JSON: 70 files
- YAML: 60 files
- Shell: 34 files

## Repository structure

- tests/ — 1094 files
- packages/ — 1065 files
- docs/ — 181 files
- browser_patches/ — 95 files
- utils/ — 83 files
- examples/ — 71 files
- .github/ — 38 files
- .claude/ — 16 files

Probable source entrypoint: `packages/` (inferred from the tree, not upstream docs)

## Package

- package.json: playwright-internal v1.64.0-next — 80 declared dependencies

## Structural health signals

Average score 6.3/10 across 96 files; 58 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- b630e71fcda7 (2026-10-01) feat(api): add APIRequestContext.cookies and clearCookies (#43052)
- e54293a3280f (2026-10-01) fix(blob): do not remove existing reports from output dir (#43056)
- 3cf9b39ba197 (2026-10-01) feat(locator): add page.getByRef (#43055)
- 45b43ff3581d (2026-10-01) Revert "feat(test-runner): read last failed tests from --last-failed=<file>" (#43053)
- c603e4a1f652 (2026-10-01) chore: start v8 profiler from bootstrap via PW_PROFILE_DIR (#43054)

## Overview

Playwright is a Node.js browser automation and testing monorepo for developers writing browser scripts, end-to-end tests, and agent-driven automation. At commit b630e71fcda7885885c459bcbb88e5bfa7c0a1ac, it combines a client/server automation engine, a parallel test runner, browser installation tooling, reporting and trace interfaces, and CLI/MCP browser tools. Its distinctive architecture carries typed commands through validated protocol dispatchers to browser implementations and injected page scripts.

## System map

The repository separates browser automation, test orchestration, protocol definitions, and browser-facing interfaces into workspace packages. Local automation still crosses a client/dispatcher boundary before reaching browser implementations. Persistent state consists of browser profiles, browser installation caches, and explicit JSON/artifact files. The inspected deployment surfaces are Node packages, command-line programs, and optional browser-control servers.
- The private playwright-internal workspace is version 1.64.0-next, requires Node.js >=20, and includes packages/* as npm workspaces. — [package.json#L1-12](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L1-L12) [package.json#L54-56](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L54-L56)
- The playwright package exports CommonJS/ESM library and test entrypoints, installs the playwright executable, and depends on the matching playwright-core version. — [packages/playwright/package.json#L13-48](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/package.json#L13-L48)
- packages/playwright/cli.js loads the compiled program and parses process.argv; program.ts decorates the shared library CLI before adding test-runner commands. — [packages/playwright/cli.js#L18-19](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/cli.js#L18-L19) [packages/playwright/src/program.ts#L19-38](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L19-L38) [packages/playwright/src/program.ts#L251-258](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L251-L258)
- createInProcessPlaywright wires Connection to DispatcherConnection, enables raw buffers, creates PlaywrightDispatcher, and switches from synchronous initialization to setImmediate message delivery. — [packages/playwright-core/src/inprocess.ts#L27-50](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/inprocess.ts#L27-L50)
- BrowserType launches native executables and selects WebSocketTransport or PipeTransport according to supportsPipeTransport. — [packages/playwright-core/src/server/browserType.ts#L214-243](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L214-L243) [packages/playwright-core/src/server/browserType.ts#L264-280](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L264-L280)
- Test phases use Dispatcher to allocate worker slots; WorkerHost identifies the worker process entry and assigns a per-worker artifact directory. — [packages/playwright/src/runner/dispatcher.ts#L220-251](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/dispatcher.ts#L220-L251) [packages/playwright/src/runner/workerHost.ts#L47-75](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/workerHost.ts#L47-L75)
- Browser installation storage honors PLAYWRIGHT_BROWSERS_PATH, including package-local mode '0'; installation locks the registry and records package links before optional cache cleanup. — [packages/playwright-core/src/server/registry/index.ts#L397-417](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/registry/index.ts#L397-L417) [packages/playwright-core/src/server/registry/index.ts#L934-961](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/registry/index.ts#L934-L961)
- Root scripts define build/watch, combined linting, browser-specific tests, stable-runner tests, MCP tests, and platform-specific suites. — [package.json#L18-51](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L18-L51)

## Feature catalog

The inspected public surfaces span browser automation, test execution, artifact inspection, and agent tools. Test execution exposes filtering, sharding, retries, debugging, and interactive UI options. Browser tooling includes installation, recording, screenshots, PDFs, and remote connections. These eight groups describe implemented command and API families; they are not an exhaustive method inventory.
- BrowserType exposes ordinary launch, persistent-context launch, server launch, and CDP attachment; connectOverCDP accepts endpoint URLs or a local transport and restricts supported engines. — [packages/playwright-core/src/client/browserType.ts#L66-82](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserType.ts#L66-L82) [packages/playwright-core/src/client/browserType.ts#L142-174](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserType.ts#L142-L174) [packages/protocol/spec/browserType.yml#L24-58](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/protocol/spec/browserType.yml#L24-L58)
- Locator.click delegates with strict selection by default; pointer actions wait for visible, enabled, and stable elements unless force bypasses those checks. — [packages/playwright-core/src/client/locator.ts#L117-122](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/locator.ts#L117-L122) [packages/playwright-core/src/server/dom.ts#L429-438](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dom.ts#L429-L438) [packages/playwright-core/src/server/dom.ts#L548-553](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dom.ts#L548-L553)
- The test CLI exposes grep/project filters, retries, repetition, worker counts, sharding, shuffle seeds, last-failed selection, snapshot updates, tracing, and UI mode. — [packages/playwright/src/program.ts#L208-247](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L208-L247)
- createReporters supports blob, Perfetto, terminal, GitHub, JSON, JUnit, HTML, and coverage reporters; show-report serves a report and merge-reports combines sharded blob reports. — [packages/playwright/src/runner/reporters.ts#L42-67](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/reporters.ts#L42-L67) [packages/playwright/src/program.ts#L100-137](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L100-L137)
- The library CLI provides open and codegen with language targets, screenshot with full-page/wait options, PDF capture, and show-trace in an app or browser-served mode. — [packages/playwright-core/src/cli/program.ts#L50-72](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/cli/program.ts#L50-L72) [packages/playwright-core/src/cli/program.ts#L147-169](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/cli/program.ts#L147-L169) [packages/playwright-core/src/cli/program.ts#L206-230](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/cli/program.ts#L206-L230)
- Browser lifecycle commands include install, uninstall, and install-deps with browser selection, dry-run, force, headless-shell, and cache-removal controls. — [packages/playwright-core/src/cli/program.ts#L74-129](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/cli/program.ts#L74-L129)
- BrowserContext supports storageState and setStorageState; saved state includes cookies and origin storage, with opt-in IndexedDB, OPFS, and credentials collection. — [packages/playwright-core/src/client/browserContext.ts#L471-483](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L471-L483) [packages/playwright-core/src/server/browserContext.ts#L607-622](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L607-L622)
- The CLI mounts agent cli and mcp commands; browserTools aggregates navigation, input, dialogs, files, network/routes, snapshots, capture, storage, recording, verification, and WebMCP tools, while init-agents selects among supported agent generators. — [packages/playwright-core/src/cli/program.ts#L239-252](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/cli/program.ts#L239-L252) [packages/playwright-core/src/tools/backend/tools.ts#L51-81](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/tools/backend/tools.ts#L51-L81) [packages/playwright/src/program.ts#L161-184](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L161-L184)

## Data flow

Commands enter through CLI parsing or client APIs and are normalized before reaching execution owners. Protocol messages carry object identities, parameters, timeouts, and metadata, with validation on both dispatch and response paths. Test state flows through project phases and workers to reporters and persisted selection metadata. Browser storage travels between injected page code, server context state, and client-owned JSON files.
- runTests converts CLI options to overrides, loads configuration, builds TestRunOptions, validates project filters, then branches to UI, watch, or ordinary execution. — [packages/playwright/src/cli/testActions.ts#L27-88](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/cli/testActions.ts#L27-L88)
- Connection.sendMessageToServer creates id/guid/method/params messages with timeout/location metadata, tracks callbacks, and emits __abort__ when a supplied signal aborts. — [packages/playwright-core/src/client/connection.ts#L179-224](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/connection.ts#L179-L224)
- DispatcherConnection resolves the target GUID, validates parameters and metadata, invokes the dispatcher under a ProgressController timeout, and validates the returned result. — [packages/playwright-core/src/server/dispatchers/dispatcher.ts#L297-331](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/dispatcher.ts#L297-L331) [packages/playwright-core/src/server/dispatchers/dispatcher.ts#L369-384](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/dispatcher.ts#L369-L384)
- During test phases, dependency-produced environment variables are merged into downstream projects; failed dependencies prevent their test groups from being dispatched. — [packages/playwright/src/runner/tasks.ts#L435-472](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/tasks.ts#L435-L472)
- LastRunReporter persists status and failed/unrun test IDs to .last-run.json or an override path, skips writes in list mode, and treats unreadable prior state as unavailable. — [packages/playwright/src/runner/lastRun.ts#L42-62](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/lastRun.ts#L42-L62) [packages/playwright/src/runner/lastRun.ts#L77-85](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/lastRun.ts#L77-L85)
- storageState collects cookies, tries utility-world collection on live pages, then visits remaining origins through an intercepted blank page; the client optionally writes the returned object as formatted JSON. — [packages/playwright-core/src/server/browserContext.ts#L607-663](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L607-L663) [packages/playwright-core/src/client/browserContext.ts#L471-477](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L471-L477)
- prepareStorageState accepts an object or parses a client-side file; setStorageState restores cookies/credentials and invokes StorageScript.restore for the union of old and new origins. — [packages/playwright-core/src/client/browserContext.ts#L553-580](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L553-L580) [packages/playwright-core/src/server/browserContext.ts#L670-717](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L670-L717)
- API fetch merges default/request headers, resolves baseURL and query parameters, serializes the request body, sends with retry handling, and stores the response body under a fetch UID. — [packages/playwright-core/src/server/fetch.ts#L198-243](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/fetch.ts#L198-L243) [packages/playwright-core/src/server/fetch.ts#L244-256](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/fetch.ts#L244-L256)

## Behavior traces

Four concrete flows were followed through source: test startup/execution, browser launch, locator click, and storage save/restore. The traces below preserve execution order and significant conditions. Error handling, force behavior, and reuse modes change these paths. They describe source behavior rather than observed runtime executions.
- Test startup: cli.js → program.parse → addTestCommand action → runTests → overridesFromOptions → loadConfigFromFile → filterProjects; arguments after '--' are removed from file filters. — [packages/playwright/cli.js#L18-19](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/cli.js#L18-L19) [packages/playwright/src/program.ts#L55-63](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L55-L63) [packages/playwright/src/cli/testActions.ts#L27-48](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/cli/testActions.ts#L27-L48)
- Ordinary test execution: runAllTestsWithConfig → createReporters/LastRunReporter → rebaseline/global-setup/load tasks → phase/report/run tasks → runTasks; list mode instead loads and reports without those execution tasks. — [packages/playwright/src/runner/testRunner.ts#L422-451](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/testRunner.ts#L422-L451) [packages/playwright/src/runner/tasks.ts#L155-169](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/tasks.ts#L155-L169)
- Worker scheduling: createRunTestsTask checks dependencies → Dispatcher.run allocates slots and schedules → _createWorker constructs WorkerHost → WorkerHost.start creates artifacts and starts the runner; workers receive groups through runTestGroup messages. — [packages/playwright/src/runner/tasks.ts#L435-459](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/tasks.ts#L435-L459) [packages/playwright/src/runner/dispatcher.ts#L220-251](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/dispatcher.ts#L220-L251) [packages/playwright/src/runner/workerHost.ts#L70-89](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/workerHost.ts#L70-L89)
- Browser launch: client BrowserType.launch normalizes args/env → channel.launch → BrowserTypeDispatcher.launch checks denyLaunch → server BrowserType.launch validates options and chooses Selenium or _innerLaunchWithRetries → _innerLaunch. — [packages/playwright-core/src/client/browserType.ts#L66-82](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserType.ts#L66-L82) [packages/playwright-core/src/server/dispatchers/browserTypeDispatcher.ts#L38-43](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/browserTypeDispatcher.ts#L38-L43) [packages/playwright-core/src/server/browserType.ts#L67-112](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L67-L112)
- Native launch continuation: _prepareToLaunch creates/selects directories and resolves the executable → _launchProcess calls launchProcess and waits for readiness → pipe/WebSocket transport → connectToTransport; persistent default-context preparation is skipped with ignoreAllDefaultArgs. — [packages/playwright-core/src/server/browserType.ts#L135-196](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L135-L196) [packages/playwright-core/src/server/browserType.ts#L206-243](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L206-L243) [packages/playwright-core/src/server/browserType.ts#L264-280](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L264-L280)
- Click: Locator.click delegates to its frame with strict:true → FrameDispatcher.click → server Frame.click → _retryWithProgressIfNotConnected → handle._click → _retryPointerAction → page.mouse.click; detached targets retry and force skips prechecks/visibility waits. — [packages/playwright-core/src/client/locator.ts#L117-119](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/locator.ts#L117-L119) [packages/playwright-core/src/server/dispatchers/frameDispatcher.ts#L147-149](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/frameDispatcher.ts#L147-L149) [packages/playwright-core/src/server/frames.ts#L1200-1260](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/frames.ts#L1200-L1260) [packages/playwright-core/src/server/dom.ts#L548-553](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dom.ts#L548-L553)
- Storage save: client storageState → BrowserContextDispatcher.storageState → server storageState → injected StorageScript.collect on live or temporary pages → channel result → optional mkdir/writeFile on the client. — [packages/playwright-core/src/client/browserContext.ts#L471-477](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L471-L477) [packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts#L336-337](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts#L336-L337) [packages/playwright-core/src/server/browserContext.ts#L617-645](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L617-L645) [packages/injected/src/storageScript.ts#L173-193](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/injected/src/storageScript.ts#L173-L193)
- Storage replacement: prepareStorageState → channel.setStorageState → dispatcher calls server mode 'api' → cache/cookie cleanup → cookie/credential restore → intercepted origin navigation and StorageScript.restore → temporary-page close; resetForReuse retains the page and removes its interceptor. — [packages/playwright-core/src/client/browserContext.ts#L480-483](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L480-L483) [packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts#L340-341](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts#L340-L341) [packages/playwright-core/src/server/browserContext.ts#L670-727](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L670-L727) [packages/injected/src/storageScript.ts#L276-310](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/injected/src/storageScript.ts#L276-L310)

## Testing signals

Tests and CI were inspected, not executed; no passing result or coverage percentage is claimed. The repository uses Playwright fixtures for browser behavior and a stable runner for testing its own runner. Inspected specifications exercise success, failure, persistence, authentication redirects, and report rendering. Coverage observations are bounded to the files and ranges read, with explicit platform exclusions and CI trigger limits.
- The library config constructs separate library/page projects for Chromium, Firefox, and WebKit, excludes other-engine filenames, supports executable/mode overrides, and enables three CI retries. — [tests/library/playwright.config.ts#L28-41](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/playwright.config.ts#L28-L41) [tests/library/playwright.config.ts#L58-123](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/playwright.config.ts#L58-L123)
- Runner tests import defineConfig from stable-test-runner; npm run ttest invokes that runner's installed CLI, and PWTEST_COVERAGE conditionally enables reporter/viewer UI coverage. — [tests/playwright-test/playwright.config.ts#L21-40](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/playwright-test/playwright.config.ts#L21-L40) [package.json#L28-32](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L28-L32)
- locator-click.spec.ts covers basic/double clicks, removal of the page's Node global, and target removal during pointerup or pointerdown. — [tests/page/locator-click.spec.ts#L18-61](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/page/locator-click.spec.ts#L18-L61)
- Storage-state tests check multi-origin localStorage, replacement without extra surviving pages, malformed origins, and JSON/IndexedDB round trips; selected restore cases are marked fixme for msedge channels. — [tests/library/browsercontext-storage-state.spec.ts#L24-116](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L24-L116) [tests/library/browsercontext-storage-state.spec.ts#L119-168](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L119-L168) [tests/library/browsercontext-storage-state.spec.ts#L169-201](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L169-L201)
- runner.spec.ts checks duplicate-title rejection, forbidOnly errors, continuation after worker exit, and subprocess creation failure; its SIGINT test explicitly skips Windows. — [tests/playwright-test/runner.spec.ts#L21-119](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/playwright-test/runner.spec.ts#L21-L119)
- HTML reporter tests generate and inspect both directly created and intermediate-merged reports, asserting outcome counters and visibility; global-fetch tests assert authorization retention/removal and HTTPS-error option propagation. — [tests/playwright-test/reporter-html.spec.ts#L55-95](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/playwright-test/reporter-html.spec.ts#L55-L95) [tests/library/global-fetch.spec.ts#L93-112](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/global-fetch.spec.ts#L93-L112) [tests/library/global-fetch.spec.ts#L266-278](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/global-fetch.spec.ts#L266-L278)
- Primary CI defines browser/Node matrices and sharded runner jobs; the shared run-test action installs dependencies, builds, installs browsers, executes tests under Xvfb on Linux, and conditionally uploads reports. These definitions were inspected, not run. — [.github/workflows/tests_primary.yml#L33-60](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/.github/workflows/tests_primary.yml#L33-L60) [.github/workflows/tests_primary.yml#L63-131](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/.github/workflows/tests_primary.yml#L63-L131) [.github/actions/run-test/action.yml#L33-84](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/.github/actions/run-test/action.yml#L33-L84)
- Test scope is conditional: BiDi excludes inspector/page-leak files and uses zero retries; Android/Electron/WebView configs reuse page suites, extension tests select Chromium, and MCP has a separate cross-platform/browser CI matrix. These definitions do not establish exhaustive executed coverage. — [tests/bidi/playwright.config.ts#L68-110](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/bidi/playwright.config.ts#L68-L110) [tests/extension/playwright.config.ts#L21-33](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/extension/playwright.config.ts#L21-L33) [tests/android/playwright.config.ts#L57-77](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/android/playwright.config.ts#L57-L77) [.github/workflows/tests_mcp.yml#L32-58](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/.github/workflows/tests_mcp.yml#L32-L58)

## Risk map

The inspected code intentionally exercises powerful host, browser, network, and filesystem capabilities. The observations below identify trust boundaries and maintenance-sensitive branches, not confirmed vulnerabilities. Some controls are explicitly configurable or bypassed in trusted modes. Test exclusions and asynchronous cleanup are source-level limitations, not evidence of a failing implementation.
- browser_run_code_unsafe explicitly describes itself as RCE-equivalent, compiles supplied JavaScript with vm.runInContext, exposes page and host fetch, and can load snippets from a resolved filename. — [packages/playwright-core/src/tools/backend/runCode.ts#L25-51](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/tools/backend/runCode.ts#L25-L51) [packages/playwright-core/src/tools/backend/runCode.ts#L55-86](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/tools/backend/runCode.ts#L55-L86)
- Agent checkFile resolves symlinks and restricts filenames to workspace/output roots, but explicitly bypasses checks for code-origin calls, allowUnrestrictedFileAccess, or skillMode. — [packages/playwright-core/src/tools/backend/context.ts#L494-509](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/tools/backend/context.ts#L494-L509)
- WebServerPlugin executes config.webServer.command with shell:true, inherited process environment, configured environment additions, and a config-relative working directory. — [packages/playwright/src/plugins/webServerPlugin.ts#L72-79](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/plugins/webServerPlugin.ts#L72-L79) [packages/playwright/src/plugins/webServerPlugin.ts#L105-118](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/plugins/webServerPlugin.ts#L105-L118)
- Browser launch accepts caller-selected executables and environments and creates profile/artifact directories outside the checkout; launch and teardown changes affect native processes and host filesystem state. — [packages/playwright-core/src/server/browserType.ts#L150-193](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L150-L193) [packages/playwright-core/src/server/browserType.ts#L206-243](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L206-L243) [packages/playwright-core/src/server/browserType.ts#L349-355](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L349-L355)
- storageState writes cookie/origin data and optional credentials as plain JSON to a caller path; context preparation also reads caller-selected certificate/key/PFX paths into protocol buffers. — [packages/playwright-core/src/client/browserContext.ts#L471-475](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L471-L475) [packages/playwright-core/src/client/browserContext.ts#L607-620](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L607-L620) [packages/playwright-core/src/server/browserContext.ts#L607-613](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L607-L613)
- API requests can disable TLS verification through ignoreHTTPSErrors, and that choice propagates across redirects; cross-origin redirects strip Authorization while Basic challenges may trigger credential retry. — [packages/playwright-core/src/server/fetch.ts#L236-238](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/fetch.ts#L236-L238) [packages/playwright-core/src/server/fetch.ts#L488-525](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/fetch.ts#L488-L525) [tests/library/global-fetch.spec.ts#L93-112](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/global-fetch.spec.ts#L93-L112)
- Storage restore includes deliberate asynchronous cleanup: some service-worker unregister operations are not awaited, IndexedDB deletions omit callback waits, and msedge restore tests document a cache-clear stall exclusion. — [packages/injected/src/storageScript.ts#L276-299](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/injected/src/storageScript.ts#L276-L299) [tests/library/browsercontext-storage-state.spec.ts#L54-55](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L54-L55) [tests/library/browsercontext-storage-state.spec.ts#L119-120](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L119-L120)
- Protocol compatibility is coupled across generated client/server channels, validators, and dispatchers; dispatch rejects schema/method mismatches, and the generator writes multiple outputs and exits nonzero when they change. — [packages/playwright-core/src/server/dispatchers/dispatcher.ts#L320-331](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/dispatcher.ts#L320-L331) [utils/generate_channels.js#L467-488](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/utils/generate_channels.js#L467-L488)

## Extension points

The repository provides concrete registries, factories, and schemas for extending behavior. Some are public configuration surfaces, while others are internal integration seams. Protocol and generated-type changes require coordinated edits across boundaries. Browser engines and injected selector behavior have explicit synchronization requirements.
- Connection.registerObjectFactories installs type-to-ChannelOwner constructors in a map; the constructor registers Browser, BrowserContext, Page, Route, Tracing, Android, Electron, and other protocol object types. — [packages/playwright-core/src/client/connection.ts#L98-142](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/connection.ts#L98-L142)
- Protocol commands are declared in YAML with parameter mixins and typed returns; generate_channels emits client/server channel interfaces, structs, metadata, and runtime validators. — [packages/protocol/spec/browserType.yml#L15-58](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/protocol/spec/browserType.yml#L15-L58) [utils/generate_channels.js#L483-487](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/utils/generate_channels.js#L483-L487)
- createReporters is a constructor registry for built-ins and loads custom reporter modules from configuration or PW_TEST_REPORTER, adapting them through wrapReporterAsV2. — [packages/playwright/src/runner/reporters.ts#L42-76](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/reporters.ts#L42-L76)
- TestRunnerPlugin defines asynchronous setup/teardown hooks; registration accepts an instance or synchronous/asynchronous factory, and createPluginSetupTasks invokes those lifecycle hooks. — [packages/playwright/src/plugins/index.ts#L20-29](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/plugins/index.ts#L20-L29) [packages/playwright/src/runner/tasks.ts#L192-202](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/runner/tasks.ts#L192-L202)
- Selectors.register accepts custom engines after name/reserved/duplicate checks; parseSelector selects main or utility execution worlds based on engine contentScript and built-in requirements. — [packages/playwright-core/src/server/selectors.ts#L58-94](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/selectors.ts#L58-L94)
- Agent tool modules are assembled in browserTools; filteredTools retains core or enabled capabilities, excludes skillOnly tools, and removes selector fields from exposed schemas. — [packages/playwright-core/src/tools/backend/tools.ts#L51-93](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/tools/backend/tools.ts#L51-L93)
- defineTool preserves a typed schema/handler definition; defineTabTool wraps handlers with ensureTab and modal-state compatibility checks, allowing tools to declare which modal state they clear. — [packages/playwright-core/src/tools/backend/tool.ts#L51-83](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/tools/backend/tool.ts#L51-L83)
- BrowserType is an abstract engine seam for defaultArgs, connectToTransport, amendEnvironment, startup-log rewriting, and graceful close; CLI additions attach through decorateProgram and the testOptions command table. — [packages/playwright-core/src/server/browserType.ts#L334-362](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserType.ts#L334-L362) [packages/playwright-core/src/cli/program.ts#L36-50](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/cli/program.ts#L36-L50) [packages/playwright/src/program.ts#L40-53](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright/src/program.ts#L40-L53)

## Contributor handoff

Start with the owning package and follow the relevant client/protocol/server or runner/worker boundary. Preserve generated-source ownership, dependency rules, and platform-specific behavior. Tests and CI were inspected, not executed, and this inventory is bounded rather than exhaustive. The commands below are future validation pointers; the current read-only investigation did not run them.
- Read package.json, CONTRIBUTING.md, CLAUDE.md, and the owning package manifest first: browser API work belongs primarily in playwright-core, runner work in playwright, with Node.js >=20 and npm workspaces. — [package.json#L11-12](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L11-L12) [package.json#L54-56](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L54-L56) [CONTRIBUTING.md#L18-40](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CONTRIBUTING.md#L18-L40) [CLAUDE.md#L3-9](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CLAUDE.md#L3-L9)
- Preserve client/server import separation and inspect DEPS.list before moving code; actual client dependency declarations allow shared protocol/isomorphic utilities rather than server implementations. — [CLAUDE.md#L86-91](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CLAUDE.md#L86-L91) [packages/playwright-core/src/client/DEPS.list#L1-9](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/DEPS.list#L1-L9) [packages/playwright-core/src/server/DEPS.list#L1-19](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/DEPS.list#L1-L19)
- Edit API documentation and protocol schemas as source inputs rather than treating generated types/channels/validators as independent implementations; generator checks may write files. — [CONTRIBUTING.md#L38-53](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CONTRIBUTING.md#L38-L53) [packages/protocol/spec/browserType.yml#L24-41](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/protocol/spec/browserType.yml#L24-L41) [utils/generate_channels.js#L469-488](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/utils/generate_channels.js#L469-L488)
- Place page interaction tests with pageTest fixtures, browser/context lifecycle tests with browserTest, runner tests with playwright-test fixtures, and agent-tool tests with MCP fixtures. — [CLAUDE.md#L75-84](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CLAUDE.md#L75-L84) [tests/page/locator-click.spec.ts#L18-24](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/page/locator-click.spec.ts#L18-L24) [tests/library/browsercontext-storage-state.spec.ts#L18-25](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L18-L25)
- For later authorized validation, use filtered ctest for Chromium browser behavior, ttest for runner changes, and ctest-mcp for agent tools; broaden to other affected engines after the focused check. Tests and CI in this report were inspected, not executed. — [package.json#L19-34](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L19-L34) [CLAUDE.md#L66-73](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CLAUDE.md#L66-L73) [.github/actions/run-test/action.yml#L57-73](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/.github/actions/run-test/action.yml#L57-L73)
- Use root build/lint scripts when execution is authorized, but do not assume a watcher is running; tsconfig uses strict checking and excludes generated lib directories, extension code, and tool skills from its package compilation scope. — [package.json#L35-45](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/package.json#L35-L45) [CLAUDE.md#L36-53](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CLAUDE.md#L36-L53) [tsconfig.json#L27-47](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tsconfig.json#L27-L47)
- Treat storage edits as coordinated client, dispatcher, server, and injected-script changes; preserve optional collection flags, initial/API/reuse branches, intercepted navigation, and page/interceptor cleanup. — [packages/playwright-core/src/client/browserContext.ts#L471-483](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/client/browserContext.ts#L471-L483) [packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts#L336-341](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts#L336-L341) [packages/playwright-core/src/server/browserContext.ts#L670-727](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/playwright-core/src/server/browserContext.ts#L670-L727) [packages/injected/src/storageScript.ts#L173-193](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/packages/injected/src/storageScript.ts#L173-L193)
- Keep tests hermetic and cross-platform, inspect fixme/skip and CI trigger conditions before describing coverage, and follow the documented linked-issue/approval policy before submitting upstream contributions. — [CONTRIBUTING.md#L5-16](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CONTRIBUTING.md#L5-L16) [CONTRIBUTING.md#L57-79](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/CONTRIBUTING.md#L57-L79) [tests/library/browsercontext-storage-state.spec.ts#L119-120](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/tests/library/browsercontext-storage-state.spec.ts#L119-L120) [.github/workflows/tests_primary.yml#L8-20](https://github.com/microsoft/playwright/blob/b630e71fcda7885885c459bcbb88e5bfa7c0a1ac/.github/workflows/tests_primary.yml#L8-L20)

Source repository: https://github.com/microsoft/playwright
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/playwright.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
