Repository navigation
Conversation
A long press used XCTest's coordinate press, which resolves the app frame through the accessibility tree. On a tree XCTest cannot serialize (the heavy-feed fixture, Bluesky's feed) that read retried for ~16 s, then the press raised "point.x != INFINITY", which ended the runner test. The next command found the runner gone: its readiness preflight failed and the runner restarted, or its reply was lost while the runner exited. On iOS the longPress command and press-series longPress steps now synthesize one stationary contact held for the duration, through the same coordinate context as a synthesized tap, including the sole-screen route. The XCTest press stays as the fallback only while the tree answers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A swipe asks the runner for the gesture viewport before it plans its path. The viewport read the app window or app.frame, and on a tree XCTest cannot serialize both fail, so every swipe failed with "Active app interaction viewport is unavailable" even though the planned gesture itself is synthesized without the tree. On iOS the viewport now follows the synthesized coordinate context: the resolved window, or, when none resolves on an iPhone with one screen, that screen in the app's orientation. iPad and multi-screen devices still require a window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A press series read the app frame and the windows query for its first step's touch frame before any step ran. On a tree XCTest cannot serialize each of those reads costs about 2 s of XCTest retries, and now that held presses run as synthesized sequence steps that cost came before every hold. A sequence with a synthesized context reads the frame from that context, as the single longPress command does. The long-press test now also pins zero frame reads and the held duration of each synthesized hold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Size Report
Startup median (7 runs, lower is better):
|
|
I reviewed 521e511 and I do not think this is ready to merge yet. Long presses on every iPhone and iPad screen now go through the synthesized route, and I could not confirm that route still triggers a long-press handler. On iOS, every Not blocking, and fine to take or leave: The failing Lint, Typecheck & Package job reports I did not run the runner suite or a device, so the live medians and the 463-test pass come from the PR body. The new regression tests only discriminate on a single-screen iPhone simulator, because on iPad both base and head take the else branch. |
…tures Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The window, then sole screen, then nothing ladder lives in synthesizedCoordinateContext; the viewport now reads its frame instead of repeating the ladder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks. Answers point by point at Blocking: does the synthesized hold fire long-press handlers?Yes. I ran these live through the CLI on my own iPhone 17 Pro simulator (iOS 27.0). The runner was built from this branch. The test app was a Release build with main's JS repacked in. Every press logged (a) Normal tree: the automation lab's
The hold lasts the requested time, not just one dispatch. Native UIKit. In Safari, (b) Heavy feed (
The synthesis triggered every recognizer I tried, so I did not change it. I did not add a recognizer-level test. The runner host app ( One side note: Non-blocking
Validation
|
Summary
On deep React Native trees (heavy-feed fixture #3884, Bluesky), these iOS gestures failed after #3870:
longpressused XCTest's coordinate press. It retriedkAXErrorIllegalArgumentfor about 16 s, then threwpoint.x != INFINITY, which ended the runner test. On iOS,longPressand press-series hold steps are now synthesized like a tap. While the tree answers, XCTest's press is still the fallback.swipefailed with "Active app interaction viewport is unavailable".gestureViewportnow uses the synthesized context: the resolved window, or the sole screen on a one-screen iPhone.scrollcame from the runner thatlongpresskilled.6 runner Swift files, no wire fields.
Validation
Head
9f5cbc9ebd(main5f6dfb3e6fmerged).kind=coordinateLongPress … fallbackAttempted=falseand showed the effect in a snapshot. Covered: the automation-lab long-press canary (ref, x/y, selector, 2-stepsequence), the heavy feed (held post N), and a Safari Tabs UIKit context menu. Holds of 200/350 ms acted as taps; 650/1000 ms fired the long press. Details: fix(ios): synthesize long presses and the gesture viewport on deep trees #3893 (comment)9935ef51c2vs844842171b, 3 rounds:longpress3/3 fail → 2197 ms;scroll down12808 → 924 ms;swipe3/3 fail → 1093 ms.check:xctest-selectionpassed.check:affected --run --head 9f5cbc9ebdpassed (exactCommit: true).Open: on iPad deep trees, long press still falls back to XCTest's press.
backon the heavy feed is fixed in #3894.🤖 Generated with Claude Code