Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
457 commits
Select commit Hold shift + click to select a range
1f3e4c9
Fix waitForEvent timeout period and probe ffmpeg for libwebp.
cursoragent Sep 15, 2026
1f679fb
Serialize screencast frame delivery and harden empty WebM writes.
cursoragent Sep 15, 2026
1016f7e
Reassert WebKit page activation before child-frame evaluates.
cursoragent Sep 15, 2026
66cef89
Fix WebKit popups destroyed by subframe navigation suppress exemption.
cursoragent Sep 15, 2026
b8d9068
Fall back to cwebp when ffmpeg lacks a libwebp encoder.
cursoragent Sep 15, 2026
ae94b44
Fix WebKit localhost WebSocket Accept-Language via handshake proxy.
cursoragent Sep 15, 2026
53b2a02
Fix WebKit ImmediateJSHandle evaluate for primitives and Infinity.
cursoragent Sep 15, 2026
7c17453
Apply WebKit create-time HttpCredentials when enabling page chrome.
cursoragent Sep 15, 2026
e856eba
Fix WebKit macOS clipboard Meta shortcuts and WS close echo.
cursoragent Sep 15, 2026
927e5fd
Fix WebKit screenshot animation resume, mid-nav click, and 204 abort.
cursoragent Sep 15, 2026
7846938
Fix WebKit response body navigated-away and clock busy-loop sync.
cursoragent Sep 15, 2026
89ac6a7
Fix WebKit workers, filechooser intercept, and locator GC.
cursoragent Sep 15, 2026
6de54b9
Strip WebKit proxy hop headers and serialize binding coalesce.
cursoragent Sep 15, 2026
4bf6204
Fix WebKit proxy bodies/auth, fulfill headers, dispose, and orientation.
cursoragent Sep 15, 2026
c8acca4
Fix routeWebSocket message rewrites while HAR is capturing.
cursoragent Sep 15, 2026
3c31ba2
Fix SA1515 blank line before WebSocketRouteScript comment.
cursoragent Sep 15, 2026
4aa098e
Fix WebKit macOS requestStorageAccess and check retarget hangs.
cursoragent Sep 15, 2026
8d751b2
Fix WebKit Page.Request for SW-handled fetches under routing.
cursoragent Sep 15, 2026
2700111
Fix WebKit macOS TLS 1.3 security details and client-cert gaps.
cursoragent Sep 15, 2026
0a69847
Fix Chromium evaluate hang after navigation destroys context.
cursoragent Sep 15, 2026
69a383f
Fix WebKit binding install when evaluate wraps IIFEs.
cursoragent Sep 15, 2026
892595c
Restore TLS 1.2|1.3 on the shared HTTPS test fixture.
cursoragent Sep 15, 2026
a7e10d3
Fix macOS WebKit client WebSocket close echoing as 1006.
cursoragent Sep 15, 2026
e10fa0b
Fix macOS WebKit WebSocket Accept-Language via local.playwright.
cursoragent Sep 15, 2026
32f91ec
Fix WebKit AddInitScript child-frame callbacks coalesced away.
cursoragent Sep 15, 2026
c793ae0
Fix WebKit autowait load ordering and no-op route.continue headers.
cursoragent Sep 15, 2026
3e6348f
Fix WebKit AI aria snapshot hangs on WaitForFunction and lazy iframes.
cursoragent Sep 15, 2026
2d105be
Fix WebKit parallel expose init-script race and load wait ordering.
cursoragent Sep 15, 2026
500d0b7
Avoid WebKit transport deadlocks from sync waitForEvent TCS.
cursoragent Sep 15, 2026
f533c21
Offload WebKit Load/DOMContentLoaded raises off the transport thread.
cursoragent Sep 15, 2026
83c0fca
Stop forcing WebKit LocaleHandshakeProxy; fix WS origin and console w…
cursoragent Sep 15, 2026
e6aae60
Set Content-Length on WebKit route.fulfill for non-empty bodies.
cursoragent Sep 15, 2026
6ed576d
Fix WebKit macOS launch-args, locale, TLS details, contextmenu, redir…
cursoragent Sep 15, 2026
f7bd055
Harden ClientCertificatesProxy self-signed cert with SAN and EKU.
cursoragent Sep 15, 2026
62e34c7
Fix WebKit cross-process reload redirect cancelling pending navigation.
cursoragent Sep 15, 2026
05ae57a
Harden WebKit macOS UA, connection errors, and orientation after proc…
cursoragent Sep 15, 2026
e3397b5
Fix macOS WebKit proxy bypass, UA override, and navigation hang regre…
cursoragent Sep 15, 2026
fa5fa79
Fix macOS WebKit proxy bypass matching, exclude failures, and UA pers…
cursoragent Sep 15, 2026
c250431
Fix Darwin WebKit proxy shim keep-alive and Safari UA side effects.
cursoragent Sep 15, 2026
b89f1dc
Fix WebKit proxy bypass hang and caret hide on Linux.
cursoragent Sep 15, 2026
ce98d2f
Always wrap Darwin WebKit HTTP proxies to fix localhost CFNetwork 306.
cursoragent Sep 15, 2026
5789668
Fix WebKit client-certificate HTTP/2 and TLS error pages on Linux.
cursoragent Sep 15, 2026
1566950
Fix Darwin WebKit HAR redirects, WS close, SetContent, UA, expect.
cursoragent Sep 15, 2026
c2154f7
Fix Darwin WebKit storage access, WS proxy, wait logs, and toHaveRole.
cursoragent Sep 15, 2026
1d706eb
Keep WebKit reload waiters armed across early redirect cancels.
cursoragent Sep 15, 2026
875653c
Stop forcing Darwin WebKit LocaleHandshakeProxy; keep Linux WS headers.
cursoragent Sep 15, 2026
962362b
Fix Darwin WebKit WS headers, wait logs, and close evaluate errors.
cursoragent Sep 15, 2026
c1e68ae
Fix Darwin WebKit contextmenu, iframe hasFocus, and JS redirect inter…
cursoragent Sep 15, 2026
9a4c4bc
Fix SA1512 blank line after iframe focus comment in WKPage.
cursoragent Sep 15, 2026
01c0b04
Fix Darwin WebKit AI iframe snapshot hangs and pageerror waits.
cursoragent Sep 15, 2026
564ebfd
Fix Darwin WebKit client-cert TLS error pages on HTTP CONNECT.
cursoragent Sep 15, 2026
243c482
Alias loopback client-cert origins for Darwin CONNECT host variants.
cursoragent Sep 15, 2026
ec4fd00
Treat trailing-slash URL variants as the same WebKit navigation.
cursoragent Sep 15, 2026
6d6b52c
Keep client-cert loopback aliases one-way for WebKit HTTP/2.
cursoragent Sep 15, 2026
a58eb00
Defer WebKit competing-navigation interrupt until commit.
cursoragent Sep 15, 2026
674f2f2
Fix WebKit AI iframe stitch, Linux HTTP/2, and COOP finished events.
cursoragent Sep 16, 2026
cbab6b0
Retry Windows Chocolatey ffmpeg install in CI.
cursoragent Sep 16, 2026
db18fc0
Install Windows CI ffmpeg from BtbN builds, not Chocolatey.
cursoragent Sep 16, 2026
6482656
Honor <loopback> bypass and stop false WebKit nav interrupts.
cursoragent Sep 16, 2026
6a28d69
Settle popup load before arming WebKit goto waiters.
cursoragent Sep 16, 2026
aa5f92c
Retry Setup .NET on CI when the Windows SDK CDN download fails.
cursoragent Sep 16, 2026
f4f6eda
Fix Darwin WebKit storage access, WS HAR URLs, and proxy POST bodies.
cursoragent Sep 16, 2026
ee24066
Stop forcing Darwin LocaleHandshakeProxy on every WebKit context.
cursoragent Sep 16, 2026
58d7051
Restore Darwin LocaleHandshakeProxy force and harden Mac WS shim.
cursoragent Sep 16, 2026
1c2704f
Fix Mac WS shim message wrapping and RSA post-click focus.
cursoragent Sep 16, 2026
2686ff9
Fix Mac WS origin facade, Proxy-Connection strip, TLS peek, RSA click.
cursoragent Sep 16, 2026
b2d23e3
Fix Darwin ExposesBrowser close, cert error-page connect, lazy iframe.
cursoragent Sep 16, 2026
60ba406
Do not echo WebSocket close after a server-initiated close.
cursoragent Sep 16, 2026
be65fab
Keep localhost proxy CONNECT targets; IPv4-only direct TCP; RSA mouse…
cursoragent Sep 16, 2026
80a7854
Await requestStorageAccess under emulateUserGesture; harden Darwin MITM.
cursoragent Sep 16, 2026
0677bdb
Report WebKit popup Page before exposeFunction; harden wait logs.
cursoragent Sep 16, 2026
575f8e3
Flush WS proxy tunnels, prefer WebKit timing names, retry screenshot …
cursoragent Sep 16, 2026
18d9e84
Seed WebKit data:/about: load lifecycle from readyState after commit.
cursoragent Sep 16, 2026
10d1f1a
Fix child-frame evaluate TDZ; gate RSA gesture; simplify wait logs.
cursoragent Sep 16, 2026
9f62f51
Fix tip CI: SetContent load wait, about:blank Load, autowait order, H…
cursoragent Sep 16, 2026
f887de3
Fix WebKit ExecutablePath, Darwin WS/certs half-close, RSA pulse, clo…
cursoragent Sep 16, 2026
52c05cf
Fix Darwin WebKit WS close echo, cert MITM error pages, lazy aria.
cursoragent Sep 16, 2026
322b927
Restore waitForSelector combined preview probe; do not succeed Hidden…
cursoragent Sep 16, 2026
9ca925e
Fix tip CI: SOCKS FIN, HTTPS PEM keys, Darwin WS/aria/cookies, large …
cursoragent Sep 16, 2026
7ba9a32
Fix Darwin CI regressions: EphemeralKeySet, cookie mirror Rewrite.
cursoragent Sep 16, 2026
93a75b6
Fix tip CI: Windows HTTPS PFX, cookies Rewrite, WebKit/Chromium flakes.
cursoragent Sep 17, 2026
df00607
Fix HAR Update multipart: capture HTML at load, stop body overwrite.
cursoragent Sep 17, 2026
7e4b4b8
Fix Darwin WebKit CI: ARIA uncheck, timing, cookies, WS close, RSA, a…
cursoragent Sep 17, 2026
b90d7ee
Fix tip CI regression: Chromium dialog rAF hang, Darwin WS/cookies/aria.
cursoragent Sep 17, 2026
0ff47fb
Fix tip CI: popup enable deadlock, shadow click, dialog race, aria.
cursoragent Sep 17, 2026
7e7eeda
Fix tip CI hangs: navigation wait, expect close, click signals, shado…
cursoragent Sep 17, 2026
fa81303
Fix OOPIF Set-Cookie pollution from Network.loadNetworkResource.
cursoragent Sep 17, 2026
7cbf838
Fix SA1204 in CanRefetchBody by inlining refetch helpers.
cursoragent Sep 17, 2026
0e7b795
Fix Darwin WebKit tip CI: init double-eval, scroll PickPoint, RSA, aria.
cursoragent Sep 17, 2026
709a429
Harden Darwin WS/cert half-close and skip lazy iframe objectId evalua…
cursoragent Sep 17, 2026
0465514
Fix SA1202: keep private IsLazyIframeRefFunction after internal consts.
cursoragent Sep 17, 2026
2b0cb63
Fix CI product bugs in expect, OOPIF bodies, and WebKit clicks.
cursoragent Sep 19, 2026
b6511fe
Fix CI product bugs in headers, expect text, and WebKit close.
cursoragent Sep 19, 2026
ba9db53
Read Chromium hasExtraInfo from the responseReceived event.
cursoragent Sep 19, 2026
839c0b0
Keep Chromium extra-info hops until headers are paired.
cursoragent Sep 19, 2026
f547305
Pair Chromium extra-info by the raw CDP request id.
cursoragent Sep 19, 2026
21b023d
Keep service-worker startup console logs until they are read.
cursoragent Sep 20, 2026
8ec8930
Tolerate WebKit page close during NewPage and prefer APIRequest abort.
cursoragent Sep 20, 2026
531ce87
Stop installing WebKit test HTTPS cert into Linux system CAs.
cursoragent Sep 20, 2026
a627e8e
Reject in-flight APIRequest fetches on context close like upstream Di…
cursoragent Sep 20, 2026
6ca8fd0
Fix Chromium expect/crash/mouse and WebKit click/WS CI failures.
cursoragent Sep 20, 2026
fdb1c9c
Fix WebKit CI product bugs: viewport race, force click, wait logs, RS…
cursoragent Sep 20, 2026
434d124
Revert WaitForNavigation Response resolve and harden related CI fixes.
cursoragent Sep 20, 2026
3537294
Fix evaluate navigation abort, goto/auto-wait races, and WebKit click…
cursoragent Sep 20, 2026
e6a1143
Revert over-broad ERR_ABORTED swallow; fix redirects, SSL clicks, aria.
cursoragent Sep 20, 2026
bd1b437
Fix tip CI: APIRequest abort RST, lazy visibility, clock pause, RSA.
cursoragent Sep 20, 2026
f5b5976
Fix WebKit macOS RSA, clock awaitPromise deadlock, lazy iframe waits.
cursoragent Sep 20, 2026
73ff170
Fix aria iframe stitch order and clock injector evaluate.
cursoragent Sep 20, 2026
79f8b04
Fix WebKit preview/strict waits and APIRequest abort RST.
cursoragent Sep 20, 2026
463ea1a
Harden Abort RST ordering, lazy iframe preview, aria stitch, RSA pulse.
cursoragent Sep 21, 2026
80614c8
Revert ownsSocket:false APIRequest hang; skip iframe preview.
cursoragent Sep 21, 2026
6535458
Stop WebKit query tag evaluate from breaking getByTestId.
cursoragent Sep 21, 2026
f8764ae
Skip iframe preview on QueryAll; fix Abort waiter race and RSA click.
cursoragent Sep 21, 2026
74d088d
Fix RSA click evaluate and lazy-iframe layout wedge.
cursoragent Sep 21, 2026
b0e813a
Seed load after setContent when only lazy iframes remain.
cursoragent Sep 21, 2026
d5c5cfb
Abort fetches before socket close and keep committed navigations.
cursoragent Sep 21, 2026
53a7e81
Recover committed navigations and avoid lazy-frame evaluate wedges.
cursoragent Sep 21, 2026
5c8a411
Fix macOS WebKit CI: aria stitch, popup order, blank goto, RSA.
cursoragent Sep 21, 2026
4f3e7aa
Harden Darwin WebKit fixes from CI investigator findings.
cursoragent Sep 21, 2026
628bf8f
Revert blank lifecycle sync-replay that broke WebKit evaluate/init.
cursoragent Sep 21, 2026
6d06e84
Fix popup URL, RSA origin grant, aria iframe stitch, CSS retain.
cursoragent Sep 21, 2026
bfae7f6
Fix WebKit popup blank wait, RSA pulse, and aria enter-frame stitch.
cursoragent Sep 22, 2026
765b2ff
Fix about:blank popup emit race, closed popup Page report, RSA Input …
cursoragent Sep 22, 2026
3a3ec45
Fix RSA activation race, Chromium aria ChildFrames stitch, frame deta…
cursoragent Sep 22, 2026
5acade6
Fix Darwin RSA page-proxy-only gesture and data: aria iframe stitch.
cursoragent Sep 22, 2026
cd6fc70
Await Target.detachedFromTarget in CRPage.ClosePageAsync.
cursoragent Sep 22, 2026
7466cf2
Align Darwin requestStorageAccess with upstream utilityScript evaluate.
cursoragent Sep 22, 2026
0a43ca3
Harden Darwin RSA: raw function plus page-proxy Input pulse.
cursoragent Sep 22, 2026
c1317e0
Align Darwin RSA with upstream sync callFunctionOn; pass proxy creds …
cursoragent Sep 22, 2026
9eb6536
Bind Darwin RSA to UtilityScript callFunctionOn; harden data: aria st…
cursoragent Sep 22, 2026
762ea8a
Pulse page-proxy Input before Darwin RSA UtilityScript CFO.
cursoragent Sep 22, 2026
c74085d
Run Darwin RSA under real Input click; retry active iframe aria stitch.
cursoragent Sep 22, 2026
887858a
Harden Darwin RSA: timeout click path and UtilityScript fallback.
cursoragent Sep 22, 2026
495d8c0
Grant storageAccess for Darwin RSA; unblock blank→blank GoTo.
cursoragent Sep 22, 2026
2a1e121
Revert blank→blank sync waiter complete; keep RSA grant and safe seed.
cursoragent Sep 22, 2026
c8e2854
Complete blank→blank waiters only after readyState seed exhausts.
cursoragent Sep 22, 2026
c069a17
Stop burning Darwin RSA on a click-handler first attempt.
cursoragent Sep 22, 2026
2641bb7
Align Darwin RSA UtilityScript with upstream evaluate args.
cursoragent Sep 22, 2026
3423492
Record Darwin first-party ITP interaction before RSA.
cursoragent Sep 22, 2026
2e7d067
Use Shift key for Darwin first-party ITP interaction.
cursoragent Sep 22, 2026
63ae9b3
Use mouse click for Darwin ITP first-party interaction.
cursoragent Sep 22, 2026
6eaa94c
Blur after Darwin ITP pulse so frameset aria [active] stays clean.
cursoragent Sep 22, 2026
4bb4326
Restore focus after Darwin ITP pulse.
cursoragent Sep 22, 2026
ab7d217
Skip Darwin ITP mouse pulse on frameset documents.
cursoragent Sep 22, 2026
23e4957
Detect frameset via main-frame context for ITP skip.
cursoragent Sep 22, 2026
6fb6090
Skip Darwin ITP pulse when main frame has child frames.
cursoragent Sep 22, 2026
0818a76
Resolve waitForCrash when Crash already fired.
cursoragent Sep 22, 2026
e8a5e14
Use form-entry for Darwin ITP first-party pulse.
cursoragent Sep 22, 2026
85e0530
Recover superseded goto responses; stitch srcdoc iframes by DOM index.
cursoragent Sep 22, 2026
b1b895a
Flush Darwin proxy shim responses before closing sockets.
cursoragent Sep 22, 2026
05c1400
Prefer focused child frame when stitching active iframe aria.
cursoragent Sep 22, 2026
6e66910
Forward WebKit CONNECT auth instead of always injecting.
cursoragent Sep 22, 2026
99b359d
Treat child-frame detach as transient; drop orphaned willCheck retains.
cursoragent Sep 22, 2026
dfae800
Harden Darwin CONNECT 407 delivery; share fill actionability deadline.
cursoragent Sep 23, 2026
160693b
Omit proxy URL userinfo on Darwin WebKit for CONNECT 407 retry.
cursoragent Sep 23, 2026
267b05a
Unwedge Darwin blank→blank GoTo without CA2025 fire-and-forget.
cursoragent Sep 23, 2026
5e9f164
Retry upstream CONNECT with credentials after Darwin shim 407.
cursoragent Sep 23, 2026
a73e423
Offer Darwin shim CONNECT credentials on first hop, retry on 407.
cursoragent Sep 23, 2026
6e95620
Prefer WebKit Console.message text over handle previews.
cursoragent Sep 23, 2026
93fc032
Harden Darwin WebKit console for frame sessions.
cursoragent Sep 23, 2026
6edd210
Gate Darwin Runtime console fallback on frame Console readiness.
cursoragent Sep 23, 2026
c1f9f3a
Remove Darwin console RaiseConsole text dedupe.
cursoragent Sep 23, 2026
7fcd53a
Do not Target.resume WebKit frame sessions after Console.enable.
cursoragent Sep 23, 2026
c09233f
Detect Chromium form/link clicks for ActionSignals expectNavigation.
cursoragent Sep 23, 2026
a61bac1
Wait for WebKit target recycle before setBootstrapScript.
cursoragent Sep 23, 2026
2c6c581
Harden AI aria iframe stitch under Windows suite load.
cursoragent Sep 23, 2026
a86f6a5
Never assign fN aria prefixes to the main frame.
cursoragent Sep 23, 2026
7cf52e6
Recover aborted goto by loaderId; RST APIRequest before abort gate.
cursoragent Sep 23, 2026
1aa1131
Restore main-frame aria ref renumber after navigation.
cursoragent Sep 23, 2026
f02fea1
Harden concurrent-goto ERR_ABORTED recovery on Chromium.
cursoragent Sep 23, 2026
06edc9e
Keep throwing on Page.navigate ERR_ABORTED; soft-fail aria child capt…
cursoragent Sep 23, 2026
7b9ec2a
Write empty videos via image2pipe; harden APIRequest abort RST.
cursoragent Sep 23, 2026
5ceb962
Fix CA2025 in empty-video image2pipe writer.
cursoragent Sep 23, 2026
8071e80
Fix WebKit child-frame goto lifecycle and WaitForRequest races.
cursoragent Sep 23, 2026
5f015a9
Fail dead WebKit target wraps fast; exhaust data: goto waiters.
cursoragent Sep 23, 2026
d944a05
fix(testserver): snapshot WaitForRequest HttpRequest headers safely
cursoragent Sep 23, 2026
fbd6f4c
fix(webkit): retry context init-script evaluate on new pages
cursoragent Sep 24, 2026
67ab0e6
fix(webkit): install context init scripts before Target.resume
cursoragent Sep 24, 2026
63c7114
fix(webkit): restore popup expose before resume; NewPage-only before-…
cursoragent Sep 24, 2026
139207e
fix(webkit): restore NewPage EvaluateOnCurrent after before-resume
cursoragent Sep 24, 2026
571d3d9
fix(webkit): finish before-resume before InitializedTask
cursoragent Sep 24, 2026
d3c632f
fix(webkit): timeout LocaleHandshakeProxy outbound connects
cursoragent Sep 24, 2026
de9c0a0
fix(webkit): drop stale clock realtime + skip AddScriptTag preview
cursoragent Sep 24, 2026
6d53b55
fix(chromium): retain CSS sheets across nav; full SOCKS ClientHello f…
cursoragent Sep 24, 2026
fcd0a27
fix(webkit): tighter proxy connect budget; bound Darwin NewPage evalu…
cursoragent Sep 24, 2026
5cdec25
fix(chromium): hide SW favicon events; prefer completed evaluate over…
cursoragent Sep 24, 2026
1c13539
fix(webkit): apply offline on provisional sessions like upstream
cursoragent Sep 24, 2026
34b961d
fix(chromium): recover aborted goto by loaderId; record late HAR fail…
cursoragent Sep 24, 2026
b774a7e
fix(webkit): avoid awaitPromise on clock pauseAt kickoff
cursoragent Sep 24, 2026
2c6230e
fix(webkit): do not drop iframe FrameAttached when parent id is stale
cursoragent Sep 24, 2026
18ef492
fix(webkit): schedule clock pauseAt via builtins.setTimeout macrotask
cursoragent Sep 24, 2026
08d5e1c
fix(webkit): skip style-tag preview; start thenable evaluate before Y…
cursoragent Sep 24, 2026
4d99f82
fix(chromium): aria iframe stitch budget; faster TLS error-page MITM
cursoragent Sep 24, 2026
5149358
fix: drain Load before clickload; emit dialogs sync when listeners exist
cursoragent Sep 24, 2026
f9c1a88
fix: bound toHaveURL aria snapshot; recover ERR_SOCKET_NOT_CONNECTED
cursoragent Sep 24, 2026
1165ef6
fix: harden abort-nav recovery, cert MITM proxy hop, click waits
cursoragent Sep 24, 2026
bc703ce
fix: drop late willCheck retains; keep cert MITM accept loop alive
cursoragent Sep 24, 2026
102bffd
fix: defer WK replace-nav interrupt; recompute expect Pass after Actu…
cursoragent Sep 25, 2026
d51ce5d
fix: scope aria DomIndex stitch; harden MITM error-page tunnel races
cursoragent Sep 25, 2026
f6f9a84
fix: drop MITM goto soft-grace that hung on empty frame.Url
cursoragent Sep 25, 2026
a7da224
fix: popup dialog init, goto abort recovery, video offload, WK redirects
cursoragent Sep 25, 2026
b060885
fix: enable worker Network with Runtime; bound popup getFrameTree
cursoragent Sep 25, 2026
4f7c3f8
fix(chromium): await worker Network.enable; seal nested ExtraInfo
cursoragent Sep 25, 2026
d64af81
fix(chromium): arm worker Network.enable on attach; seal ExtraInfo sync
cursoragent Sep 25, 2026
bd6072a
fix(chromium): drop accidental NoteDialogOpened from worker attach fix
cursoragent Sep 25, 2026
75f0298
fix(chromium): resume workers without awaiting Network.enable ack
cursoragent Sep 25, 2026
bacc441
Revert "fix(chromium): resume workers without awaiting Network.enable…
cursoragent Sep 25, 2026
4f8d20a
fix(webkit): retry SetContent evaluate after process-swap dispose
cursoragent Sep 25, 2026
dbbe44b
fix(chromium): return 401 from goto auth; keep WK popup contexts
cursoragent Sep 25, 2026
fe5028b
fix(webkit): do not destroy execution worlds on evaluate retry
cursoragent Sep 25, 2026
edeafc1
fix: recover MITM TLS abort, WK blank/NewPage races, concurrent goto
cursoragent Sep 25, 2026
4ec9435
fix(chromium): return early after MITM soft-grace lifecycle settle
cursoragent Sep 25, 2026
29e972f
fix(chromium): harden MITM abort commit check and concurrent-goto rec…
cursoragent Sep 25, 2026
98fcfe5
fix(chromium): return final response after redirect capture latch
cursoragent Sep 25, 2026
c3b024b
fix(chromium): defer ExtraInfo header seal; prefer ExtraInfo pairs
cursoragent Sep 25, 2026
0805618
fix(video): serialize empty-recording finalize; await shared Stop
cursoragent Sep 25, 2026
5c7228d
fix(dialog): sync waitForEvent match; replay open under ScheduleOpen …
cursoragent Sep 25, 2026
59757a5
fix(chromium,webkit): stage downloads away from .crdownload; retry WK…
cursoragent Sep 25, 2026
0eedbbd
fix(networkidle,downloads): keep waiting when idle revoked; atomic pr…
cursoragent Sep 25, 2026
6300edd
fix(chromium): poll for committed response on concurrent-goto ERR_ABO…
cursoragent Sep 25, 2026
9f8a05b
fix(chromium,certs): recover concurrent-goto commits; prefer TLS auth…
cursoragent Sep 26, 2026
6436a86
fix(webkit): back off clock poll so Darwin timers can drain
cursoragent Sep 26, 2026
3b9dad7
fix(webkit): avoid awaitPromise on sync handle evaluates
cursoragent Sep 26, 2026
83dd2e7
fix(webkit): Yield before replace-nav interrupt fault
cursoragent Sep 26, 2026
d0cdf96
fix(webkit): skip pre-resume UA evaluate; budget EvaluateOnCurrent
cursoragent Sep 26, 2026
19cfe6e
fix(chromium): latch document 200 after late Fetch promotion
cursoragent Sep 26, 2026
73f885b
fix(chromium): honor networkidle revoke; bound trace screenshots
cursoragent Sep 26, 2026
a9ab3ca
fix(chromium): networkidle-only revoke wait; keep load fast-path
cursoragent Sep 26, 2026
0bcd4dc
fix: Darwin bare-eval wrap, element shot wait order, frame eval retry
cursoragent Sep 26, 2026
027cf72
fix: narrow bare-eval wrap; wait stable after animations
cursoragent Sep 26, 2026
e7d7ce3
fix(webkit): harden filtered clearCookies expire-in-place
cursoragent Sep 26, 2026
498fa06
fix: retry screenshot mid-nav; avoid awaitPromise on primitives
cursoragent Sep 26, 2026
f4b6e15
fix(webkit): wrap sync IIFEs; strip trailing semicolons for serialize
cursoragent Sep 26, 2026
701a05f
fix: latch doc responses; keep drag setup off main world; sync unname…
cursoragent Sep 26, 2026
a39ca76
fix(chromium): wait for peer navigate before superseding GoTo
cursoragent Sep 26, 2026
8c84243
fix(chromium): require live lifecycle after GoTo; replay data: load
cursoragent Sep 26, 2026
86d0002
fix(chromium): restore sawTargetLifecycle GoTo fast-path with FrameNa…
cursoragent Sep 26, 2026
33c583c
fix(chromium): replay GoTo load when FrameNavigated wipes lifecycle
cursoragent Sep 26, 2026
eaffa60
fix(chromium): keep lifecycle across same-loader FrameNavigated
cursoragent Sep 26, 2026
cf56a14
fix(chromium): reject oversized screenshots before CDP capture
cursoragent Sep 26, 2026
0889ac8
fix(webkit): defer navigation requestfinished until Response is set
cursoragent Sep 26, 2026
0fb6068
fix(webkit): keep deferred nav requests for late Response + snap SSL …
cursoragent Sep 26, 2026
112a28f
fix(webkit): park deferred nav finishes off the live request map
cursoragent Sep 27, 2026
db8cc60
fix(chromium): broaden data: GoTo lifecycle replay after navigate
cursoragent Sep 27, 2026
0f653e3
fix(webkit): clear deferred-nav inflight idempotently
cursoragent Sep 27, 2026
e4ab883
fix(chromium): gate data: GoTo lifecycle replay on landed nav
cursoragent Sep 27, 2026
bfc0d57
fix(chromium): confirm data: GoTo via readyState when events lag
cursoragent Sep 27, 2026
55b853e
fix(chromium): ignore stale commit when gating data: GoTo
cursoragent Sep 27, 2026
5d095b6
fix(webkit): further back off clock poll under Darwin suite load
cursoragent Sep 27, 2026
1899c2b
fix: Chromium autoplay policy; resolve WS iframe before sendToPage
cursoragent Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Keep test fixture bodies byte-stable across platforms (Windows checkout must not inject CRLF).
src/PlaywrightNative.TestServer/wwwroot/** text eol=lf
*.json text eol=lf
172 changes: 159 additions & 13 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ on:
- '**.csproj'
- '**.runsettings'

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
DOTNET_VERSION: '10.0.x'
# Pin BrowserFetcher's cache to a job-local path so actions/cache can
Expand All @@ -23,7 +27,7 @@ env:

jobs:
build:
name: ${{ matrix.browser }}-${{ matrix.mode }}-${{ matrix.os }}
name: ${{ matrix.browser }}-${{ matrix.mode }}-${{ matrix.os }}${{ matrix.shardTotal && format('-shard{0}of{1}', matrix.shardIndex, matrix.shardTotal) || '' }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
Expand All @@ -32,23 +36,107 @@ jobs:
# Chromium — full coverage on Linux + Windows, headless + headful.
- { os: ubuntu-latest, browser: chromium, mode: headless }
- { os: ubuntu-latest, browser: chromium, mode: headful }
- { os: windows-latest, browser: chromium, mode: headless }
- { os: windows-latest, browser: chromium, mode: headful }
# Windows runs much slower per-test than Linux and never reaches
# the end of the suite before the org's CI timeout kills the job
# (observed: ~40% done at the ~2h cutoff). Split into shards by
# test class so each one finishes with headroom to spare.
- { os: windows-latest, browser: chromium, mode: headless, shardIndex: 1, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headless, shardIndex: 2, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headless, shardIndex: 3, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headless, shardIndex: 4, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headful, shardIndex: 1, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headful, shardIndex: 2, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headful, shardIndex: 3, shardTotal: 4 }
- { os: windows-latest, browser: chromium, mode: headful, shardIndex: 4, shardTotal: 4 }
# WebKit — full test suite against the protocol stack.
# macOS + Linux headless. Expect failures until WebKit catches up.
- { os: macos-14, browser: webkit, mode: headless }
# macOS also hits the CI timeout even at a 3-way split (observed:
# one shard still ~92% done at cutoff -- it draws a disproportionate
# cluster of client-cert/TLS tests that hang ~30s each on macOS's
# Kestrel TLS 1.3 limitation). 5-way spreads that load thinner.
- { os: macos-14, browser: webkit, mode: headless, shardIndex: 1, shardTotal: 5 }
- { os: macos-14, browser: webkit, mode: headless, shardIndex: 2, shardTotal: 5 }
- { os: macos-14, browser: webkit, mode: headless, shardIndex: 3, shardTotal: 5 }
- { os: macos-14, browser: webkit, mode: headless, shardIndex: 4, shardTotal: 5 }
- { os: macos-14, browser: webkit, mode: headless, shardIndex: 5, shardTotal: 5 }
- { os: ubuntu-latest, browser: webkit, mode: headless }
steps:
- uses: actions/checkout@v4
# builds.dotnet.microsoft.com occasionally fails to serve the Windows SDK
# zip (transient CDN / network). Retry a few times before failing the job.
- name: Setup .NET
id: setup-dotnet-1
continue-on-error: true
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Wait before Setup .NET retry
if: steps.setup-dotnet-1.outcome == 'failure'
shell: bash
run: sleep 20
- name: Setup .NET (retry 2)
id: setup-dotnet-2
if: steps.setup-dotnet-1.outcome == 'failure'
continue-on-error: true
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Wait before Setup .NET final retry
if: steps.setup-dotnet-1.outcome == 'failure' && steps.setup-dotnet-2.outcome == 'failure'
shell: bash
run: sleep 40
- name: Setup .NET (retry 3)
if: steps.setup-dotnet-1.outcome == 'failure' && steps.setup-dotnet-2.outcome == 'failure'
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install ffmpeg (Windows)
if: matrix.os == 'windows-latest'
shell: pwsh
run: |
# Bypass Chocolatey — community.chocolatey.org regularly 504s on the
# ffmpeg package and can still exit 0, which made retries ineffective.
$ErrorActionPreference = 'Stop'
$zip = Join-Path $env:RUNNER_TEMP 'ffmpeg.zip'
$dir = Join-Path $env:RUNNER_TEMP 'ffmpeg'
$url = 'https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip'
New-Item -ItemType Directory -Force -Path $dir | Out-Null
$downloaded = $false
for ($attempt = 1; $attempt -le 5; $attempt++) {
Write-Host "Downloading ffmpeg (attempt $attempt/5) from $url"
try {
Invoke-WebRequest -Uri $url -OutFile $zip -UseBasicParsing
$downloaded = $true
break
} catch {
Write-Warning "Download failed: $($_.Exception.Message)"
if ($attempt -eq 5) { throw }
Start-Sleep -Seconds (15 * $attempt)
}
}
if (-not $downloaded) { throw 'ffmpeg download failed' }
Expand-Archive -Path $zip -DestinationPath $dir -Force
$bin = Get-ChildItem -Path $dir -Recurse -Filter 'ffmpeg.exe' | Select-Object -First 1
if (-not $bin) { throw 'ffmpeg.exe not found after extract' }
Add-Content -Path $env:GITHUB_PATH -Value $bin.Directory.FullName
& $bin.FullName -version
$probe = Join-Path $bin.Directory.FullName 'ffprobe.exe'
if (Test-Path $probe) { & $probe -version }
- name: Install ffmpeg (macOS)
if: startsWith(matrix.os, 'macos')
run: |
brew install ffmpeg
# Recent Homebrew ffmpeg bottles omit --enable-libwebp; cwebp covers
# screenshot WebP recoding when ffmpeg lacks that encoder.
brew install webp
ffmpeg -version
ffprobe -version
cwebp -version
- name: Install system dependencies (Linux, Chromium)
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'chromium'
run: |
sudo apt-get update
sudo apt-get install -y libgbm-dev xvfb
sudo apt-get install -y libgbm-dev xvfb ffmpeg webp
- name: Install system dependencies (Linux, WebKit)
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'webkit'
run: |
Expand All @@ -62,6 +150,8 @@ jobs:
# missing package means the browser will crash at runtime with an
# obscure dynamic-loader error.
sudo apt-get install -y \
ffmpeg \
webp \
gstreamer1.0-libav gstreamer1.0-plugins-bad gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
libatk-bridge2.0-0t64 libatk1.0-0t64 libatomic1 libavif16 libcairo-gobject2 libcairo2 \
libdbus-1-3 libdrm2 libenchant-2-2 libepoxy0 libevent-2.1-7t64 libflite1 \
Expand All @@ -84,18 +174,37 @@ jobs:
# No restore-keys fallback: we want a stale cache to be a clean miss
# rather than a partial restore that masks broken binaries.
- name: Create HTTPS certificate (Linux)
if: matrix.os == 'ubuntu-latest' && matrix.browser == 'chromium'
if: matrix.os == 'ubuntu-latest'
run: |
mkdir -p src/PlaywrightNative.TestServer
dotnet dev-certs https --clean
# PKCS12 with private key for Kestrel. Public DER alone makes the
# handshake abort (ERR_CONNECTION_CLOSED / TLS EOF).
dotnet dev-certs https -ep src/PlaywrightNative.TestServer/key.pfx -p playwright
dotnet dev-certs https -ep src/PlaywrightNative.TestServer/testCert.cer
sudo openssl x509 -inform der -in src/PlaywrightNative.TestServer/testCert.cer -out /usr/local/share/ca-certificates/testCert.crt -outform pem
sudo update-ca-certificates
# Do NOT install testCert into the system CA store. WebKit/libsoup
# trusts OS CAs, so a system-trusted "bad SSL" cert makes page.goto
# succeed and breaks ShouldFailWhenNavigatingToBadSsl /
# ignoreHTTPSErrors isolation (caughtException null). Chromium keeps
# its own root store and was unaffected. Tests that need HTTPS to
# succeed must use IgnoreHTTPSErrors (upstream parity).
- name: Create HTTPS certificate (Windows)
if: matrix.os == 'windows-latest'
shell: pwsh
run: |
dotnet dev-certs https --clean
# Export PKCS12 so SimpleServer.LoadHttpsCertificate can feed Kestrel a
# private key. Public-only testCert.cer / PEM rematerialization still
# yields ERR_CONNECTION_CLOSED on Windows runners.
New-Item -ItemType Directory -Force -Path src/PlaywrightNative.TestServer | Out-Null
dotnet dev-certs https -ep src/PlaywrightNative.TestServer/key.pfx -p playwright
dotnet dev-certs https -ep src/PlaywrightNative.TestServer/testCert.cer
- name: Create HTTPS certificate (macOS)
if: startsWith(matrix.os, 'macos')
run: |
mkdir -p src/PlaywrightNative.TestServer
dotnet dev-certs https --clean
dotnet dev-certs https -ep src/PlaywrightNative.TestServer/key.pfx -p playwright
dotnet dev-certs https -ep src/PlaywrightNative.TestServer/testCert.cer
- name: Check formatting
if: ${{ matrix.os == 'ubuntu-latest' && matrix.browser == 'chromium' && matrix.mode == 'headless' }}
Expand All @@ -106,7 +215,36 @@ jobs:
chmod +x ./.github/workflows/no-puppeteer.sh
./.github/workflows/no-puppeteer.sh
- name: Build
run: dotnet build ./src/PlaywrightNative.sln
run: dotnet build ./src/PlaywrightNative.sln -c Release
- name: Compute test shard filter
if: matrix.shardTotal
shell: bash
env:
# Git Bash's MSYS layer auto-converts any argument that looks like a
# POSIX path (e.g. "/ListFullyQualifiedTests") into a bogus Windows
# path before exec'ing a native tool. Disable that for this step.
MSYS_NO_PATHCONV: "1"
run: |
# List every test's fully-qualified name straight from the built
# assembly (dotnet test --list-tests only prints the bare method
# name, which collides across classes and isn't safe to filter on).
# $RUNNER_TEMP (not /tmp) so the path is already OS-native on Windows.
all_tests="$RUNNER_TEMP/all_tests.txt"
dotnet vstest src/PlaywrightNative.Tests/bin/Release/net10.0/PlaywrightNative.Tests.dll \
/ListFullyQualifiedTests "/ListTestsTargetPath:$all_tests"
# Drop the trailing ".MethodName" (and any TestCase "(...)" suffix)
# to get one entry per test class, then assign classes to shards by
# position in a stable sort -- deterministic across the shardTotal
# jobs of a single run without the shards needing to coordinate.
all_classes="$RUNNER_TEMP/all_classes.txt"
sed -E 's/\.[A-Za-z0-9_]+(\([^)]*\))?$//' "$all_tests" | sort -u > "$all_classes"
echo "Discovered $(wc -l < "$all_classes") test classes"
shard_classes="$RUNNER_TEMP/shard_classes.txt"
awk -v shard="${{ matrix.shardIndex }}" -v total="${{ matrix.shardTotal }}" \
'NR % total == (shard - 1) { print }' "$all_classes" > "$shard_classes"
echo "Shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}: $(wc -l < "$shard_classes") classes"
filter=$(awk '{ printf "%sFullyQualifiedName~%s.", (NR > 1 ? "|" : ""), $0 }' "$shard_classes")
echo "TEST_FILTER=$filter" >> "$GITHUB_ENV"
Comment on lines +227 to +247

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can move this to a bash file

- name: Disable AppArmor (Linux)
if: matrix.os == 'ubuntu-latest'
run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns || true
Expand All @@ -115,29 +253,37 @@ jobs:
env:
PRODUCT: CHROMIUM
run: |
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -c Release -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings
- name: Test (Chromium, Linux headful)
if: ${{ matrix.browser == 'chromium' && matrix.os == 'ubuntu-latest' && matrix.mode == 'headful' }}
env:
PRODUCT: CHROMIUM
HEADLESS: "false"
run: |
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- \
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -c Release -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings
- name: Test (Chromium, Windows)
if: ${{ matrix.browser == 'chromium' && matrix.os == 'windows-latest' }}
shell: bash
env:
PRODUCT: CHROMIUM
HEADLESS: ${{ matrix.mode == 'headless' && 'true' || 'false' }}
run: |
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -c Release -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings ${TEST_FILTER:+--filter "$TEST_FILTER"}
- name: Test (WebKit)
if: matrix.browser == 'webkit'
shell: bash
env:
PRODUCT: WEBKIT
run: |
# Raise the soft FD limit. Failed tests dispose+relaunch the worker
# browser; without enough headroom, macOS runners hit EMFILE mid-suite
# even after pipe/transport disposal fixes.
ulimit -n 65536 || true
# Known-failing tests on WebKit are marked in PlaywrightNative.Nunit's
# TestExpectations.local.json (browser+platform+mode aware). The JSON
# currently covers WK feature gaps (ExposeFunction, AddInitScript,
# AddScriptTag/AddStyleTag, EmulateMedia, PDF, screenshots, SetContent,
# SetViewportSize) and the macOS-14 inner-target hang. Retire entries
# as the underlying work lands.
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings
dotnet test ./src/PlaywrightNative.Tests/PlaywrightNative.Tests.csproj --no-build -c Release -f net10.0 -s src/PlaywrightNative.Tests/test.runsettings ${TEST_FILTER:+--filter "$TEST_FILTER"}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ ClientBin/
*.dbproj.schemaview
*.jfm
*.pfx
!src/PlaywrightNative.Tests/Assets/**/*.pfx
*.publishsettings
orleans.codegen.cs

Expand Down
39 changes: 35 additions & 4 deletions src/PlaywrightNative.NUnit/BrowserExecutable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public static class BrowserExecutable
private static bool _chromiumResolved;
private static bool _webkitResolved;
private static bool _firefoxResolved;
private static bool _ffmpegResolved;

/// <summary>
/// Gets the resolved Chromium executable path, or <c>null</c> when unavailable.
Expand All @@ -62,12 +63,20 @@ public static class BrowserExecutable
public static string FirefoxExecutablePath { get; private set; }

/// <summary>
/// Ensures Chromium is resolved, and WebKit/Firefox when <c>PRODUCT</c>/<c>BROWSER</c>
/// selects them.
/// Gets the resolved ffmpeg executable path, or <c>null</c> when unavailable.
/// </summary>
public static string FfmpegExecutablePath { get; private set; }

/// <summary>
/// Ensures Chromium and ffmpeg are resolved, and WebKit/Firefox when
/// <c>PRODUCT</c>/<c>BROWSER</c> selects them. ffmpeg is fetched unconditionally
/// (official installs it by default alongside every browser) so WebP/screencast
/// helpers can find it via <see cref="Helpers.FfmpegLocator"/> regardless of product.
/// </summary>
public static async Task EnsureCurrentProductAsync()
{
await EnsureAsync("chromium").ConfigureAwait(false);
await EnsureAsync("ffmpeg").ConfigureAwait(false);

string browserName = ResolveBrowserName();
if (browserName == "webkit")
Expand Down Expand Up @@ -112,6 +121,16 @@ public static async Task EnsureAsync(string browserName)
_webkitResolved = true;
}

break;
case "ffmpeg":
if (!_ffmpegResolved)
{
FfmpegExecutablePath = await ResolveBrowserAsync(
SupportedBrowser.Ffmpeg,
"PLAYWRIGHT_FFMPEG_PATH").ConfigureAwait(false);
_ffmpegResolved = true;
}

break;
default:
if (!_chromiumResolved)
Expand Down Expand Up @@ -170,7 +189,11 @@ public static async Task<BrowserTypeLaunchOptions> CreateLaunchOptionsAsync(stri
Assert.Ignore($"{label} executable not available (download skipped or failed).");
}

return new BrowserTypeLaunchOptions { ExecutablePath = path };
bool headless = !string.Equals(
Environment.GetEnvironmentVariable("HEADLESS"),
"false",
StringComparison.OrdinalIgnoreCase);
return new BrowserTypeLaunchOptions { ExecutablePath = path, Headless = headless };
}

/// <summary>
Expand Down Expand Up @@ -229,9 +252,12 @@ private static async Task<string> ResolveBrowserAsync(SupportedBrowser browser,
return downloadedPath;
}
}
catch
catch (Exception ex)
{
// Network unreachable, archive corrupt, or extraction failed.
// Surface the reason so CI logs explain skipped browser tests.
TestContext.Progress.WriteLine(
$"BrowserExecutable: failed to download {browser}: {ex.Message}");
}

return null;
Expand Down Expand Up @@ -260,6 +286,11 @@ public class BrowserExecutableFixture
/// </summary>
public static string FirefoxExecutablePath => BrowserExecutable.FirefoxExecutablePath;

/// <summary>
/// Gets <see cref="BrowserExecutable.FfmpegExecutablePath"/>.
/// </summary>
public static string FfmpegExecutablePath => BrowserExecutable.FfmpegExecutablePath;

/// <summary>
/// Prefetches browsers for the current product.
/// </summary>
Expand Down
14 changes: 13 additions & 1 deletion src/PlaywrightNative.NUnit/BrowserService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,17 @@ private static async Task<IBrowser> CreateBrowserAsync(string browserName, Brows

public Task ResetAsync() => Task.CompletedTask;

public Task DisposeAsync() => Browser.CloseAsync();
public async Task DisposeAsync()
{
// Prefer full disposal so pipe transports / process handles are released.
// CloseAsync alone historically left AnonymousPipeServerStream FDs open,
// and WorkerAwareTest disposes the browser after every failed test.
if (Browser is IAsyncDisposable asyncDisposable)
{
await asyncDisposable.DisposeAsync().ConfigureAwait(false);
return;
}

await Browser.CloseAsync().ConfigureAwait(false);
}
}
Loading
Loading