Spike (Parent): inventory of WebKit test gaps blocking GA for `experimentalWebKitSupport`
Summary
Before experimentalWebKitSupport can leave experimental, we need to know what's actually broken. Today that knowledge lives in ~200 TODO(webkit) / browser: '!webkit' markers across the driver and system-test suites, almost none of which link to an issue. This issue is the inventory of those markers, grouped into work items. It is the parent for a series of smaller spikes: each work item below gets its own spike issue when we pick it up, and its result (fix, document as unsupported, or drop) gets recorded back here.
cy.origin() already has its spike: #34869. It is by far the largest item (83% of skipped driver tests) and is not re-inventoried here.
Related: #23799 (the user-facing cy.origin() request), #23939 (the 2022 GA epic, empty), #30816 (injectDocumentDomain removal, blocked on WebKit).
How this was gathered
- Every
browser: '!webkit',Cypress.isBrowser('webkit')guard,isWebKitearly return, andTODO/FIXME(webkit)comment inpackages/driver/cypress/e2e/**andsystem-tests/test/**(plus fixture specs undersystem-tests/projects/e2e/). - Every open issue labeled
experiment: webkitorbrowser: webkit, plus the state of every issue cited in a skip comment. - The CircleCI job definitions for the WebKit driver and system-test jobs.
Counts are approximate it() tests.
Totals
| Files with skips | Skip sites | Tests skipped | |
|---|---|---|---|
packages/driver |
72 | 140 | ~810 of ~5,000 (~16%), plus ~26 that run with weakened assertions |
system-tests |
27 | ~61 | ~75 |
- ~671 of the 810 driver tests are
cy.origin()(#34869). - ~96 of 140 driver skip sites and 59 of 61 system-test skip sites cite no issue.
- Four issues that are cited in skip comments were closed by the stale bot, not fixed, while their skips remain live: #24600, #26438, #29446, #20973.
- 30 system-test files are pinned to
chrome/electron/firefoxwith no WebKit mention. WebKit is a default browser in the harness (system-tests/lib/normalizeStdout.ts:7), so these are silent exclusions rather than TODOs. Some are legitimately browser-specific; none say so.
Work items
Each row is a candidate child spike. "Tracking" is an issue that explains why WebKit is skipped; a link that only describes the test itself doesn't count.
| # | Work item | Driver | System tests | Why (from the comments) | Tracking |
|---|---|---|---|---|---|
| 1 | cy.origin() |
56 hard skips, ~670 tests | 8 tests | cy.origin() is not currently supported in experimental WebKit |
#34869 |
| 2 | Cookies | 21 early-returns in commands/cookies.cy.js (tests report green while asserting nothing); WebKit 26 sameSite differs by OS (cookies.cy.js:1397) |
~17 tests in cookies_spec.ts:200-502, page_loading_spec.js:81 |
Half is cy.origin() fallout. The rest: FIXME: cookies aren't cleared properly in headless mode with webkit between tests (origin/cookie_misc.cy.ts:4); related to document.cookie issue? |
none |
| 3 | Navigation / page load | ~39 tests: commands/navigation.cy.js:1911 (#page load), :2312 (#url:changed), issues/1244.cy.js:25 (only 4 of 12 fail), issues/base_target.cy.ts:5, cy/timers.cy.js:416 |
visit_spec.js:135,228, web_security_spec.js:76, form_submissions_spec.js:150,160 (webkit is 404ing on redirects after the form submit on the default clientRoute /__/) |
TODO(webkit): fix+unskip for webkit release |
none |
| 4 | Flaky navigation / pause | 6 tests in commands/navigation.cy.js (:824,2179,2196,2223,2247,2775) |
pause_headed_exit_spec.ts (4), projects/e2e/.../pause.cy.js |
FIXME: fix flaky test (webkit) |
#24600 (stale-closed 2023), #31503 |
| 5 | cy.type() / keyboard events |
~53 tests: actions/press.cy.ts (whole file), type_events.cy.ts:98,601,615, type.cy.ts:1988,3203-3465 (date/month/week/time/datetime-local/range inputs), type_special_chars.cy.ts:1798, e2e/text_mask.cy.js, e2e/react-16.cy.ts, e2e/react-19.cy.ts, issues/7170.cy.js |
— | Webkit is not supported; In Playwright Webkit implementation, these are shown as plain text input; fix+unskip for webkit release |
#31054 (open umbrella, criteria TBD); #26438 (stale-closed 2024); upstream bugs.webkit.org 170416, 244206 |
| 6 | Stack traces / error UI / sourcemaps | ~7 full + 4 partial: cypress/cy.cy.js:117,128,179, cypress/error_utils.cy.ts:385,612, commands/removed_commands.cy.ts:197, sessions/sessions.cy.ts:1807-1870 (codeFrame) |
sourcemaps_spec.ts:7,14,21 (no comment), error_ui_spec.ts:26,38, screenshots_spec.js:64 |
Webkit does not have correct stack traces on errors currently |
none; upstream bugs.webkit.org 86493 / 243668 / 174380 cited in packages/driver/src/cypress/stack_utils.ts:496 |
| 7 | Network / intercept | net_stubbing.cy.ts:382 (cross-origin sync XHR, no comment), :2957,3854 (fails in WK because cache is disabled), cypress/proxy-logging.cy.ts:53 |
xhr_spec.js:45,51, request_spec.ts:171, websockets_spec.js:40, server_sent_events_spec.js:70, projects/e2e/.../proxy_correlation.cy.js:52 |
TODO(webkit): fix+unskip |
#28079 (service-worker correlation, open). HTTP/2 for WebKit is a separate track: #33857 / #34298 |
| 8 | before:browser:launch |
— | deprecated_spec.ts:9,27,45, before_browser_launch_spec.ts:29 |
add executeBeforeBrowserLaunch to WebKit; or skip and add a test that this fails with WebKit |
none. Decision needed: implement, or document as unsupported and test the error |
| 9 | Downloads | cypress/downloads.cy.ts:98, downloads_basic_auth.cy.ts:17 |
downloads_spec.ts:28 |
webkit opens a new window and doesn't download the file; implement downloads support |
none |
| 10 | Video / screenshot flake | — | video_compression_spec.ts:62 and component_testing_spec.ts:188 both set this.retries(15) for WebKit; screenshot_viewport_capture_spec.js:24 raises the timeout to 180s |
fix video recording flake in webkit; WebKit is the slowest browser at producing them |
#23815 fixed the recording bug (2026-06); the retry shields are still masking live flake |
| 11 | Scrolling / actionability | actions/check.cy.ts:243 (sticky header), actions/selectFile.cy.ts:718,758 (scroll, scrollBehavior), e2e/dom_hitbox.cy.ts:16 (~8) |
— | fix+unskip for experimental webkit |
#4233 (general); #32031 open: the scaffolded 2-advanced-examples/actions.cy.js .click() test fails on WebKit 14.5.2 through 16.0.0 |
| 12 | Focus / blur | e2e/focus_blur.cy.js:517 (~12, intercepting blur methods) |
— | fix+unskip for webkit release |
none |
| 13 | navigator.webdriver |
issues/27939.cy.js:5 |
— | Webkit should have this set |
#29446 (stale-closed 2024) |
| 14 | No rationale recorded | issues/issue 30933.cy.js:2, issues/issue—31034.cy.js:2 (both selectFile filename tests), type.cy.ts:3203,3465 |
sourcemaps_spec.ts (3) |
(no comment) | none. Triage first: these may be one-line unskips or belong in a row above |
User-reported gaps with no test coverage
These are open WebKit-labeled issues with no corresponding skipped test. A skip count never surfaces them.
- #24896 — specs hang in parallelized CI (32 comments, open since 2022)
- #25840 —
page.goto: An SSL error has occurredagainst an HTTPSbaseUrlthrough the proxy - #26847 —
read ECONNRESETrunning WebKit in Docker against/etc/hostsnames - #27394 —
.devTLD inbaseUrlrenders a blank page (HSTS preload) - #26106 — IndexedDB unusable because WebKit launches in a non-persistent context
- #24815 —
cy.selectFile()fails ondataTransfer.items.add - #27046 — no way to pass launch args or set window size (hardcoded 1280x720)
- #24372 —
cypress openhangs silently when Playwright refuses to run WebKit on an unsupported macOS - #28895 — Test Replay support (separate GA dependency, not a test gap)
CI coverage finding: the WebKit driver job runs ~6.5% of the suite
The internal WebKit driver job is the inject-document-domain variant (.circleci/src/pipeline/@pipeline.yml:2677: "inject document domain must be true for webkit, as cy.origin is not supported"). With no --spec passed on the internal/record path, it inherits the specPattern from packages/driver/cypress.config-injectDocumentDomain.ts:9 — origin/**, cookies.cy.*, net_stubbing.cy.*. That narrowing was introduced in #30770 (Jan 2025) as a targeted supplement for the Chrome inject-document-domain job; for WebKit it is the only job, so it became the whole suite.
Measured on develop, pipeline 86540 (2026-09-17):
| WebKit — job 3995016 | Firefox — job 3995018 | |
|---|---|---|
| Spec files launched | 43 | 211 |
| Tests | 1,104 | 5,984 |
| Passing | 386 | 5,856 |
| Pending | 718 | 128 |
The 386 that execute are commands/cookies.cy.js (130, of which 21 early-return on WebKit), commands/net_stubbing.cy.ts (255), and one ungated test in origin/commands/misc.cy.ts. Every other origin/ spec loads and reports 100% pending. The remaining 168 spec files — commands/navigation.cy.js, type.cy.ts, press.cy.ts, focus_blur.cy.js, all of issues/ — are never loaded, so their TODO(webkit) skips don't even show up as pending, and unskipping a test in any of them has no CI effect on WebKit until the job's spec selection changes.
External-contributor PRs take the non-record branch and pass --spec from the full cypress/e2e/** glob, so they get more WebKit coverage than our own PRs do.
The system-tests WebKit job (@pipeline.yml:2433) is a full run on every PR and a required check, so that side is fine.
This is a config fix, not a spike: add a plain driver-integration-tests-webkit job over the full glob (same shape as the Firefox job), or pass an explicit full-suite --spec to the existing one. It is first in the list below because every other row's "is this still broken?" check depends on it, and because a full-suite run will likely surface WebKit failures in currently-unguarded tests that nobody has run on WebKit since January 2025.
Out of scope for GA
- Experimental CSP allow-list —
experimental_csp_allow_list_spec.ts:47,60,73(~5 tests). Experimental feature; not a GA gate. - Experimental retries —
experimental_retries.spec.ts(all 14 tests, no comments). Experimental feature; not a GA gate. - HTTP/2 native network path — #33857 / #34298, its own program.
- Permanent by design —
e2e/webcam.cy.js(no fake webcam in playwright-webkit; microsoft/playwright#2973 closed 2026-07, worth a recheck),memory/memory.cy.ts(chromium-only),prompt/prompt.cy.ts(cy.promptnot rolled out to WebKit),streamed_response_bodies_spec.js:60(CDP Fetch only),component_testing_spec.ts:180(999_finalexcluded intentionally per #23815). - iOS Safari — everything here is desktop WebKit via
playwright-webkit.
Child spikes
Check off as each is filed and link it. Order is a rough guess at value; adjust as we go.
- Task (not a spike): add a full-suite WebKit driver job, or
--specthe existing one; triage whatever it surfaces -
cy.origin()— #34869 - Cookies — #34873
- Navigation / page load — #34871
- Scrolling / actionability — #34872 (#32031 first — it's the stock example)
-
cy.type()/ keyboard events (#31054) - Stack traces / error UI / sourcemaps
- Network / intercept
- Flaky navigation / pause (reopen or re-file #24600)
- Focus / blur
- Downloads
- Video / screenshot flake
-
before:browser:launch— implement or document -
navigator.webdriver(re-file #29446) - Triage the no-rationale skips
- Triage the 30 silently browser-pinned system-test files
- User-reported gaps with no coverage (list above) — decide which need tests vs. fixes vs. docs
Source: cypress-io/cypress