@@ -2,6 +2,30 @@ import { importModule } from 'local-pkg'
2
2
import type { Environment } from '../../types'
3
3
import { populateGlobal } from './utils'
4
4
5
+ function catchWindowErrors ( window : Window ) {
6
+ let userErrorListenerCount = 0
7
+ function throwUnhandlerError ( e : ErrorEvent ) {
8
+ if ( userErrorListenerCount === 0 && e . error != null )
9
+ process . emit ( 'uncaughtException' , e . error )
10
+ }
11
+ const addEventListener = window . addEventListener . bind ( window )
12
+ const removeEventListener = window . removeEventListener . bind ( window )
13
+ window . addEventListener ( 'error' , throwUnhandlerError )
14
+ window . addEventListener = function ( ...args : Parameters < typeof addEventListener > ) {
15
+ if ( args [ 0 ] === 'error' )
16
+ userErrorListenerCount ++
17
+ return addEventListener . apply ( this , args )
18
+ }
19
+ window . removeEventListener = function ( ...args : Parameters < typeof removeEventListener > ) {
20
+ if ( args [ 0 ] === 'error' && userErrorListenerCount )
21
+ userErrorListenerCount --
22
+ return removeEventListener . apply ( this , args )
23
+ }
24
+ return function clearErrorHandlers ( ) {
25
+ window . removeEventListener ( 'error' , throwUnhandlerError )
26
+ }
27
+ }
28
+
5
29
export default < Environment > ( {
6
30
name : 'jsdom' ,
7
31
async setup ( global , { jsdom = { } } ) {
@@ -42,8 +66,12 @@ export default <Environment>({
42
66
43
67
const { keys, originals } = populateGlobal ( global , dom . window , { bindFunctions : true } )
44
68
69
+ const clearWindowErrors = catchWindowErrors ( global )
70
+
45
71
return {
46
72
teardown ( global ) {
73
+ clearWindowErrors ( )
74
+ dom . window . close ( )
47
75
keys . forEach ( key => delete global [ key ] )
48
76
originals . forEach ( ( v , k ) => global [ k ] = v )
49
77
} ,
0 commit comments