From 4de813bfd59353ae214d02a9fe62b100f81f02e4 Mon Sep 17 00:00:00 2001 From: jamsinclair Date: Fri, 8 May 2020 00:10:36 +0900 Subject: [PATCH 1/3] feat(events): Add dataTransfer event property option --- src/__tests__/events.js | 21 +++++++++++++++++++++ src/events.js | 15 ++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) 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..9e9fcd87 100644 --- a/src/events.js +++ b/src/events.js @@ -44,19 +44,28 @@ 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 } + + // Approximate dataTransfer on the event object + // jsdom does not support DataTransfer constructor + // https://github.com/testing-library/react-testing-library/issues/339#issuecomment-526310225 + const {dataTransfer} = eventInit + if (typeof dataTransfer === 'object') { + Object.assign(event, {dataTransfer}) + } + return event } fireEvent[key] = (node, init) => fireEvent(node, createEvent[key](node, init)) From 7dea4bdf1c5aed6f2418bfe2fe1be88b9478b0bf Mon Sep 17 00:00:00 2001 From: jamsinclair Date: Fri, 8 May 2020 02:36:28 +0900 Subject: [PATCH 2/3] update to support DataTransfer constructor --- src/events.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/events.js b/src/events.js index 9e9fcd87..94767f1f 100644 --- a/src/events.js +++ b/src/events.js @@ -58,12 +58,18 @@ Object.keys(eventMap).forEach(key => { }) } - // Approximate dataTransfer on the event object - // jsdom does not support DataTransfer constructor - // https://github.com/testing-library/react-testing-library/issues/339#issuecomment-526310225 const {dataTransfer} = eventInit if (typeof dataTransfer === 'object') { - Object.assign(event, {dataTransfer}) + /* 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 } From 94d4eaaa1e6dc0daa2b6c0a4d0c8acab246b027b Mon Sep 17 00:00:00 2001 From: "Kent C. Dodds" Date: Thu, 7 May 2020 11:40:40 -0600 Subject: [PATCH 3/3] Update src/events.js --- src/events.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/events.js b/src/events.js index 94767f1f..c54ec589 100644 --- a/src/events.js +++ b/src/events.js @@ -60,6 +60,7 @@ Object.keys(eventMap).forEach(key => { 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', {