From e099257461014e06b7703db6f5251f4123558ad4 Mon Sep 17 00:00:00 2001 From: Lydia de Jongh Date: Tue, 10 Mar 2020 12:51:05 +0100 Subject: [PATCH 1/3] Add support for EventListener Object See: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener Support for native javascript eventListener.handleEvent() Typedef not correct yet. --- src/ol/events.js | 2 +- src/ol/events/Target.js | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ol/events.js b/src/ol/events.js index 5a64a185ce..de13619cc5 100644 --- a/src/ol/events.js +++ b/src/ol/events.js @@ -18,7 +18,7 @@ import {clear} from './obj.js'; * Listener function. This function is called with an event object as argument. * When the function returns `false`, event propagation will stop. * - * @typedef {function((Event|import("./events/Event.js").default)): (void|boolean)} ListenerFunction + * @typedef {EventListener|function((Event|import("./events/Event.js").default)): (void|boolean)} ListenerFunction * @api */ diff --git a/src/ol/events/Target.js b/src/ol/events/Target.js index 766a954479..5e84ef10b2 100644 --- a/src/ol/events/Target.js +++ b/src/ol/events/Target.js @@ -107,6 +107,17 @@ class Target extends Disposable { this.pendingRemovals_[type] = 0; } ++this.dispatching_[type]; + for (let i = 0, ii = listeners.length; i < ii; ++i) { + if (listeners[i].handleEvent) { + propagate = listeners[i].handleEvent(evt); + } else { + propagate = listeners[i].call(this, evt); + } + if (propagate === false || evt.propagationStopped) { + propagate = false; + break; + } + } for (let i = 0, ii = listeners.length; i < ii; ++i) { if (listeners[i].call(this, evt) === false || evt.propagationStopped) { propagate = false; From 4fa454f2b3d5f2483006c6c06eb54647fa22d5d4 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 10 Mar 2020 14:20:12 +0100 Subject: [PATCH 2/3] Fix types --- src/ol/Observable.js | 2 +- src/ol/events.js | 11 +++++++++-- src/ol/events/Target.js | 20 +++++++++----------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/ol/Observable.js b/src/ol/Observable.js index b4d548a43b..347e131c73 100644 --- a/src/ol/Observable.js +++ b/src/ol/Observable.js @@ -51,7 +51,7 @@ class Observable extends EventTarget { /** * Listen for a certain type of event. * @param {string|Array} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. + * @param {import("./events.js").ListenerFunction} listener The listener function. * @return {import("./events.js").EventsKey|Array} Unique key for the listener. If * called with an array of event types as the first argument, the return * will be an array of keys. diff --git a/src/ol/events.js b/src/ol/events.js index de13619cc5..f234e82dca 100644 --- a/src/ol/events.js +++ b/src/ol/events.js @@ -13,15 +13,22 @@ import {clear} from './obj.js'; * @api */ - /** * Listener function. This function is called with an event object as argument. * When the function returns `false`, event propagation will stop. * - * @typedef {EventListener|function((Event|import("./events/Event.js").default)): (void|boolean)} ListenerFunction + * @typedef {function((Event|import("./events/Event.js").default)): (void|boolean)} ListenerFunction * @api */ +/** + * @typedef {Object} ListenerObject + * @property {ListenerFunction} handleEvent + */ + +/** + * @typedef {ListenerFunction|ListenerObject} Listener + */ /** * Registers an event listener on an event target. Inspired by diff --git a/src/ol/events/Target.js b/src/ol/events/Target.js index 5e84ef10b2..6dd9a1c762 100644 --- a/src/ol/events/Target.js +++ b/src/ol/events/Target.js @@ -56,7 +56,7 @@ class Target extends Disposable { /** * @private - * @type {!Object>} + * @type {!Object>} */ this.listeners_ = {}; @@ -64,7 +64,7 @@ class Target extends Disposable { /** * @param {string} type Type. - * @param {import("../events.js").ListenerFunction} listener Listener. + * @param {import("../events.js").Listener} listener Listener. */ addEventListener(type, listener) { if (!type || !listener) { @@ -85,15 +85,13 @@ class Target extends Disposable { * of this type. The event parameter can either be a string or an * Object with a `type` property. * - * @param {{type: string, - * target: (EventTargetLike|undefined), - * propagationStopped: (boolean|undefined)}| - * import("./Event.js").default|string} event Event object. + * @param {import("./Event.js").default|string} event Event object. * @return {boolean|undefined} `false` if anyone called preventDefault on the * event object or if any of the listeners returned false. * @api */ dispatchEvent(event) { + /** @type {import("./Event.js").default|Event} */ const evt = typeof event === 'string' ? new Event(event) : event; const type = evt.type; if (!evt.target) { @@ -108,10 +106,10 @@ class Target extends Disposable { } ++this.dispatching_[type]; for (let i = 0, ii = listeners.length; i < ii; ++i) { - if (listeners[i].handleEvent) { - propagate = listeners[i].handleEvent(evt); + if ('handleEvent' in listeners[i]) { + propagate = /** @type {import("../events.js").ListenerObject} */ (listeners[i]).handleEvent(evt); } else { - propagate = listeners[i].call(this, evt); + propagate = /** @type {import("../events.js").ListenerFunction} */ (listeners[i]).call(this, evt); } if (propagate === false || evt.propagationStopped) { propagate = false; @@ -149,7 +147,7 @@ class Target extends Disposable { * order that they will be called in. * * @param {string} type Type. - * @return {Array} Listeners. + * @return {Array} Listeners. */ getListeners(type) { return this.listeners_[type]; @@ -168,7 +166,7 @@ class Target extends Disposable { /** * @param {string} type Type. - * @param {import("../events.js").ListenerFunction} listener Listener. + * @param {import("../events.js").Listener} listener Listener. */ removeEventListener(type, listener) { const listeners = this.listeners_[type]; From e59aa02a15b3c0c92ad1a27772ea7c354e47318c Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Tue, 10 Mar 2020 14:20:20 +0100 Subject: [PATCH 3/3] Remove duplicated for loop --- src/ol/events/Target.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/ol/events/Target.js b/src/ol/events/Target.js index 6dd9a1c762..7ea0ccf929 100644 --- a/src/ol/events/Target.js +++ b/src/ol/events/Target.js @@ -116,12 +116,6 @@ class Target extends Disposable { break; } } - for (let i = 0, ii = listeners.length; i < ii; ++i) { - if (listeners[i].call(this, evt) === false || evt.propagationStopped) { - propagate = false; - break; - } - } --this.dispatching_[type]; if (this.dispatching_[type] === 0) { let pendingRemovals = this.pendingRemovals_[type];