diff --git a/src/__tests__/events.js b/src/__tests__/events.js index f91cf408..f2f8d2a9 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -282,6 +282,27 @@ test('assigning the files property on an input', () => { expect(node.files).toEqual([file]) }) +test('assigns dataTransfer properties', () => { + const node = document.createElement('div') + const spy = jest.fn() + node.addEventListener('dragover', spy) + fireEvent.dragOver(node, {dataTransfer: {dropEffect: 'move'}}) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.dropEffect', 'move') +}) + +test('assigning the files property on dataTransfer', () => { + const node = document.createElement('div') + const file = new document.defaultView.File(['(⌐□_□)'], 'chucknorris.png', { + type: 'image/png', + }) + const spy = jest.fn() + node.addEventListener('drop', spy) + fireEvent.drop(node, {dataTransfer: {files: [file]}}) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.files', [file]) +}) + test('fires events on Window', () => { const messageSpy = jest.fn() window.addEventListener('message', messageSpy) diff --git a/src/events.js b/src/events.js index 389fdab3..c54ec589 100644 --- a/src/events.js +++ b/src/events.js @@ -44,19 +44,35 @@ Object.keys(eventMap).forEach(key => { Object.assign(node, targetProperties) const window = getWindowFromNode(node) const EventConstructor = window[EventType] || window.Event + let event /* istanbul ignore else */ if (typeof EventConstructor === 'function') { - return new EventConstructor(eventName, eventInit) + event = new EventConstructor(eventName, eventInit) } else { // IE11 polyfill from https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill - const event = window.document.createEvent(EventType) + event = window.document.createEvent(EventType) const {bubbles, cancelable, detail, ...otherInit} = eventInit event.initEvent(eventName, bubbles, cancelable, detail) Object.keys(otherInit).forEach(eventKey => { event[eventKey] = otherInit[eventKey] }) - return event } + + const {dataTransfer} = eventInit + if (typeof dataTransfer === 'object') { + // DataTransfer is not supported in jsdom: https://github.com/jsdom/jsdom/issues/1568 + /* istanbul ignore if */ + if (typeof window.DataTransfer === 'function') { + Object.defineProperty(event, 'dataTransfer', { + value: Object.assign(new window.DataTransfer(), dataTransfer) + }) + } else { + Object.defineProperty(event, 'dataTransfer', { + value: dataTransfer + }) + } + } + return event } fireEvent[key] = (node, init) => fireEvent(node, createEvent[key](node, init))