@@ -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,25 @@ 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
178- if ( ! proto || ! proto . hasOwnProperty || ! proto . hasOwnProperty ( 'addEventListener' ) ) {
170+ if ( ! proto || Object . prototype . hasOwnProperty . call ( proto , 'addEventListener' ) ) {
179171 return ;
180172 }
181173
182174 fill ( proto , 'addEventListener' , function ( original : VoidFunction , ) : (
183- eventName : string ,
184- fn : EventListenerObject ,
185- options ?: boolean | AddEventListenerOptions ,
175+ ...args : Parameters < typeof WINDOW . addEventListener >
186176 ) => void {
187177 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 ,
178+ this : unknown ,
179+ eventName ,
180+ fn ,
181+ options ,
193182 ) : ( eventName : string , fn : EventListenerObject , capture ?: boolean , secure ?: boolean ) => void {
194183 try {
195- if ( typeof fn . handleEvent === 'function' ) {
184+ if ( isEventListenerObject ( fn ) ) {
196185 // ESlint disable explanation:
197186 // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would
198187 // introduce a bug here, because bind returns a new function that doesn't have our
@@ -211,14 +200,13 @@ function _wrapEventTarget(target: string): void {
211200 } ,
212201 } ) ;
213202 }
214- } catch ( err ) {
203+ } catch {
215204 // can sometimes get 'Permission denied to access property "handle Event'
216205 }
217206
218207 return original . apply ( this , [
219208 eventName ,
220- // eslint-disable-next-line @typescript-eslint/no-explicit-any
221- wrap ( fn as any as WrappedFunction , {
209+ wrap ( fn , {
222210 mechanism : {
223211 data : {
224212 function : 'addEventListener' ,
@@ -234,48 +222,41 @@ function _wrapEventTarget(target: string): void {
234222 } ;
235223 } ) ;
236224
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
225+ fill ( proto , 'removeEventListener' , function ( originalRemoveEventListener : ( ) => void , ) : (
226+ this : unknown ,
227+ ...args : Parameters < typeof WINDOW . removeEventListener >
228+ ) => ( ) => void {
229+ return function ( this : unknown , eventName , fn , options ) : ( ) => void {
230+ /**
231+ * There are 2 possible scenarios here:
232+ *
233+ * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified
234+ * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function
235+ * as a pass-through, and call original `removeEventListener` with it.
236+ *
237+ * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using
238+ * our wrapped version of `addEventListener`, which internally calls `wrap` helper.
239+ * This helper "wraps" whole callback inside a try/catch statement, and attached appropriate metadata to it,
240+ * in order for us to make a distinction between wrapped/non-wrapped functions possible.
241+ * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.
242+ *
243+ * When someone adds a handler prior to initialization, and then do it again, but after,
244+ * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible
245+ * to get rid of the initial handler and it'd stick there forever.
246+ */
247+ try {
248+ const originalEventHandler = ( fn as WrappedFunction ) . __sentry_wrapped__ ;
249+ if ( originalEventHandler ) {
250+ originalRemoveEventListener . call ( this , eventName , originalEventHandler , options ) ;
276251 }
277- return originalRemoveEventListener . call ( this , eventName , wrappedEventHandler , options ) ;
278- } ;
279- } ,
280- ) ;
252+ } catch ( e ) {
253+ // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
254+ }
255+ return originalRemoveEventListener . call ( this , eventName , fn , options ) ;
256+ } ;
257+ } ) ;
258+ }
259+
260+ function isEventListenerObject ( obj : unknown ) : obj is EventListenerObject {
261+ return typeof ( obj as EventListenerObject ) . handleEvent === 'function' ;
281262}
0 commit comments