@@ -18,72 +18,78 @@ function fireEvent(element, event) {
18
18
} )
19
19
}
20
20
21
- const createEvent = { }
21
+ function createEvent (
22
+ eventName ,
23
+ node ,
24
+ init ,
25
+ { EventType = 'Event' , defaultInit = { } } = { } ,
26
+ ) {
27
+ if ( ! node ) {
28
+ throw new Error (
29
+ `Unable to fire a "${ eventName } " event - please provide a DOM element.` ,
30
+ )
31
+ }
32
+ const eventInit = { ...defaultInit , ...init }
33
+ const { target : { value, files, ...targetProperties } = { } } = eventInit
34
+ if ( value !== undefined ) {
35
+ setNativeValue ( node , value )
36
+ }
37
+ if ( files !== undefined ) {
38
+ // input.files is a read-only property so this is not allowed:
39
+ // input.files = [file]
40
+ // so we have to use this workaround to set the property
41
+ Object . defineProperty ( node , 'files' , {
42
+ configurable : true ,
43
+ enumerable : true ,
44
+ writable : true ,
45
+ value : files ,
46
+ } )
47
+ }
48
+ Object . assign ( node , targetProperties )
49
+ const window = getWindowFromNode ( node )
50
+ const EventConstructor = window [ EventType ] || window . Event
51
+ let event
52
+ /* istanbul ignore else */
53
+ if ( typeof EventConstructor === 'function' ) {
54
+ event = new EventConstructor ( eventName , eventInit )
55
+ } else {
56
+ // IE11 polyfill from https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
57
+ event = window . document . createEvent ( EventType )
58
+ const { bubbles, cancelable, detail, ...otherInit } = eventInit
59
+ event . initEvent ( eventName , bubbles , cancelable , detail )
60
+ Object . keys ( otherInit ) . forEach ( eventKey => {
61
+ event [ eventKey ] = otherInit [ eventKey ]
62
+ } )
63
+ }
64
+
65
+ // DataTransfer is not supported in jsdom: https://github.com/jsdom/jsdom/issues/1568
66
+ const dataTransferProperties = [ 'dataTransfer' , 'clipboardData' ]
67
+ dataTransferProperties . forEach ( dataTransferKey => {
68
+ const dataTransferValue = eventInit [ dataTransferKey ]
69
+
70
+ if ( typeof dataTransferValue === 'object' ) {
71
+ /* istanbul ignore if */
72
+ if ( typeof window . DataTransfer === 'function' ) {
73
+ Object . defineProperty ( event , dataTransferKey , {
74
+ value : Object . assign ( new window . DataTransfer ( ) , dataTransferValue ) ,
75
+ } )
76
+ } else {
77
+ Object . defineProperty ( event , dataTransferKey , {
78
+ value : dataTransferValue ,
79
+ } )
80
+ }
81
+ }
82
+ } )
83
+
84
+ return event
85
+ }
22
86
23
87
Object . keys ( eventMap ) . forEach ( key => {
24
88
const { EventType, defaultInit} = eventMap [ key ]
25
89
const eventName = key . toLowerCase ( )
26
90
27
- createEvent [ key ] = ( node , init ) => {
28
- if ( ! node ) {
29
- throw new Error (
30
- `Unable to fire a "${ key } " event - please provide a DOM element.` ,
31
- )
32
- }
33
- const eventInit = { ...defaultInit , ...init }
34
- const { target : { value, files, ...targetProperties } = { } } = eventInit
35
- if ( value !== undefined ) {
36
- setNativeValue ( node , value )
37
- }
38
- if ( files !== undefined ) {
39
- // input.files is a read-only property so this is not allowed:
40
- // input.files = [file]
41
- // so we have to use this workaround to set the property
42
- Object . defineProperty ( node , 'files' , {
43
- configurable : true ,
44
- enumerable : true ,
45
- writable : true ,
46
- value : files ,
47
- } )
48
- }
49
- Object . assign ( node , targetProperties )
50
- const window = getWindowFromNode ( node )
51
- const EventConstructor = window [ EventType ] || window . Event
52
- let event
53
- /* istanbul ignore else */
54
- if ( typeof EventConstructor === 'function' ) {
55
- event = new EventConstructor ( eventName , eventInit )
56
- } else {
57
- // IE11 polyfill from https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
58
- event = window . document . createEvent ( EventType )
59
- const { bubbles, cancelable, detail, ...otherInit } = eventInit
60
- event . initEvent ( eventName , bubbles , cancelable , detail )
61
- Object . keys ( otherInit ) . forEach ( eventKey => {
62
- event [ eventKey ] = otherInit [ eventKey ]
63
- } )
64
- }
65
-
66
- // DataTransfer is not supported in jsdom: https://github.com/jsdom/jsdom/issues/1568
67
- [ 'dataTransfer' , 'clipboardData' ] . forEach ( dataTransferKey => {
68
- const dataTransferValue = eventInit [ dataTransferKey ] ;
69
-
70
- if ( typeof dataTransferValue === 'object' ) {
71
- /* istanbul ignore if */
72
- if ( typeof window . DataTransfer === 'function' ) {
73
- Object . defineProperty ( event , dataTransferKey , {
74
- value : Object . assign ( new window . DataTransfer ( ) , dataTransferValue )
75
- } )
76
- } else {
77
- Object . defineProperty ( event , dataTransferKey , {
78
- value : dataTransferValue
79
- } )
80
- }
81
- }
82
- } )
83
-
84
- return event
85
- }
86
-
91
+ createEvent [ key ] = ( node , init ) =>
92
+ createEvent ( eventName , node , init , { EventType, defaultInit} )
87
93
fireEvent [ key ] = ( node , init ) => fireEvent ( node , createEvent [ key ] ( node , init ) )
88
94
} )
89
95
0 commit comments