xhr2
Version:
XMLHttpRequest emulation for node.js
90 lines (77 loc) • 2.9 kB
text/coffeescript
# This file's name is set up in such a way that it will always show up first in
# the list of files given to coffee --join, so that the other files can assume
# that XMLHttpRequestEventTarget was already defined.
# The DOM EventTarget subclass used by XMLHttpRequest.
#
# @see http://xhr.spec.whatwg.org/#interface-xmlhttprequest
class XMLHttpRequestEventTarget
# @private
# This is an abstract class and should not be instantiated directly.
constructor: ->
@onloadstart = null
@onprogress = null
@onabort = null
@onerror = null
@onload = null
@ontimeout = null
@onloadend = null
@_listeners = {}
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'loadstart' event
onloadstart: null
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'progress' event
onprogress: null
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'abort' event
onabort: null
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'error' event
onerror: null
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'load' event
onload: null
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'timeout' event
ontimeout: null
# @property {function(ProgressEvent)} DOM level 0-style handler
# for the 'loadend' event
onloadend: null
# Adds a new-style listener for one of the XHR events.
#
# @see http://www.w3.org/TR/XMLHttpRequest/#events
#
# @param {String} eventType an XHR event type, such as 'readystatechange'
# @param {function(ProgressEvent)} listener function that will be called when
# the event fires
# @return {undefined} undefined
addEventListener: (eventType, listener) ->
eventType = eventType.toLowerCase()
@_listeners[eventType] ||= []
@_listeners[eventType].push listener
undefined
# Removes an event listener added by calling addEventListener.
#
# @param {String} eventType an XHR event type, such as 'readystatechange'
# @param {function(ProgressEvent)} listener the value passed in a previous
# call to addEventListener.
# @return {undefined} undefined
removeEventListener: (eventType, listener) ->
eventType = eventType.toLowerCase()
if @_listeners[eventType]
index = @_listeners[eventType].indexOf listener
@_listeners[eventType].splice index, 1 if index isnt -1
undefined
# Calls all the listeners for an event.
#
# @param {ProgressEvent} event the event to be dispatched
# @return {undefined} undefined
dispatchEvent: (event) ->
event.currentTarget = event.target = @
eventType = event.type
if listeners = @_listeners[eventType]
for listener in listeners
listener.call @, event
if listener = @["on#{eventType}"]
listener.call @, event
undefined