Commit Graph

805 Commits

Author SHA1 Message Date
Tommy D. Rossi e0eba5cf77 release: playwriter@0.0.57 2026-02-11 16:35:43 +01:00
Tommy D. Rossi 5098154585 docs: avoid focus stealing in framer iframe workflow
Document the page-reuse pattern for the Framer project tab so repeated checks do not spawn duplicate tabs, and explicitly ban bringToFront in this guide to avoid interrupting the active browser window during local debugging.
2026-02-11 16:16:39 +01:00
Tommy D. Rossi e6f1e8c089 fix extension runtime session routing for oopif iframe locators
Route Runtime.enable/disable through the incoming child sessionId instead of always using the tab root session so OOPIF iframe targets receive execution contexts reliably. Add a focused relay regression test for empty-src cross-origin iframe attach flow and update extension version/changelog for release tracking.
2026-02-11 16:15:02 +01:00
Tommy D. Rossi 1b6c66fed0 dist release 2026-02-07 18:32:03 +01:00
Tommy D. Rossi 150d252b59 fix: stabilize youtube navigation ready-state assertion
Retry the post-goto readyState check when Chromium tears down the execution context during ongoing navigation, so the relay navigation test validates page readiness without intermittent race failures.
2026-02-07 17:37:00 +01:00
Tommy D. Rossi eb36291212 Update AGENTS.md 2026-02-07 09:51:15 +01:00
Tommy D. Rossi be94434c3c Update PLAYWRITER_AGENTS.md 2026-02-07 09:51:10 +01:00
Tommy D. Rossi 5a3f344a0b Update manifest.json 2026-02-07 09:49:41 +01:00
Tommy D. Rossi 8ef3b21776 fix: prioritize test IDs over id attribute in aria snapshot refs
getStableRefFromAttributes checked id before data-testid, opposite of
what getRefsForLocators does. Now both are consistent: test IDs first,
id second. Test IDs are developer-intentional and stable, id is often
auto-generated by frameworks.
2026-02-07 09:25:28 +01:00
Tommy D. Rossi e851adfcb6 refactor: replace CDPSession class with type-safe ICDPSession backed by Playwright's internal CDP session
Remove the custom WebSocket-based CDPSession class entirely. All CDP
communication now goes through PlaywrightCDPSessionAdapter which wraps
Playwright's existing CDP session, avoiding duplicate WebSocket connections
and Target.attachToTarget calls that the relay intercepts.

ICDPSession interface uses ProtocolMapping generics from devtools-protocol
so send/on/off methods are fully type-safe — return types are inferred
from the CDP command string (e.g. 'Page.getLayoutMetrics' returns
Protocol.Page.GetLayoutMetricsResponse).

- Remove CDPSession class and getCDPSessionForPage WebSocket factory
- Remove wsUrl parameter from all snapshot/label functions
- Remove CDPSession cache from executor (adapter is stateless)
- Remove 'as CDPSession' casts from debugger, editor, styles, react-source
- Rename getExistingCDPSessionForPage → getCDPSessionForPage
- Remove test for old getCDPSession through relay
2026-02-06 18:38:26 +01:00
Tommy D. Rossi 682bde5c14 Update PLAYWRITER_AGENTS.md 2026-02-06 18:03:58 +01:00
Tommy D. Rossi 87188423b1 feat: reuse Playwright's internal CDP session instead of creating new WebSocket connections
Switch from getCDPSessionForPage (creates a new WS via Target.attachToTarget)
to getExistingCDPSessionForPage which reuses Playwright's internal CRSession.
This is critical for the relay server where Target.attachToTarget is intercepted
and cannot create real new sessions.

Also add FrameLocator support in accessibilitySnapshot — FrameLocator (from
locator.contentFrame()) is now auto-resolved to the real Frame object needed
for OOPIF CDP session attachment.

- New PlaywrightCDPSessionAdapter wrapping Playwright's CDPSession as ICDPSession
- New getExistingCDPSessionForPage() using context.getExistingCDPSession()
- resolveFrame() helper converts FrameLocator to Frame via elementHandle().contentFrame()
- getAriaSnapshot() frame param now accepts Frame | FrameLocator
- Executor CDP cache uses ICDPSession, borrowed sessions detach as no-op
- Test for getExistingCDPSession through the relay
- Updated framer iframe guide with alternative page.frames() example
- Bump playwright submodule to @xmorse/playwright-core@1.59.2
- Fix styles-api.md import path
2026-02-06 18:03:26 +01:00
Tommy D. Rossi 78734bf1e8 fix: prevent tab group add/remove infinite loop when dragging tabs
When a user drags a tab into the playwriter group, connectTab() sets
its state to 'connecting'. syncTabGroup() previously only kept
'connected' tabs in the group, so it would immediately ungroup the
'connecting' tab. This ungroup fired chrome.tabs.onUpdated, which
called disconnectTab(). When the original connectTab() resolved, it
re-added the tab, triggering onUpdated again — creating an infinite
add/remove/add/remove loop.

Fix: include 'connecting' tabs in syncTabGroup's group membership
filter. This way syncTabGroup won't fight the user's intent by
removing tabs that are still being set up. Error-state tabs are
still correctly excluded from the group.
2026-02-06 15:39:35 +01:00
Tommy D. Rossi d6adb460d5 fix: move log dir from /tmp/playwriter to ~/.playwriter (fixes #44) 2026-02-06 10:44:28 +01:00
Tommy D. Rossi 7f3fddb2af chore: update pnpm-lock.yaml 2026-02-06 10:37:45 +01:00
Tommy D. Rossi 66cdb02dd9 refactor: simplify iframe handling - use frame: Frame instead of iframe: Locator 2026-02-06 10:32:39 +01:00
Tommy D. Rossi d3a87cab2c agents 2026-02-05 22:31:09 +01:00
Tommy D. Rossi 2a95cc9a9a Update playwright 2026-02-05 22:28:59 +01:00
Tommy D. Rossi d9c3362dd9 Update PLAYWRITER_AGENTS.md 2026-02-05 22:28:56 +01:00
Tommy D. Rossi 9e88bcd64e agents 2026-02-05 22:26:47 +01:00
Tommy D. Rossi 187b8ba992 Update AGENTS.md 2026-02-05 22:14:55 +01:00
Tommy D. Rossi 2bc851e37b Update PLAYWRITER_AGENTS.md 2026-02-05 22:14:35 +01:00
Tommy D. Rossi afd0840523 chore: wire forked playwright-core into workspace 2026-02-05 17:06:08 +01:00
Tommy D. Rossi 3f24ac1d8f fix: use Runtime.evaluate fallback when setScriptSource is deprecated
Chrome deprecated Debugger.setScriptSource in Chrome 142+ (removed in 145).
Falls back to Runtime.evaluate to re-execute modified scripts, which
works for scripts defining functions at global scope.
2026-02-05 16:56:27 +01:00
Tommy D. Rossi 0eaf771c57 docs: refine Framer MCP palette verification 2026-02-05 15:48:17 +01:00
Tommy D. Rossi c4a413efba fix iframe snapshots and document Framer MCP flow 2026-02-05 14:49:32 +01:00
Tommy D. Rossi cd6d512d74 Update aria-snapshot.test.ts 2026-02-05 13:13:11 +01:00
Tommy D. Rossi 4eac3235cd waitForExtension in cli session new command 2026-02-05 12:48:37 +01:00
Tommy D. Rossi ebcfe33323 add iframe test with snapshot use 2026-02-05 12:47:15 +01:00
Tommy D. Rossi e33af55982 docs: clarify playwriter auto-use 2026-02-04 23:39:52 +01:00
Tommy D. Rossi 73c9723840 slopping around 2026-02-04 23:21:33 +01:00
Tommy D. Rossi 280572b36e refactor: track frame ownership on targets 2026-02-04 22:16:44 +01:00
Tommy D. Rossi ac49afc535 fix: route iframe targets through page sessions 2026-02-04 22:08:04 +01:00
Tommy D. Rossi dfe9738a00 Update SKILL.md 2026-02-04 22:05:28 +01:00
Tommy D. Rossi a718299b73 feat: add well-known skills discovery endpoint 2026-02-04 19:20:33 +01:00
Tommy D. Rossi 0b60fe844e chore: update diff messaging from tests
- Add "No changes since last call" hints for snapshots/html/markdown

- Adjust truncation message to suggest search

- Update skill.md snapshot behavior doc
2026-02-04 18:16:00 +01:00
Tommy D. Rossi b510f3f0d5 feat: use stable browser keys in CLI selection
- Show stableKey in session new listing
- Require stableKey for --browser selection
- Pass stableKey to session creation when available
2026-02-04 18:01:49 +01:00
Tommy D. Rossi e41c85af7b fix: match stable extension keys in status check 2026-02-04 17:57:59 +01:00
Tommy D. Rossi 1a59082e12 feat: auto-connect tabs created via ghostPublicAPI.openTab
Tabs created via Ghost Browser's openTab API now automatically
attach to Playwriter's debugger, making them immediately available
in context.pages() without requiring manual extension icon click.
2026-02-04 17:47:57 +01:00
Tommy D. Rossi 6f2aae0006 fix: enforce extension binding for cdp clients
- Resolve extension connections by stable key and map to current connection
- Reject Playwright clients without explicit extension binding when multiple browsers connected
- Reject duplicate clientId connections
- Allow default extension only when a single browser is connected
- Include stableKey in /extensions/status response
2026-02-04 17:36:30 +01:00
Tommy D. Rossi e3cec36bf6 fix: normalize session ids for relay endpoints
- Normalize sessionId values to strings in relay handlers
- Ensure recording endpoints pass string sessionId values
- Stringify CLI sessionId before request body
2026-02-04 17:26:24 +01:00
Tommy D. Rossi 321acf9dbc Update ghost-browser-api.d.ts 2026-02-04 17:24:36 +01:00
Tommy D. Rossi 5641b3803b fix: address multi-browser routing issues
- Move recording cleanup before connection delete (was no-op)
- Only fallback to default extension when extensionId is null
- Add cwd param to /cli/session/new, CLI passes process.cwd()
- Require pre-existing sessions for execute/reset endpoints
- Remove duplicate ensureRelayServer call in CLI
- Increase fetch timeouts from 500ms to 2000ms
2026-02-04 16:51:44 +01:00
Tommy D. Rossi 44514f00c8 feat: add multi-browser support
- Extension connections are now tracked per-connection with isolated state
- Each connection has its own connectedTargets, pendingRequests, messageId
- Sessions are bound to specific extensionId via SessionMetadata
- New /extensions/status endpoint for listing all connected browsers
- CLI session new shows browser selection when multiple connected
- Browser detection via navigator.userAgentData (Ghost, Brave, Edge, etc)
- Added identity permission for Chrome profile email detection
2026-02-04 16:43:09 +01:00
Tommy D. Rossi c623c91891 extract Ghost Browser code to shared ghost-browser.ts
- Constants, types, proxy factory, and handler in one file
- Works in both Node.js (executor) and Chrome (extension) environments
- executor.ts imports createGhostBrowserChrome factory
- background.ts imports handleGhostBrowserCommand handler
2026-02-04 13:16:29 +01:00
Tommy D. Rossi f2faee50c0 move Ghost Browser docs to .d.ts, shorten skill.md section 2026-02-04 13:14:46 +01:00
Tommy D. Rossi a1178cbd35 add Ghost Browser API integration
Exposes chrome.ghostPublicAPI, chrome.ghostProxies, and chrome.projects
in the executor sandbox when running in Ghost Browser.

- protocol.ts: add GhostBrowserCommandMessage type
- background.ts: handle ghost-browser messages, call chrome APIs
- cdp-relay.ts: route ghost-browser commands to extension
- executor.ts: inject chrome object with Proxy-based API namespaces
- skill.md: document Ghost Browser integration with examples

Enables multi-identity automation for managing multiple accounts,
rotating proxies per tab/identity, and isolated cookie sessions.
2026-02-04 13:09:41 +01:00
Tommy D. Rossi a52ec9a8f2 add Ghost Browser API type definitions
Extracted from Ghost Browser.app binary. Includes:
- chrome.ghostPublicAPI: tab/identity management
- chrome.ghostProxies: full proxy control per tab/identity/session
- chrome.projects: identity/workspace/session management
- Extended chrome.tabs with Ghost-specific properties
2026-02-04 12:55:03 +01:00
Tommy D. Rossi bd38ba0532 feat: implicit return for single expressions using acorn parser
- Parse code with acorn to detect single expression statements
- Auto-wrap expressions with 'return await (...)' for implicit return
- Exclude side-effects: assignments, updates (x++), delete operator
- Update skill.md examples to remove console.log (keep await)
- Add unit tests for shouldAutoReturn function
2026-02-04 11:23:39 +01:00
Tommy D. Rossi 26ddeb2a7b more logging 2026-02-03 22:01:44 +01:00