iOS: private-AX snapshot drops focused for a keyboard-focused text input (bridge reads only hasFocus)

Fermée Adaptée aux débutants
#4,112 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Une pull request liée a déjà été fusionnée.

  • #4154 par @thymikee — fusionnée

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
74/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
ios, objective-c
Domaine
mobile-dev, testing

Piste de recherche

Commencez dans RunnerAXSnapshotBridge.m, au niveau de dictionaryForSnapshot: vers la ligne 730, et comparez son association de focused au comportement de focusBool décrit dans l’issue. Confirmez que la modification fait en sorte que les instantanés private-AX signalent comme focalisé un champ de saisie texte ayant le focus clavier, puis vérifiez que le focus signalé correspond au producteur XCTest.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

bug ready-for-agent

What happens

On an iOS simulator, focused flips to false for a focused text input whenever the snapshot comes from the runner's private-AX backend. The field is being edited: the keyboard is visible and the selection grabbers are in the tree. But is focused / toBeFocused keeps failing until the backend switches back.

Cause

RunnerAXSnapshotBridge.m dictionaryForSnapshot: sets focused only from hasFocus:

result[@"focused"] = [self boolNumberForKey:@"hasFocus" snapshot:snapshot defaultValue:NO];

#2925 changed the XCTest producers (focusBool) to hasKeyboardFocus || hasFocus. The private-AX producer was left on hasFocus. A text input under the software keyboard holds hasKeyboardFocus, not hasFocus. #3163 fixed the same gap in the host-side snapshot-source/tree.ts decoder, but the runner's Objective-C bridge still has it on main (line 730).

The bug only shows when the XCTest channel is penalized. One queries_backend_timeout sends every snapshot to private-ax for snapshotXCTestChannelPenaltyDuration (120 s). A focus assertion that lands inside that window fails every poll. Outside it, the tree backend answers correctly. On a busy React Native screen this makes the failure intermittent.

Evidence (0.21.28, iOS 27.0 simulator, Xcode 27.1)

I instrumented both producers to log the raw KVC values for the composer textbox on every snapshot, then ran one chat thread-reply test 20 times:

backend hasFocus hasKeyboardFocus snapshot focused
xctest (tree) 0 1 true
private-ax 0 1 absent
  • 4 of 20 runs failed toBeFocused. Each failure started right after SNAPSHOT_XCTEST_CHANNEL_PENALIZED reason=queries_backend_timeout, and every snapshot in the failing window was PRIVATE_AX_SNAPSHOT_USED.
  • With the private-AX snapshot, [snapshot valueForKey:@"hasKeyboardFocus"] returns 1 on the focused field.
  • After changing that one line to hasKeyboardFocus || hasFocus, the same test passed 20/20, with the private-AX backend serving 200+ snapshots in every run.

Fix

result[@"focused"] = @([[self boolNumberForKey:@"hasKeyboardFocus" snapshot:snapshot defaultValue:NO] boolValue]
                       || [[self boolNumberForKey:@"hasFocus" snapshot:snapshot defaultValue:NO] boolValue]);

This matches focusBool, so both producers report the same focused for the same element. We carry it as a bun patch on 0.21.28 until a release ships it.

Related: #4110 (we drive the same patched runner remotely).

Langage dominant
TypeScript
Étoiles
5.3k
Forks
377
Merge moyen
13 h 18 min
PR mergées (30 j)
653

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de callstack/agent-device

Toutes les issues de callstack/agent-device

Issues similaires

Plus d'issues TypeScript

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.