@@ -17,28 +17,28 @@ declare let self: typeof globalThis & {
17
17
*/
18
18
export const injectIntoServiceWorker = ( body : Buffer ) => {
19
19
function __cypressInjectIntoServiceWorker ( ) {
20
- let _listenerCount = 0
21
- let _eventQueue : ServiceWorkerClientEvent [ ] = [ ]
22
- const _nonCaptureListenersMap = new WeakMap < EventListenerOrEventListenerObject , EventListenerOrEventListenerObject > ( )
23
- const _captureListenersMap = new WeakMap < EventListenerOrEventListenerObject , EventListenerOrEventListenerObject > ( )
24
- const _targetToWrappedHandleEventMap = new WeakMap < Object , EventListenerOrEventListenerObject > ( )
25
- const _targetToOrigHandleEventMap = new WeakMap < Object , EventListenerOrEventListenerObject > ( )
20
+ let listenerCount = 0
21
+ let eventQueue : ServiceWorkerClientEvent [ ] = [ ]
22
+ const nonCaptureListenersMap = new WeakMap < EventListenerOrEventListenerObject , EventListenerOrEventListenerObject > ( )
23
+ const captureListenersMap = new WeakMap < EventListenerOrEventListenerObject , EventListenerOrEventListenerObject > ( )
24
+ const targetToWrappedHandleEventMap = new WeakMap < Object , EventListenerOrEventListenerObject > ( )
25
+ const targetToOrigHandleEventMap = new WeakMap < Object , EventListenerOrEventListenerObject > ( )
26
26
27
27
const sendEvent = ( event : ServiceWorkerClientEvent ) => {
28
28
// if the binding has been created, we can call it
29
29
// otherwise, we need to queue the event
30
30
if ( self . __cypressServiceWorkerClientEvent ) {
31
31
self . __cypressServiceWorkerClientEvent ( JSON . stringify ( event ) )
32
32
} else {
33
- _eventQueue . push ( event )
33
+ eventQueue . push ( event )
34
34
}
35
35
}
36
36
37
37
const __cypressServiceWorkerSendHasFetchEventHandlers = ( ) => {
38
38
// @ts -expect-error __cypressScriptEvaluated is declared below
39
39
// if the script has been evaluated, we can call the CDP binding to inform the backend whether or not the service worker has a handler
40
40
if ( __cypressScriptEvaluated ) {
41
- sendEvent ( { type : 'hasHandlersEvent' , payload : { hasHandlers : ! ! ( _listenerCount > 0 || self . onfetch ) } } )
41
+ sendEvent ( { type : 'hasHandlersEvent' , payload : { hasHandlers : ! ! ( listenerCount > 0 || self . onfetch ) } } )
42
42
}
43
43
}
44
44
@@ -86,7 +86,7 @@ export const injectIntoServiceWorker = (body: Buffer) => {
86
86
self . addEventListener = ( type : string , listener : EventListenerOrEventListenerObject , options ?: boolean | AddEventListenerOptions ) => {
87
87
if ( type === 'fetch' && isValidListener ( listener ) && ! isAborted ( options ) ) {
88
88
const capture = getCaptureValue ( options )
89
- const existingListener = capture ? _captureListenersMap . get ( listener ) : _nonCaptureListenersMap . get ( listener )
89
+ const existingListener = capture ? captureListenersMap . get ( listener ) : nonCaptureListenersMap . get ( listener )
90
90
91
91
// If the listener is already in the map, we don't need to wrap it again
92
92
if ( existingListener ) {
@@ -104,31 +104,34 @@ export const injectIntoServiceWorker = (body: Buffer) => {
104
104
newListener = new Proxy ( listener , {
105
105
get ( target , key ) {
106
106
if ( key === 'handleEvent' ) {
107
- const wrappedHandleEvent = _targetToWrappedHandleEventMap . get ( target )
108
- const origHandleEvent = _targetToOrigHandleEventMap . get ( target )
107
+ const wrappedHandleEvent = targetToWrappedHandleEventMap . get ( target )
108
+ const origHandleEvent = targetToOrigHandleEventMap . get ( target )
109
109
110
110
// If the handleEvent function has not been wrapped yet, or if it has changed, we need to wrap it
111
111
if ( ( ! wrappedHandleEvent && target . handleEvent ) || target . handleEvent !== origHandleEvent ) {
112
- _targetToWrappedHandleEventMap . set ( target , __cypressWrapListener ( target . handleEvent ) )
113
- _targetToOrigHandleEventMap . set ( target , target . handleEvent )
112
+ targetToWrappedHandleEventMap . set ( target , __cypressWrapListener ( target . handleEvent ) )
113
+ targetToOrigHandleEventMap . set ( target , target . handleEvent )
114
114
}
115
115
116
- return _targetToWrappedHandleEventMap . get ( target )
116
+ return targetToWrappedHandleEventMap . get ( target )
117
117
}
118
118
119
119
return Reflect . get ( target , key )
120
120
} ,
121
121
} )
122
122
}
123
123
124
+ // call the original addEventListener function prior to doing any additional work since it may fail
125
+ const result = oldAddEventListener ( type , newListener , options )
126
+
124
127
// get the capture value so we know which map to add the listener to
125
128
// so we can then remove the listener later if requested
126
- getCaptureValue ( options ) ? _captureListenersMap . set ( listener , newListener ) : _nonCaptureListenersMap . set ( listener , newListener )
127
- _listenerCount ++
129
+ getCaptureValue ( options ) ? captureListenersMap . set ( listener , newListener ) : nonCaptureListenersMap . set ( listener , newListener )
130
+ listenerCount ++
128
131
129
132
__cypressServiceWorkerSendHasFetchEventHandlers ( )
130
133
131
- return oldAddEventListener ( type , newListener , options )
134
+ return result
132
135
}
133
136
134
137
return oldAddEventListener ( type , listener , options )
@@ -142,20 +145,23 @@ export const injectIntoServiceWorker = (body: Buffer) => {
142
145
if ( type === 'fetch' && isValidListener ( listener ) ) {
143
146
// get the capture value so we know which map to remove the listener from
144
147
const capture = getCaptureValue ( options )
145
- const newListener = capture ? _captureListenersMap . get ( listener ) : _nonCaptureListenersMap . get ( listener )
148
+ const newListener = capture ? captureListenersMap . get ( listener ) : nonCaptureListenersMap . get ( listener )
149
+
150
+ // call the original removeEventListener function prior to doing any additional work since it may fail
151
+ const result = oldRemoveEventListener ( type , newListener ! , options )
146
152
147
- capture ? _captureListenersMap . delete ( listener ) : _nonCaptureListenersMap . delete ( listener )
148
- _listenerCount --
153
+ capture ? captureListenersMap . delete ( listener ) : nonCaptureListenersMap . delete ( listener )
154
+ listenerCount --
149
155
150
156
// If the listener is an object with a handleEvent method, we need to remove the wrapped function
151
157
if ( typeof listener === 'object' && typeof listener . handleEvent === 'function' ) {
152
- _targetToWrappedHandleEventMap . delete ( listener )
153
- _targetToOrigHandleEventMap . delete ( listener )
158
+ targetToWrappedHandleEventMap . delete ( listener )
159
+ targetToOrigHandleEventMap . delete ( listener )
154
160
}
155
161
156
162
__cypressServiceWorkerSendHasFetchEventHandlers ( )
157
163
158
- return oldRemoveEventListener ( type , newListener ! , options )
164
+ return result
159
165
}
160
166
161
167
return oldRemoveEventListener ( type , listener , options )
@@ -207,11 +213,11 @@ export const injectIntoServiceWorker = (body: Buffer) => {
207
213
clearInterval ( timer )
208
214
209
215
// send any events that were queued
210
- _eventQueue . forEach ( ( event ) => {
216
+ eventQueue . forEach ( ( event ) => {
211
217
self . __cypressServiceWorkerClientEvent ( JSON . stringify ( event ) )
212
218
} )
213
219
214
- _eventQueue = [ ]
220
+ eventQueue = [ ]
215
221
}
216
222
} , 5 )
217
223
}
0 commit comments