@@ -178,7 +178,7 @@ const EventTarget = {
178178 * Register an event listener.
179179 *
180180 * @param {String } type A string representing the event type to listen for
181- * @param {Function } listener The listener to add
181+ * @param {( Function|Object) } listener The listener to add
182182 * @param {Object } [options] An options object specifies characteristics about
183183 * the event listener
184184 * @param {Boolean } [options.once=false] A `Boolean` indicating that the
@@ -196,7 +196,7 @@ const EventTarget = {
196196 } ) ;
197197
198198 event [ kTarget ] = this ;
199- listener . call ( this , event ) ;
199+ callListener ( listener , this , event ) ;
200200 } ;
201201 } else if ( type === 'close' ) {
202202 wrapper = function onClose ( code , message ) {
@@ -207,7 +207,7 @@ const EventTarget = {
207207 } ) ;
208208
209209 event [ kTarget ] = this ;
210- listener . call ( this , event ) ;
210+ callListener ( listener , this , event ) ;
211211 } ;
212212 } else if ( type === 'error' ) {
213213 wrapper = function onError ( error ) {
@@ -217,14 +217,14 @@ const EventTarget = {
217217 } ) ;
218218
219219 event [ kTarget ] = this ;
220- listener . call ( this , event ) ;
220+ callListener ( listener , this , event ) ;
221221 } ;
222222 } else if ( type === 'open' ) {
223223 wrapper = function onOpen ( ) {
224224 const event = new Event ( 'open' ) ;
225225
226226 event [ kTarget ] = this ;
227- listener . call ( this , event ) ;
227+ callListener ( listener , this , event ) ;
228228 } ;
229229 } else {
230230 return ;
@@ -244,7 +244,7 @@ const EventTarget = {
244244 * Remove an event listener.
245245 *
246246 * @param {String } type A string representing the event type to remove
247- * @param {Function } handler The listener to remove
247+ * @param {( Function|Object) } handler The listener to remove
248248 * @public
249249 */
250250 removeEventListener ( type , handler ) {
@@ -264,3 +264,19 @@ module.exports = {
264264 EventTarget,
265265 MessageEvent
266266} ;
267+
268+ /**
269+ * Call an event listener
270+ *
271+ * @param {(Function|Object) } listener The listener to call
272+ * @param {* } thisArg The value to use as `this`` when calling the listener
273+ * @param {Event } event The event to pass to the listener
274+ * @private
275+ */
276+ function callListener ( listener , thisArg , event ) {
277+ if ( typeof listener === 'object' && listener . handleEvent ) {
278+ listener . handleEvent . call ( listener , event ) ;
279+ } else {
280+ listener . call ( thisArg , event ) ;
281+ }
282+ }
0 commit comments