Skip to content

Commit 73f0e91

Browse files
authored
fix: add custom data to events (#1076)
1 parent 5e92c10 commit 73f0e91

File tree

2 files changed

+70
-24
lines changed

2 files changed

+70
-24
lines changed

Diff for: packages/test-utils/src/create-dom-event.js

+50-24
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,62 @@ const modifiers = {
2424
pagedown: 34
2525
}
2626

27+
function createEvent (
28+
type,
29+
modifier,
30+
{ eventInterface, bubbles, cancelable },
31+
options
32+
) {
33+
const SupportedEventInterface =
34+
typeof window[eventInterface] === 'function'
35+
? window[eventInterface]
36+
: window.Event
37+
38+
const event = new SupportedEventInterface(type, {
39+
// event properties can only be added when the event is instantiated
40+
// custom properties must be added after the event has been instantiated
41+
...options,
42+
bubbles,
43+
cancelable,
44+
keyCode: modifiers[modifier]
45+
})
46+
47+
return event
48+
}
49+
50+
function createOldEvent (
51+
type,
52+
modifier,
53+
{ eventInterface, bubbles, cancelable }
54+
) {
55+
const event = document.createEvent('Event')
56+
event.initEvent(type, bubbles, cancelable)
57+
event.keyCode = modifiers[modifier]
58+
return event
59+
}
60+
2761
export default function createDOMEvent (type, options) {
2862
const [eventType, modifier] = type.split('.')
29-
const {
30-
eventInterface,
31-
bubbles,
32-
cancelable
33-
} = eventTypes[eventType] || defaultEventType
34-
35-
if (typeof window.Event === 'function') {
36-
const SupportedEventInterface =
37-
typeof window[eventInterface] === 'function'
38-
? window[eventInterface]
39-
: window.Event
40-
41-
return new SupportedEventInterface(eventType, {
42-
bubbles,
43-
cancelable,
44-
...options,
45-
keyCode: modifiers[modifier]
46-
})
47-
}
63+
const meta = eventTypes[eventType] || defaultEventType
4864

4965
// Fallback for IE10,11 - https://stackoverflow.com/questions/26596123
50-
const eventObject = document.createEvent('Event')
66+
const event = typeof window.Event === 'function'
67+
? createEvent(eventType, modifier, meta, options)
68+
: createOldEvent(eventType, modifier, meta)
5169

52-
eventObject.initEvent(eventType, bubbles, cancelable)
70+
const eventPrototype = Object.getPrototypeOf(event)
5371
Object.keys(options || {}).forEach(key => {
54-
eventObject[key] = options[key]
72+
const propertyDescriptor =
73+
Object.getOwnPropertyDescriptor(eventPrototype, key)
74+
75+
const canSetProperty = !(
76+
propertyDescriptor &&
77+
propertyDescriptor.setter === undefined
78+
)
79+
if (canSetProperty) {
80+
event[key] = options[key]
81+
}
5582
})
56-
eventObject.keyCode = modifiers[modifier]
5783

58-
return eventObject
84+
return event
5985
}

Diff for: test/specs/wrapper/trigger.spec.js

+20
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,26 @@ describeWithShallowAndMount('trigger', mountingMethod => {
102102
expect(clickHandler.calledOnce).to.equal(true)
103103
})
104104

105+
it('adds custom data to events', () => {
106+
const stub = sinon.stub()
107+
const TestComponent = {
108+
template: '<div @update="callStub" />',
109+
methods: {
110+
callStub (event) {
111+
stub(event.customData)
112+
}
113+
}
114+
}
115+
116+
const wrapper = mountingMethod(TestComponent)
117+
118+
wrapper.trigger('update', {
119+
customData: 123
120+
})
121+
122+
expect(stub).calledWith(123)
123+
})
124+
105125
it('does not fire on disabled elements', () => {
106126
const clickHandler = sinon.stub()
107127
const TestComponent = {

0 commit comments

Comments
 (0)