Skip to content

Commit

Permalink
XHR: Polishes event handling
Browse files Browse the repository at this point in the history
  • Loading branch information
kettanaito committed Jul 11, 2020
1 parent ccf50ed commit a298eae
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 22 deletions.
4 changes: 4 additions & 0 deletions src/XMLHttpRequest/XMLHttpRequest/EventOverride.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ export class EventOverride implements Event {
public cancelable: boolean = true
public defaultPrevented: boolean = false
public bubbles: boolean = true
public lengthComputable: boolean = true
public loaded: number = 0
public total: number = 0

cancelBubble: boolean = false
returnValue: boolean = true

Expand Down
40 changes: 18 additions & 22 deletions src/XMLHttpRequest/XMLHttpRequest/createXMLHttpRequestOverride.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,14 @@ import { createEvent } from './createEvent'

const createDebug = require('debug')

type XMLHttpRequestEventHandler = (
this: XMLHttpRequest,
event: ProgressEvent<any>
) => void

interface XMLHttpRequestEvent<EventMap extends any> {
name: keyof EventMap
listener: Function
listener: XMLHttpRequestEventHandler
}

export const createXMLHttpRequestOverride = (
Expand Down Expand Up @@ -134,26 +139,17 @@ export const createXMLHttpRequestOverride = (
)

if (this.readyState === this.DONE && (this.onloadend || loadendEvent)) {
let listener

if (this.onloadend) {
listener = this.onloadend
} else if (typeof loadendEvent !== 'undefined') {
listener = loadendEvent.listener
}

if (typeof listener !== 'undefined') {
listener.call(this, createEvent(options, this, 'loadend'))
}
const listener = this.onloadend || loadendEvent?.listener
listener?.call(this, createEvent(options, this, 'loadend'))
}

if ((this as any)['on' + eventName]) {
;(this as any)['on' + eventName].call(
this,
createEvent(options, this, eventName)
)
}
// Call the direct callback, if present.
const directCallback = (this as any)[
`on${eventName}`
] as XMLHttpRequestEventHandler
directCallback?.call(this, createEvent(options, this, eventName))

// Check in the list of events attached via `addEventListener`.
for (const event of this._events) {
if (event.name === eventName) {
event.listener.call(this, createEvent(options, this, eventName))
Expand Down Expand Up @@ -385,11 +381,9 @@ export const createXMLHttpRequestOverride = (
.join('')
}

public overrideMimeType() {}

public addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(
name: K,
listener: (event?: XMLHttpRequestEventTargetEventMap[K]) => any
listener: (event?: XMLHttpRequestEventTargetEventMap[K]) => void
) {
debug('addEventListener', name, listener)
this._events.push({
Expand All @@ -400,12 +394,14 @@ export const createXMLHttpRequestOverride = (

public removeEventListener<K extends keyof XMLHttpRequestEventMap>(
name: K,
listener: (event?: XMLHttpRequestEventMap[K]) => any
listener: (event?: XMLHttpRequestEventMap[K]) => void
): void {
debug('removeEventListener', name, listener)
this._events = this._events.filter((storedEvent) => {
return storedEvent.name !== name && storedEvent.listener !== listener
})
}

public overrideMimeType() {}
}
}

0 comments on commit a298eae

Please sign in to comment.