#34870·cypress

Spike (Parent): inventory of WebKit test gaps blocking GA for `experimentalWebKitSupport`

Author: AtofStrykerCreated Sep 17, 2026Updated Sep 17, 2026
Labelsbrowser: webkitexperiment: webkit

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, isWebKit early return, and TODO/FIXME(webkit) comment in packages/driver/cypress/e2e/** and system-tests/test/** (plus fixture specs under system-tests/projects/e2e/).
  • Every open issue labeled experiment: webkit or browser: 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 / firefox with 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 occurred against an HTTPS baseUrl through the proxy
  • #26847 — read ECONNRESET running WebKit in Docker against /etc/hosts names
  • #27394 — .dev TLD in baseUrl renders a blank page (HSTS preload)
  • #26106 — IndexedDB unusable because WebKit launches in a non-persistent context
  • #24815 — cy.selectFile() fails on dataTransfer.items.add
  • #27046 — no way to pass launch args or set window size (hardcoded 1280x720)
  • #24372 — cypress open hangs 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:9origin/**, 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-listexperimental_csp_allow_list_spec.ts:47,60,73 (~5 tests). Experimental feature; not a GA gate.
  • Experimental retriesexperimental_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 designe2e/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.prompt not rolled out to WebKit), streamed_response_bodies_spec.js:60 (CDP Fetch only), component_testing_spec.ts:180 (999_final excluded 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 --spec the 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