fix(webdriver): replace text in the confirmed focused element
Summary
Addresses #3985 across 11 files. WebDriver fill clears/replaces the confirmed focused element; empty fill clears, failed clear stops input, and type stays append-only. Missing references refuse. No e2e freshness changes.
Workflow
flowchart LR
F[fill] --> R[Confirm focused element]
R --> C[Clear same element]
C -->|failure| E[Error]
C -->|nonempty| V[Replace same element]
C -->|empty| D[Done]
T[type] --> A[Append]
Validation
Head: 13d32dacb8f42338acd453bc978bc1bd6f2ac672; base: 21f3f50a90f21bf8f994e742cbb7dd295f255d6c.
- Five regressions: base 4 failed/1 passed; head 5 passed.
- 102 unit + 17 loopback passed.
- Exact-head affected: format/lint/types/layering/Fallow/build passed; related 2005 passed/2 failed, versus base 1993/2 (same Apple fake-record/Android fake-log failures). Gate failed; docs passed.
- Cubic clean; CI awaits maintainer approval.
Hosted proof — unmodified head
Public Swag Labs 2.7.1, native My Demo App 2.3.0 (iOS/Android) and Selenium fixtures; dummy data.
iPhone17/iOS26.6 and GalaxyS25/Android15: native replacement/repeat/empty, existing secure replacement and neighbor isolation passed. Fixture login confirmed exact secure text. Plain WebView replacement/repeat/empty also passed.
Existing SDK wait stable 1000 10000 used; text-entry budgets unchanged. Native: 8 clear/7 value each; WebView positives: 4/3, excluding URL setup/negative attempts. Same confirmed IDs, HTTP 200, zero session POST /keys; empty sent no value.
Normalized iOS UTC excerpt, 2026-10-27 (intervening reads omitted):
20:29:24.405 GET /element/active -> A
20:29:25.637 POST /actions
20:29:27.036 GET /element/active -> A
20:29:27.814 POST /element/A/clear
20:29:28.453 POST /element/A/value "new"
20:29:31.509 AX="new"
Unproven: real rejected-clear (readonly returned 200); WebView password blocked by focus-read deadlines. Earlier iOS readonly/zoom mis-target remains. All 12 sessions closed.