From d73ddeb90edcd509cd7c0c9e7ffee97b375b06bc Mon Sep 17 00:00:00 2001 From: Caleb Meredith Date: Sun, 24 May 2020 13:47:07 -0700 Subject: [PATCH 1/3] Support `clipboardData` like `dataTransfer`. --- src/events.js | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/events.js b/src/events.js index c54ec589..85a1af60 100644 --- a/src/events.js +++ b/src/events.js @@ -57,21 +57,25 @@ Object.keys(eventMap).forEach(key => { event[eventKey] = otherInit[eventKey] }) } - - 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 - }) + + // DataTransfer is not supported in jsdom: https://github.com/jsdom/jsdom/issues/1568 + ['dataTransfer', 'clipboardData'].forEach(dataTransferKey => { + const dataTransferValue = eventInit[dataTransferKey]; + + if (typeof dataTransfer === 'object') { + /* istanbul ignore if */ + if (typeof window.DataTransfer === 'function') { + Object.defineProperty(event, dataTransferKey, { + value: Object.assign(new window.DataTransfer(), dataTransferValue) + }) + } else { + Object.defineProperty(event, dataTransferKey, { + value: dataTransferValue + }) + } } - } + }) + return event } From 4b41f2f39167171791086d43c00c8a89c7e75491 Mon Sep 17 00:00:00 2001 From: Caleb Meredith Date: Sun, 24 May 2020 13:53:00 -0700 Subject: [PATCH 2/3] Update events.js --- src/events.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/events.js b/src/events.js index 85a1af60..499d4810 100644 --- a/src/events.js +++ b/src/events.js @@ -62,7 +62,7 @@ Object.keys(eventMap).forEach(key => { ['dataTransfer', 'clipboardData'].forEach(dataTransferKey => { const dataTransferValue = eventInit[dataTransferKey]; - if (typeof dataTransfer === 'object') { + if (typeof dataTransferValue === 'object') { /* istanbul ignore if */ if (typeof window.DataTransfer === 'function') { Object.defineProperty(event, dataTransferKey, { From 15a7d922643bd68ae58a70f871a3b577fab7930b Mon Sep 17 00:00:00 2001 From: Nick McCurdy Date: Fri, 12 Jun 2020 08:32:35 -0400 Subject: [PATCH 3/3] chore: Add test for clipboardData properties --- src/__tests__/events.js | 57 +++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/src/__tests__/events.js b/src/__tests__/events.js index f2f8d2a9..09eb2e80 100644 --- a/src/__tests__/events.js +++ b/src/__tests__/events.js @@ -140,17 +140,21 @@ const eventTypes = [ const allEvents = Object.keys(eventMap) -const bubblingEvents = allEvents - .filter(eventName => eventMap[eventName].defaultInit.bubbles) +const bubblingEvents = allEvents.filter( + eventName => eventMap[eventName].defaultInit.bubbles, +) -const composedEvents = allEvents - .filter(eventName => eventMap[eventName].defaultInit.composed) +const composedEvents = allEvents.filter( + eventName => eventMap[eventName].defaultInit.composed, +) -const nonBubblingEvents = allEvents - .filter(eventName => !bubblingEvents.includes(eventName)) +const nonBubblingEvents = allEvents.filter( + eventName => !bubblingEvents.includes(eventName), +) -const nonComposedEvents = allEvents - .filter(eventName => !composedEvents.includes(eventName)) +const nonComposedEvents = allEvents.filter( + eventName => !composedEvents.includes(eventName), +) eventTypes.forEach(({type, events, elementType}) => { describe(`${type} Events`, () => { @@ -203,7 +207,7 @@ describe(`Composed Events`, () => { const spy = jest.fn() node.addEventListener(event.toLowerCase(), spy) - const shadowRoot = node.attachShadow({ mode: 'closed' }) + const shadowRoot = node.attachShadow({mode: 'closed'}) const innerNode = document.createElement('div') shadowRoot.appendChild(innerNode) @@ -218,7 +222,7 @@ describe(`Composed Events`, () => { const spy = jest.fn() node.addEventListener(event.toLowerCase(), spy) - const shadowRoot = node.attachShadow({ mode: 'closed' }) + const shadowRoot = node.attachShadow({mode: 'closed'}) const innerNode = document.createElement('div') shadowRoot.appendChild(innerNode) @@ -234,7 +238,7 @@ describe(`Aliased Events`, () => { const node = document.createElement('div') const spy = jest.fn() node.addEventListener(eventAliasMap[eventAlias].toLowerCase(), spy) - + fireEvent[eventAlias](node) expect(spy).toHaveBeenCalledTimes(1) }) @@ -303,6 +307,37 @@ test('assigning the files property on dataTransfer', () => { expect(spy.mock.calls[0][0]).toHaveProperty('dataTransfer.files', [file]) }) +test('assigns clipboardData properties', () => { + const node = document.createElement('div') + const spy = jest.fn() + node.addEventListener('paste', spy) + const clipboardData = { + dropEffect: 'none', + effectAllowed: 'uninitialized', + files: [], + items: [ + { + kind: 'string', + type: 'text/plain', + file: { + getAsFile() { + return null + }, + }, + }, + ], + types: ['text/plain'], + getData() { + return 'example' + }, + } + fireEvent.paste(node, {clipboardData}) + expect(spy).toHaveBeenCalledTimes(1) + expect(spy.mock.calls[0][0].clipboardData).toBe(clipboardData) + expect(clipboardData.items[0].file.getAsFile()).toBeNull() + expect(clipboardData.getData('text')).toBe('example') +}) + test('fires events on Window', () => { const messageSpy = jest.fn() window.addEventListener('message', messageSpy)