Skip to content

Commit 42fa73a

Browse files
committed
fix(events): ensure both listen decorator and jsx can assign same event
1 parent d48d43c commit 42fa73a

5 files changed

Lines changed: 13 additions & 11 deletions

File tree

src/core/listeners.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export function initElementListeners(plt: PlatformApi, elm: HostElement) {
2020
elm,
2121
listenMeta.eventName,
2222
createListenerCallback(plt, elm, listenMeta.eventMethodName),
23+
1,
2324
listenMeta.eventCapture,
2425
listenMeta.eventPassive
2526
);
@@ -70,6 +71,7 @@ export function enableEventListener(plt: PlatformApi, instance: ComponentInstanc
7071
elm,
7172
eventName,
7273
(ev: any) => instance[listenMeta.eventMethodName](ev),
74+
1,
7375
listenMeta.eventCapture,
7476
(passive === undefined) ? listenMeta.eventPassive : !!passive,
7577
attachTo
@@ -79,7 +81,7 @@ export function enableEventListener(plt: PlatformApi, instance: ComponentInstanc
7981
} else {
8082
// we're disabling the event listener
8183
// so let's just remove it entirely
82-
plt.domApi.$removeEventListener(elm, eventName);
84+
plt.domApi.$removeEventListener(elm, eventName, 1);
8385
}
8486
}
8587
}

src/core/test/listeners.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ describe('instance listeners', () => {
360360
};
361361

362362
// test if target-addEventListener is called properly
363-
domApi.$addEventListener(el, eventName, f, capture, passive);
363+
domApi.$addEventListener(el, eventName, f, 0, capture, passive);
364364
expect(target.addEventListener).toHaveBeenCalledWith(targetName, internalCallback, {
365365
passive: passive,
366366
capture: capture
@@ -376,7 +376,7 @@ describe('instance listeners', () => {
376376
expect(calledCallback).toBeTruthy();
377377

378378
// test if the listener is removed
379-
domApi.$removeEventListener(el, eventName);
379+
domApi.$removeEventListener(el, eventName, 0);
380380
expect(target.removeEventListener).toHaveBeenCalledWith(targetName, internalCallback, {
381381
passive: passive,
382382
capture: capture

src/declarations/dom.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ export interface DomApi {
2727
$hasAttribute(elm: any, key: string): boolean;
2828
$elementRef?(elm: any, referenceName: string): any;
2929
$parentElement?(node: Node): any;
30-
$addEventListener?(elm: any, eventName: string, eventListener: any, useCapture?: boolean, usePassive?: boolean, attachTo?: string|Element): void;
31-
$removeEventListener?(elm: any, eventName?: string): any;
30+
$addEventListener?(elm: any, eventName: string, eventListener: any, assignerId: 0 | 1, useCapture?: boolean, usePassive?: boolean, attachTo?: string|Element): void;
31+
$removeEventListener?(elm: any, eventName?: string, assignerId?: 0 | 1): any;
3232
$dispatchEvent?(elm: Element | Document | Window, eventName: string, data: any): CustomEvent;
3333
$supportsShadowDom?: boolean;
3434
$supportsEventOptions?: boolean;

src/renderer/dom-api.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export const createDomApi = (App: AppGlobal, win: any, doc: Document): DomApi =>
114114
return elm;
115115
},
116116

117-
$addEventListener: (assignerElm, eventName, listenerCallback, useCapture, usePassive, attachTo, eventListenerOpts?: any, splt?: string[], assignersEventName?: string) => {
117+
$addEventListener: (assignerElm, eventName, listenerCallback, assignerId, useCapture, usePassive, attachTo, eventListenerOpts?: any, splt?: string[], assignersEventName?: string) => {
118118
// remember the original name before we possibly change it
119119
let attachToElm = assignerElm;
120120
let eventListener = listenerCallback;
@@ -123,7 +123,7 @@ export const createDomApi = (App: AppGlobal, win: any, doc: Document): DomApi =>
123123
// this element from the unregister listeners weakmap
124124
let assignersUnregListeners = unregisterListenerFns.get(assignerElm);
125125

126-
assignersEventName = eventName;
126+
assignersEventName = eventName + assignerId;
127127

128128
if (assignersUnregListeners && assignersUnregListeners[assignersEventName]) {
129129
// removed any existing listeners for this event for the assigner element
@@ -202,13 +202,13 @@ export const createDomApi = (App: AppGlobal, win: any, doc: Document): DomApi =>
202202
}
203203
},
204204

205-
$removeEventListener: (elm, eventName, assignersUnregListeners?: any) => {
205+
$removeEventListener: (elm, eventName, assignerId, assignersUnregListeners?: any) => {
206206
// get the unregister listener functions for this element
207207
if ((assignersUnregListeners = unregisterListenerFns.get(elm))) {
208208
// this element has unregister listeners
209209
if (eventName) {
210210
// passed in one specific event name to remove
211-
assignersUnregListeners[eventName] && assignersUnregListeners[eventName]();
211+
assignersUnregListeners[eventName + assignerId] && assignersUnregListeners[eventName + assignerId]();
212212

213213
} else {
214214
// remove all event listeners

src/renderer/vdom/set-accessor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ export const setAccessor = (plt: d.PlatformApi, elm: HTMLElement, memberName: st
7878
if (newValue) {
7979
if (newValue !== oldValue) {
8080
// add listener
81-
plt.domApi.$addEventListener(elm, memberName, newValue);
81+
plt.domApi.$addEventListener(elm, memberName, newValue, 0);
8282
}
8383

8484
} else if (_BUILD_.updatable) {
8585
// remove listener
86-
plt.domApi.$removeEventListener(elm, memberName);
86+
plt.domApi.$removeEventListener(elm, memberName, 0);
8787
}
8888

8989
} else if (memberName !== 'list' && memberName !== 'type' && !isSvg &&

0 commit comments

Comments
 (0)