all files / dom/ DOMEventListener.js

100% Statements 30/30
100% Branches 14/14
100% Functions 5/5
100% Lines 30/30
1 statement, 1 branch Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65                    6136×   6136× 6136× 6136× 6136×   6136× 6131×   6136×     6136× 6136× 6136× 6136× 6136× 6136×   6136×                                      
import { isFunction, isString, findIndex } from '../util'
 
/*
  Internal implementation used to store event bindings.
*/
export default
class DOMEventListener {
 
  constructor(eventName, handler, options) {
    /* istanbul ignore next */
    Iif (!isString(eventName) || !isFunction(handler)) {
      throw new Error("Illegal arguments: 'eventName' must be a String, and 'handler' must be a Function.")
    }
    options = options || {}
    var origHandler = handler
    var context = options.context
    var capture = Boolean(options.capture)
 
    if (context) {
      handler = handler.bind(context)
    }
    if (options.once === true) {
      handler = _once(this, handler)
    }
 
    this.eventName = eventName
    this.originalHandler = origHandler
    this.handler = handler
    this.capture = capture
    this.context = context
    this.options = options
    // set when this gets attached to a DOM element
    this._el = null
  }
 
}
 
DOMEventListener.prototype._isDOMEventListener = true
 
DOMEventListener.findIndex = function(eventListeners, eventName, handler) {
  var idx = -1
  if (arguments[1]._isDOMEventListener) {
    idx = eventListeners.indexOf(arguments[1])
  } else {
    idx = findIndex(eventListeners,
      _matches.bind(null, {
        eventName: eventName,
        originalHandler: handler
      })
    )
  }
  return idx
}
 
function _matches(l1, l2) {
  return l1.eventName === l2.eventName && l1.originalHandler === l2.originalHandler
}
 
function _once(listener, handler) {
  return function(event) {
    handler(event)
    listener._el.removeEventListener(listener)
  }
}