@@ -5,7 +5,6 @@ import type { SnapshotState } from '../../utils/snapshot.ts';
55import { sleep } from '../../utils/timeouts.ts' ;
66import {
77 captureMaestroRawSnapshot ,
8- dismissReactNativeOverlayIfPresent ,
98 errorResponse ,
109 rememberMaestroVisibleContext ,
1110 readSnapshotState ,
@@ -70,11 +69,7 @@ async function invokeNativeMaestroVisibleWait(
7069 nativeWaitQuery : string ,
7170) : Promise < DaemonResponse > {
7271 const nativeStartedAt = Date . now ( ) ;
73- let nativeResponse = await runNativeVisibleWait ( params , args , nativeWaitQuery ) ;
74- if ( ! nativeResponse . ok && shouldRetryNativeWaitAfterOverlayDismiss ( nativeResponse ) ) {
75- const overlayResponse = await dismissReactNativeOverlayIfPresent ( params ) ;
76- if ( overlayResponse ) nativeResponse = await runNativeVisibleWait ( params , args , nativeWaitQuery ) ;
77- }
72+ const nativeResponse = await runNativeVisibleWait ( params , args , nativeWaitQuery ) ;
7873 if ( ! nativeResponse . ok ) return nativeResponse ;
7974 return visibleAssertionResponse (
8075 {
@@ -120,20 +115,12 @@ async function invokeSnapshotMaestroAssertVisible(
120115 const deadlineMs = args . timeoutMs + MAESTRO_ASSERTION_POLICY . assertVisibleGraceMs ;
121116 let lastResponse : DaemonResponse | undefined ;
122117 let capturedAfterDeadline = false ;
123- let dismissedOverlay = false ;
124118 while ( true ) {
125119 const captureStartedAt = Date . now ( ) ;
126120 const sample = await readMaestroVisibilitySample ( params , args . selector , 'assertVisible' ) ;
127121 if ( sample . visible ) return visibleAssertionResponse ( sample . response , args . selector , startedAt ) ;
128122 lastResponse = sample . response ;
129- const failedSample = await handleFailedVisibleSample ( params , args , sample , {
130- dismissedOverlay,
131- startedAt,
132- } ) ;
133- if ( failedSample . kind === 'retry-after-overlay-dismiss' ) {
134- dismissedOverlay = true ;
135- continue ;
136- }
123+ const failedSample = handleFailedVisibleSample ( params . baseReq , args , sample , startedAt ) ;
137124 if ( failedSample . kind === 'return' ) return failedSample . response ;
138125
139126 const deadline = readVisibleAssertionDeadlineAction ( {
@@ -159,30 +146,21 @@ async function invokeSnapshotMaestroAssertVisible(
159146 ) ;
160147}
161148
162- async function handleFailedVisibleSample (
163- params : {
164- baseReq : ReplayBaseRequest ;
165- invoke : MaestroRuntimeInvoke ;
166- } ,
149+ function handleFailedVisibleSample (
150+ baseReq : ReplayBaseRequest ,
167151 args : MaestroVisibilityAssertionArgs ,
168152 sample : Exclude < MaestroVisibilitySample , { visible : true } > ,
169- state : { dismissedOverlay : boolean ; startedAt : number } ,
170- ) : Promise <
153+ startedAt : number ,
154+ ) :
171155 | { kind : 'continue' }
172- | { kind : 'retry-after-overlay-dismiss' }
173- | { kind : 'return' ; response : DaemonResponse }
174- > {
175- const overlayRetry = await maybeDismissOverlayAfterSnapshotFailure (
176- params ,
177- sample . response ,
178- state . dismissedOverlay ,
179- ) ;
180- if ( overlayRetry === 'dismissed' ) return { kind : 'retry-after-overlay-dismiss' } ;
181- if ( overlayRetry === 'blocked' ) return { kind : 'return' , response : sample . response } ;
182- if ( shouldPassAlreadyPastLoading ( params . baseReq , args . selector , sample . snapshot ) ) {
156+ | { kind : 'return' ; response : DaemonResponse } {
157+ if ( isReactNativeOverlayBlockingAssertion ( sample . response ) ) {
158+ return { kind : 'return' , response : sample . response } ;
159+ }
160+ if ( shouldPassAlreadyPastLoading ( baseReq , args . selector , sample . snapshot ) ) {
183161 return {
184162 kind : 'return' ,
185- response : alreadyPastLoadingResponse ( args . selector , args . timeoutMs , state . startedAt ) ,
163+ response : alreadyPastLoadingResponse ( args . selector , args . timeoutMs , startedAt ) ,
186164 } ;
187165 }
188166 return { kind : 'continue' } ;
@@ -218,31 +196,7 @@ function readVisibleAssertionDeadlineAction(params: {
218196 : 'finish' ;
219197}
220198
221- async function maybeDismissOverlayAfterSnapshotFailure (
222- params : {
223- baseReq : ReplayBaseRequest ;
224- invoke : MaestroRuntimeInvoke ;
225- } ,
226- response : DaemonResponse ,
227- dismissedOverlay : boolean ,
228- ) : Promise < 'dismissed' | 'blocked' | 'none' > {
229- if ( dismissedOverlay || ! shouldRetrySnapshotAssertionAfterOverlayDismiss ( response ) ) {
230- return 'none' ;
231- }
232- const overlayResponse = await dismissReactNativeOverlayIfPresent ( params ) ;
233- return overlayResponse ? 'dismissed' : 'blocked' ;
234- }
235-
236- function shouldRetryNativeWaitAfterOverlayDismiss ( response : DaemonResponse ) : boolean {
237- return (
238- ! response . ok &&
239- response . error . code === 'COMMAND_FAILED' &&
240- ( response . error . message . includes ( 'Current surface:' ) ||
241- response . error . message . includes ( 'React Native overlay' ) )
242- ) ;
243- }
244-
245- function shouldRetrySnapshotAssertionAfterOverlayDismiss ( response : DaemonResponse ) : boolean {
199+ function isReactNativeOverlayBlockingAssertion ( response : DaemonResponse ) : boolean {
246200 return (
247201 ! response . ok &&
248202 response . error . code === 'COMMAND_FAILED' &&
0 commit comments