Skip to content

Commit 13bfce3

Browse files
authored
feat(events): Add dataTransfer event property option (#554)
1 parent 752ff66 commit 13bfce3

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

src/__tests__/events.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,27 @@ test('assigning the files property on an input', () => {
282282
expect(node.files).toEqual([file])
283283
})
284284

285+
test('assigns dataTransfer properties', () => {
286+
const node = document.createElement('div')
287+
const spy = jest.fn()
288+
node.addEventListener('dragover', spy)
289+
fireEvent.dragOver(node, {dataTransfer: {dropEffect: 'move'}})
290+
expect(spy).toHaveBeenCalledTimes(1)
291+
expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.dropEffect', 'move')
292+
})
293+
294+
test('assigning the files property on dataTransfer', () => {
295+
const node = document.createElement('div')
296+
const file = new document.defaultView.File(['(⌐□_□)'], 'chucknorris.png', {
297+
type: 'image/png',
298+
})
299+
const spy = jest.fn()
300+
node.addEventListener('drop', spy)
301+
fireEvent.drop(node, {dataTransfer: {files: [file]}})
302+
expect(spy).toHaveBeenCalledTimes(1)
303+
expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.files', [file])
304+
})
305+
285306
test('fires events on Window', () => {
286307
const messageSpy = jest.fn()
287308
window.addEventListener('message', messageSpy)

src/events.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,35 @@ Object.keys(eventMap).forEach(key => {
4444
Object.assign(node, targetProperties)
4545
const window = getWindowFromNode(node)
4646
const EventConstructor = window[EventType] || window.Event
47+
let event
4748
/* istanbul ignore else */
4849
if (typeof EventConstructor === 'function') {
49-
return new EventConstructor(eventName, eventInit)
50+
event = new EventConstructor(eventName, eventInit)
5051
} else {
5152
// IE11 polyfill from https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
52-
const event = window.document.createEvent(EventType)
53+
event = window.document.createEvent(EventType)
5354
const {bubbles, cancelable, detail, ...otherInit} = eventInit
5455
event.initEvent(eventName, bubbles, cancelable, detail)
5556
Object.keys(otherInit).forEach(eventKey => {
5657
event[eventKey] = otherInit[eventKey]
5758
})
58-
return event
5959
}
60+
61+
const {dataTransfer} = eventInit
62+
if (typeof dataTransfer === 'object') {
63+
// DataTransfer is not supported in jsdom: https://github.com/jsdom/jsdom/issues/1568
64+
/* istanbul ignore if */
65+
if (typeof window.DataTransfer === 'function') {
66+
Object.defineProperty(event, 'dataTransfer', {
67+
value: Object.assign(new window.DataTransfer(), dataTransfer)
68+
})
69+
} else {
70+
Object.defineProperty(event, 'dataTransfer', {
71+
value: dataTransfer
72+
})
73+
}
74+
}
75+
return event
6076
}
6177

6278
fireEvent[key] = (node, init) => fireEvent(node, createEvent[key](node, init))

0 commit comments

Comments
 (0)