11import { getConfig } from './config'
22import { getWindowFromNode } from './helpers'
33import { eventMap , eventAliasMap } from './event-map'
4+ import { beforeFn } from './life-cycle'
5+ const NodeEventMap = new Map ( )
46
5- function fireEvent ( element , event ) {
7+ function fireEvent (
8+ element ,
9+ event ,
10+ cond = ( ) => {
11+ return true
12+ } ,
13+ before ,
14+ ) {
615 return getConfig ( ) . eventWrapper ( ( ) => {
716 if ( ! event ) {
817 throw new Error (
@@ -14,7 +23,21 @@ function fireEvent(element, event) {
1423 `Unable to fire a "${ event . type } " event - please provide a DOM element.` ,
1524 )
1625 }
17- return element . dispatchEvent ( event )
26+ const CloneConditionValue = NodeEventMap . get ( element )
27+ const condition = beforeFn ( CloneConditionValue , event , before )
28+ if ( cond && typeof cond == 'function' ) {
29+ if ( cond ( condition ) ) {
30+ element . dispatchEvent ( event )
31+ }
32+ }
33+ if ( event . defaultPrevented ) {
34+ condition . defaultprevented = true
35+ }
36+ NodeEventMap . set ( element , condition )
37+ if ( event . cancelable && event . defaultPrevented ) {
38+ return false
39+ }
40+ return true
1841 } )
1942}
2043
@@ -93,12 +116,14 @@ function createEvent(
93116}
94117
95118Object . keys ( eventMap ) . forEach ( key => {
96- const { EventType, defaultInit} = eventMap [ key ]
119+ const { EventType, defaultInit, cond , before } = eventMap [ key ]
97120 const eventName = key . toLowerCase ( )
98121
99122 createEvent [ key ] = ( node , init ) =>
100123 createEvent ( eventName , node , init , { EventType, defaultInit} )
101- fireEvent [ key ] = ( node , init ) => fireEvent ( node , createEvent [ key ] ( node , init ) )
124+ fireEvent [ key ] = ( node , init ) => {
125+ return fireEvent ( node , createEvent [ key ] ( node , init ) , cond , before )
126+ }
102127} )
103128
104129// function written after some investigation here:
0 commit comments