@@ -96,8 +96,7 @@ const _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions>
9696export const browserApiErrorsIntegration = defineIntegration ( _browserApiErrorsIntegration ) ;
9797
9898function _wrapTimeFunction ( original : ( ) => void ) : ( ) => number {
99- // eslint-disable-next-line @typescript-eslint/no-explicit-any
100- return function ( this : any , ...args : any [ ] ) : number {
99+ return function ( this : unknown , ...args : unknown [ ] ) : number {
101100 const originalCallback = args [ 0 ] ;
102101 args [ 0 ] = wrap ( originalCallback , {
103102 mechanism : {
@@ -110,11 +109,8 @@ function _wrapTimeFunction(original: () => void): () => number {
110109 } ;
111110}
112111
113- // eslint-disable-next-line @typescript-eslint/no-explicit-any
114- function _wrapRAF ( original : any ) : ( callback : ( ) => void ) => any {
115- // eslint-disable-next-line @typescript-eslint/no-explicit-any
116- return function ( this : any , callback : ( ) => void ) : ( ) => void {
117- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
112+ function _wrapRAF ( original : ( ) => void ) : ( callback : ( ) => void ) => unknown {
113+ return function ( this : unknown , callback : ( ) => void ) : ( ) => void {
118114 return original . apply ( this , [
119115 wrap ( callback , {
120116 mechanism : {
@@ -131,16 +127,14 @@ function _wrapRAF(original: any): (callback: () => void) => any {
131127}
132128
133129function _wrapXHR ( originalSend : ( ) => void ) : ( ) => void {
134- // eslint-disable-next-line @typescript-eslint/no-explicit-any
135- return function ( this : XMLHttpRequest , ...args : any [ ] ) : void {
130+ return function ( this : XMLHttpRequest , ...args : unknown [ ] ) : void {
136131 // eslint-disable-next-line @typescript-eslint/no-this-alias
137132 const xhr = this ;
138133 const xmlHttpRequestProps : XMLHttpRequestProp [ ] = [ 'onload' , 'onerror' , 'onprogress' , 'onreadystatechange' ] ;
139134
140135 xmlHttpRequestProps . forEach ( prop => {
141136 if ( prop in xhr && typeof xhr [ prop ] === 'function' ) {
142- // eslint-disable-next-line @typescript-eslint/no-explicit-any
143- fill ( xhr , prop , function ( original : WrappedFunction ) : ( ) => any {
137+ fill ( xhr , prop , function ( original ) {
144138 const wrapOptions = {
145139 mechanism : {
146140 data : {
@@ -169,30 +163,21 @@ function _wrapXHR(originalSend: () => void): () => void {
169163}
170164
171165function _wrapEventTarget ( target : string ) : void {
172- // eslint-disable-next-line @typescript-eslint/no-explicit-any
173- const globalObject = WINDOW as { [ key : string ] : any } ;
174- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
175- const proto = globalObject [ target ] && globalObject [ target ] . prototype ;
166+ const globalObject = WINDOW as unknown as Record < string , { prototype ?: object } > ;
167+ const targetObj = globalObject [ target ] ;
168+ const proto = targetObj && targetObj . prototype ;
176169
177- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins
170+ // eslint-disable-next-line no-prototype-builtins
178171 if ( ! proto || ! proto . hasOwnProperty || ! proto . hasOwnProperty ( 'addEventListener' ) ) {
179172 return ;
180173 }
181174
182175 fill ( proto , 'addEventListener' , function ( original : VoidFunction , ) : (
183- eventName : string ,
184- fn : EventListenerObject ,
185- options ?: boolean | AddEventListenerOptions ,
186- ) => void {
187- return function (
188- // eslint-disable-next-line @typescript-eslint/no-explicit-any
189- this : any ,
190- eventName : string ,
191- fn : EventListenerObject ,
192- options ?: boolean | AddEventListenerOptions ,
193- ) : ( eventName : string , fn : EventListenerObject , capture ?: boolean , secure ?: boolean ) => void {
176+ ...args : Parameters < typeof WINDOW . addEventListener >
177+ ) => ReturnType < typeof WINDOW . addEventListener > {
178+ return function ( this : unknown , eventName , fn , options ) : VoidFunction {
194179 try {
195- if ( typeof fn . handleEvent === 'function' ) {
180+ if ( isEventListenerObject ( fn ) ) {
196181 // ESlint disable explanation:
197182 // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would
198183 // introduce a bug here, because bind returns a new function that doesn't have our
@@ -211,14 +196,13 @@ function _wrapEventTarget(target: string): void {
211196 } ,
212197 } ) ;
213198 }
214- } catch ( err ) {
199+ } catch {
215200 // can sometimes get 'Permission denied to access property "handle Event'
216201 }
217202
218203 return original . apply ( this , [
219204 eventName ,
220- // eslint-disable-next-line @typescript-eslint/no-explicit-any
221- wrap ( fn as any as WrappedFunction , {
205+ wrap ( fn , {
222206 mechanism : {
223207 data : {
224208 function : 'addEventListener' ,
@@ -234,48 +218,41 @@ function _wrapEventTarget(target: string): void {
234218 } ;
235219 } ) ;
236220
237- fill (
238- proto ,
239- 'removeEventListener' ,
240- function (
241- originalRemoveEventListener : ( ) => void ,
242- // eslint-disable-next-line @typescript-eslint/no-explicit-any
243- ) : ( this : any , eventName : string , fn : EventListenerObject , options ?: boolean | EventListenerOptions ) => ( ) => void {
244- return function (
245- // eslint-disable-next-line @typescript-eslint/no-explicit-any
246- this : any ,
247- eventName : string ,
248- fn : EventListenerObject ,
249- options ?: boolean | EventListenerOptions ,
250- ) : ( ) => void {
251- /**
252- * There are 2 possible scenarios here:
253- *
254- * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified
255- * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function
256- * as a pass-through, and call original `removeEventListener` with it.
257- *
258- * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using
259- * our wrapped version of `addEventListener`, which internally calls `wrap` helper.
260- * This helper "wraps" whole callback inside a try/catch statement, and attached appropriate metadata to it,
261- * in order for us to make a distinction between wrapped/non-wrapped functions possible.
262- * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.
263- *
264- * When someone adds a handler prior to initialization, and then do it again, but after,
265- * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible
266- * to get rid of the initial handler and it'd stick there forever.
267- */
268- const wrappedEventHandler = fn as unknown as WrappedFunction ;
269- try {
270- const originalEventHandler = wrappedEventHandler && wrappedEventHandler . __sentry_wrapped__ ;
271- if ( originalEventHandler ) {
272- originalRemoveEventListener . call ( this , eventName , originalEventHandler , options ) ;
273- }
274- } catch ( e ) {
275- // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
221+ fill ( proto , 'removeEventListener' , function ( originalRemoveEventListener : VoidFunction , ) : (
222+ this : unknown ,
223+ ...args : Parameters < typeof WINDOW . removeEventListener >
224+ ) => ReturnType < typeof WINDOW . removeEventListener > {
225+ return function ( this : unknown , eventName , fn , options ) : VoidFunction {
226+ /**
227+ * There are 2 possible scenarios here:
228+ *
229+ * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified
230+ * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function
231+ * as a pass-through, and call original `removeEventListener` with it.
232+ *
233+ * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using
234+ * our wrapped version of `addEventListener`, which internally calls `wrap` helper.
235+ * This helper "wraps" whole callback inside a try/catch statement, and attached appropriate metadata to it,
236+ * in order for us to make a distinction between wrapped/non-wrapped functions possible.
237+ * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.
238+ *
239+ * When someone adds a handler prior to initialization, and then do it again, but after,
240+ * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible
241+ * to get rid of the initial handler and it'd stick there forever.
242+ */
243+ try {
244+ const originalEventHandler = ( fn as WrappedFunction ) . __sentry_wrapped__ ;
245+ if ( originalEventHandler ) {
246+ originalRemoveEventListener . call ( this , eventName , originalEventHandler , options ) ;
276247 }
277- return originalRemoveEventListener . call ( this , eventName , wrappedEventHandler , options ) ;
278- } ;
279- } ,
280- ) ;
248+ } catch ( e ) {
249+ // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
250+ }
251+ return originalRemoveEventListener . call ( this , eventName , fn , options ) ;
252+ } ;
253+ } ) ;
254+ }
255+
256+ function isEventListenerObject ( obj : unknown ) : obj is EventListenerObject {
257+ return typeof ( obj as EventListenerObject ) . handleEvent === 'function' ;
281258}
0 commit comments