@@ -4,9 +4,8 @@ import { Component, type GeneralComponent } from '../component'
44import { type DataPath } from '../data_path'
55import { type DataValue } from '../data_proxy'
66import { Element , StyleSegmentIndex } from '../element'
7- import { type ShadowedEvent , type EventListener } from '../event'
7+ import { type EventListener } from '../event'
88import { safeCallback } from '../func_arr'
9- import { ENV } from '../global_options'
109import { type NativeNode } from '../native_node'
1110import { type Node } from '../node'
1211import { SlotMode , type ShadowRoot } from '../shadow_root'
@@ -31,28 +30,34 @@ export type ChangePropListener<T> = (
3130
3231export type ChangePropFilter = < T > (
3332 listener : ChangePropListener < T > ,
34- generalLvaluePath ?: DataPath | null ,
33+ generalLvaluePath : DataPath | null | undefined ,
34+ elem : Element ,
35+ propName : string ,
3536) => ChangePropListener < T >
3637
3738export interface EventListenerWrapper {
3839 < T > (
39- elem : GeneralComponent ,
40- event : ShadowedEvent < T > ,
40+ elem : Element ,
41+ evName : string ,
4142 listener : EventListener < T > ,
43+ final : boolean ,
44+ mutated : boolean ,
45+ capture : boolean ,
4246 generalLvaluePath ?: DataPath | null ,
43- ) : boolean | void
47+ ) : EventListener < T > | null
48+ isEventListenerWrapper ?: true
4449}
4550
46- const emptyFilter = < T > ( x : T ) => x
51+ const defaultChangePropFilter : ChangePropFilter = < T > ( x : T ) => x
4752
48- const defaultEventListenerWrapper : EventListenerWrapper = ( elem , event , listener ) =>
49- listener . apply ( elem , [ event ] )
53+ const defaultEventListenerWrapper : EventListenerWrapper = ( elem , evName , listener ) => ( e ) =>
54+ listener . call ( elem . ownerShadowRoot ?. getHostNode ( ) . getMethodCaller ( ) , e )
5055
5156type TmplArgs = {
5257 key ?: number | string
5358 keyList ?: RangeListManager
5459 dynEvListeners ?: {
55- [ name : string ] : EventListener < unknown >
60+ [ name : string ] : EventListener < unknown > | null
5661 }
5762 dynamicSlotNameMatched ?: boolean
5863 changeProp ?: {
@@ -183,7 +188,7 @@ export class ProcGenWrapper {
183188 procGen : ProcGen
184189 fallbackListenerOnNativeNode : boolean
185190 bindingMapDisabled = false
186- changePropFilter : ChangePropFilter = emptyFilter
191+ changePropFilter : ChangePropFilter = defaultChangePropFilter
187192 eventListenerWrapper : EventListenerWrapper = defaultEventListenerWrapper
188193
189194 constructor ( shadowRoot : ShadowRoot , procGen : ProcGen , fallbackListenerOnNativeNode : boolean ) {
@@ -1146,21 +1151,23 @@ export class ProcGenWrapper {
11461151 generalLvaluePath ?: DataPath | null ,
11471152 ) => {
11481153 const handler = typeof v === 'function' ? v : dataValueToString ( v )
1149- const listener : EventListener < unknown > = ( ev ) => {
1150- const host = elem . ownerShadowRoot ! . getHostNode ( )
1151- const methodCaller = host . getMethodCaller ( )
1152- const f = typeof handler === 'function' ? handler : Component . getMethod ( host , handler )
1153- if ( typeof f === 'function' ) {
1154- return this . eventListenerWrapper (
1155- methodCaller ,
1156- ev ,
1157- f as EventListener < unknown > ,
1158- generalLvaluePath ,
1159- )
1160- }
1161- return undefined
1162- }
1163- if ( ENV . DEV ) {
1154+ const listener = this . eventListenerWrapper (
1155+ elem ,
1156+ evName ,
1157+ function ( this : any , ...args : any [ ] ) {
1158+ const host = elem . ownerShadowRoot ! . getHostNode ( )
1159+ const f = typeof handler === 'function' ? handler : Component . getMethod ( host , handler )
1160+ if ( typeof f === 'function' ) {
1161+ return f . call ( this , ...args ) as boolean | void
1162+ }
1163+ return undefined
1164+ } ,
1165+ final ,
1166+ mutated ,
1167+ capture ,
1168+ generalLvaluePath ,
1169+ )
1170+ if ( listener ) {
11641171 Object . defineProperty ( listener , 'name' , {
11651172 value : typeof handler === 'string' ? handler : handler . name ,
11661173 } )
@@ -1179,7 +1186,7 @@ export class ProcGenWrapper {
11791186 }
11801187 dynEvListeners [ evName ] = listener
11811188 }
1182- if ( handler ) elem . addListener ( evName , listener , evOptions )
1189+ if ( handler && listener ) elem . addListener ( evName , listener , evOptions )
11831190 }
11841191
11851192 // update a property or external class of a component, or an attribute of a native node
@@ -1267,7 +1274,7 @@ export class ProcGenWrapper {
12671274 tmplArgs . changeProp = Object . create ( null ) as typeof tmplArgs . changeProp
12681275 }
12691276 tmplArgs . changeProp ! [ name ] = {
1270- listener : this . changePropFilter ( v , generalLvaluePath ) ,
1277+ listener : this . changePropFilter ( v , generalLvaluePath , elem , name ) ,
12711278 oldValue : undefined ,
12721279 }
12731280 }
0 commit comments