Skip to content
This repository has been archived by the owner on Jun 10, 2021. It is now read-only.

Added validation to event listener to check if the event is actually #148

Merged
merged 5 commits into from
Nov 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 36 additions & 15 deletions event/EventBusImpl.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export default class EventBusImpl extends EventBus {
*
* @type {WeakMap<EventTarget, WeakSet<function(Event)>>}
*/
this._allEventListeners = new WeakMap();
this._allListenersTargets = new WeakMap();
}

/**
Expand Down Expand Up @@ -90,12 +90,18 @@ export default class EventBusImpl extends EventBus {
* @inheritdoc
*/
listenAll(eventTarget, listener) {
this._window.bindEventListener(eventTarget, IMA_EVENT, listener);

if (!this._allEventListeners.has(eventTarget)) {
this._allEventListeners.set(eventTarget, new WeakSet());
if (!this._allListenersTargets.has(eventTarget)) {
this._allListenersTargets.set(eventTarget, new WeakMap());
}
this._allEventListeners.get(eventTarget).add(listener);

var nativeListener = event => {
if (event.detail.eventName && event.type === IMA_EVENT) {
listener(event);
}
};
this._allListenersTargets.get(eventTarget).set(listener, nativeListener);

this._window.bindEventListener(eventTarget, IMA_EVENT, nativeListener);

return this;
}
Expand All @@ -115,7 +121,7 @@ export default class EventBusImpl extends EventBus {

var eventNameToNativeListener = targetToEventName.get(eventTarget);
var nativeListener = event => {
if (event.detail.eventName === eventName) {
if (event.detail.eventName === eventName && event.type === IMA_EVENT) {
listener(event);
}
};
Expand All @@ -130,24 +136,39 @@ export default class EventBusImpl extends EventBus {
* @inheritdoc
*/
unlistenAll(eventTarget, listener) {
this._window.unbindEventListener(eventTarget, IMA_EVENT, listener);
if (!this._allListenersTargets.has(eventTarget)) {
if ($Debug) {
console.warn(
'The provided listener is not registered on the ' +
'specified event target'
);
}

var listenerRegistered =
this._allEventListeners.has(eventTarget) &&
this._allEventListeners.get(eventTarget).has(listener);
if (listenerRegistered) {
this._allEventListeners.get(eventTarget).delete(listener);
return this;
}

if ($Debug) {
if (!listenerRegistered) {
var listeners = this._allListenersTargets.get(eventTarget);
if (!listeners.has(listener)) {
if ($Debug) {
console.warn(
'The provided listener is not registered on the ' +
'specified event target'
);
}

return this;
}

var nativeListener = listeners.get(listener);
this._window.unbindEventListener(eventTarget, IMA_EVENT, nativeListener);

listeners.delete(listener);
if (listeners.size) {
return this;
}

this._allListenersTargets.delete(eventTarget);

return this;
}

Expand Down
33 changes: 18 additions & 15 deletions event/__tests__/EventBusSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,18 @@ describe('ima.event.EventBusImpl', () => {
eventBus.listenAll(eventTarget, listeners.listener2);

expect(windowInterface.bindEventListener.calls.count()).toEqual(2);
expect(windowInterface.bindEventListener.calls.argsFor(0)).toEqual([
eventTarget,
IMA_EVENT,
listeners.listener1
]);
expect(windowInterface.bindEventListener.calls.argsFor(1)).toEqual([
eventTarget,
IMA_EVENT,
listeners.listener2
]);
expect(windowInterface.bindEventListener.calls.argsFor(0)[0]).toEqual(
eventTarget
);
expect(windowInterface.bindEventListener.calls.argsFor(0)[1]).toEqual(
IMA_EVENT
);
expect(windowInterface.bindEventListener.calls.argsFor(1)[0]).toEqual(
eventTarget
);
expect(windowInterface.bindEventListener.calls.argsFor(1)[1]).toEqual(
IMA_EVENT
);
});
});

Expand Down Expand Up @@ -134,11 +136,12 @@ describe('ima.event.EventBusImpl', () => {
eventBus.unlistenAll(eventTarget, listeners.listener1);

expect(windowInterface.unbindEventListener.calls.count()).toEqual(1);
expect(windowInterface.unbindEventListener.calls.argsFor(0)).toEqual([
eventTarget,
IMA_EVENT,
listeners.listener1
]);
expect(windowInterface.unbindEventListener.calls.argsFor(0)[0]).toEqual(
eventTarget
);
expect(windowInterface.unbindEventListener.calls.argsFor(0)[1]).toEqual(
IMA_EVENT
);
});
});
});