From d2f4c6273ac586692d55d3c5f43d6a39a20610d2 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 22 Dec 2018 22:02:40 +0000 Subject: [PATCH 1/3] fix: add custom data to events --- packages/test-utils/src/create-dom-event.js | 74 ++++++++++++++------- test/specs/wrapper/trigger.spec.js | 20 ++++++ 2 files changed, 70 insertions(+), 24 deletions(-) diff --git a/packages/test-utils/src/create-dom-event.js b/packages/test-utils/src/create-dom-event.js index e2496e77d..c45804760 100644 --- a/packages/test-utils/src/create-dom-event.js +++ b/packages/test-utils/src/create-dom-event.js @@ -24,36 +24,62 @@ const modifiers = { pagedown: 34 } +function createEvent ( + type, + modifier, + { eventInterface, bubbles, cancelable }, + options +) { + const SupportedEventInterface = + typeof window[eventInterface] === 'function' + ? window[eventInterface] + : window.Event + + const event = new SupportedEventInterface(type, { + // event options can only be added when the event is + // custom options must be added after the event has been created + ...options, + bubbles, + cancelable, + keyCode: modifiers[modifier] + }) + + return event +} + +function createOldEvent ( + type, + modifier, + { eventInterface, bubbles, cancelable } +) { + const event = document.createEvent('Event') + event.initEvent(type, bubbles, cancelable) + event.keyCode = modifiers[modifier] + return event +} + export default function createDOMEvent (type, options) { const [eventType, modifier] = type.split('.') - const { - eventInterface, - bubbles, - cancelable - } = eventTypes[eventType] || defaultEventType - - if (typeof window.Event === 'function') { - const SupportedEventInterface = - typeof window[eventInterface] === 'function' - ? window[eventInterface] - : window.Event - - return new SupportedEventInterface(eventType, { - bubbles, - cancelable, - ...options, - keyCode: modifiers[modifier] - }) - } + const meta = eventTypes[eventType] || defaultEventType // Fallback for IE10,11 - https://stackoverflow.com/questions/26596123 - const eventObject = document.createEvent('Event') + const event = typeof window.Event === 'function' + ? createEvent(eventType, modifier, meta, options) + : createOldEvent(eventType, modifier, meta) + + const eventProperties = Object.getOwnPropertyDescriptors( + Object.getPrototypeOf(event) + ) - eventObject.initEvent(eventType, bubbles, cancelable) Object.keys(options || {}).forEach(key => { - eventObject[key] = options[key] + const canSetProperty = !( + eventProperties[key] && + eventProperties[key].setter === undefined + ) + if (canSetProperty) { + event[key] = options[key] + } }) - eventObject.keyCode = modifiers[modifier] - return eventObject + return event } diff --git a/test/specs/wrapper/trigger.spec.js b/test/specs/wrapper/trigger.spec.js index 07ce8ea5e..836f00240 100644 --- a/test/specs/wrapper/trigger.spec.js +++ b/test/specs/wrapper/trigger.spec.js @@ -102,6 +102,26 @@ describeWithShallowAndMount('trigger', mountingMethod => { expect(clickHandler.calledOnce).to.equal(true) }) + it('adds custom data to events', () => { + const stub = sinon.stub() + const TestComponent = { + template: '
', + methods: { + callStub (event) { + stub(event.customData) + } + } + } + + const wrapper = mountingMethod(TestComponent) + + wrapper.trigger('update', { + customData: 123 + }) + + expect(stub).calledWith(123) + }) + it('does not fire on disabled elements', () => { const clickHandler = sinon.stub() const TestComponent = { From 1797c09fd3443f0d697e68b37b044af874919436 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 22 Dec 2018 22:44:13 +0000 Subject: [PATCH 2/3] refactor: use getOwnPropertyDescriptor --- packages/test-utils/src/create-dom-event.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/test-utils/src/create-dom-event.js b/packages/test-utils/src/create-dom-event.js index c45804760..defba3561 100644 --- a/packages/test-utils/src/create-dom-event.js +++ b/packages/test-utils/src/create-dom-event.js @@ -67,14 +67,14 @@ export default function createDOMEvent (type, options) { ? createEvent(eventType, modifier, meta, options) : createOldEvent(eventType, modifier, meta) - const eventProperties = Object.getOwnPropertyDescriptors( - Object.getPrototypeOf(event) - ) - + const eventPrototype = Object.getPrototypeOf(event) Object.keys(options || {}).forEach(key => { + const propertyDescriptor = + Object.getOwnPropertyDescriptor(eventPrototype, key) + const canSetProperty = !( - eventProperties[key] && - eventProperties[key].setter === undefined + propertyDescriptor && + propertyDescriptor.setter === undefined ) if (canSetProperty) { event[key] = options[key] From 9ff7eb104d56dd896f05603106a740f88d89ba55 Mon Sep 17 00:00:00 2001 From: eddyerburgh Date: Sat, 22 Dec 2018 23:03:02 +0000 Subject: [PATCH 3/3] refactor: reword comment --- packages/test-utils/src/create-dom-event.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/test-utils/src/create-dom-event.js b/packages/test-utils/src/create-dom-event.js index defba3561..db2556546 100644 --- a/packages/test-utils/src/create-dom-event.js +++ b/packages/test-utils/src/create-dom-event.js @@ -36,8 +36,8 @@ function createEvent ( : window.Event const event = new SupportedEventInterface(type, { - // event options can only be added when the event is - // custom options must be added after the event has been created + // event properties can only be added when the event is instantiated + // custom properties must be added after the event has been instantiated ...options, bubbles, cancelable,