diff --git a/src/event/createEvent.ts b/src/event/createEvent.ts index c6b1462d..64cf07ec 100644 --- a/src/event/createEvent.ts +++ b/src/event/createEvent.ts @@ -47,7 +47,7 @@ export function createEvent( const {EventType, defaultInit} = eventMap[type] const event = new (getEventConstructors(window)[EventType])(type, defaultInit) eventInitializer[EventType].forEach(f => - f(event as never, (init ?? {}) as never), + f(event as never, {view: window, ...init} as never), ) return event as FixedDocumentEventMap[K] diff --git a/tests/event/createEvent.ts b/tests/event/createEvent.ts new file mode 100644 index 00000000..22f70172 --- /dev/null +++ b/tests/event/createEvent.ts @@ -0,0 +1,45 @@ +import {createEvent} from '#src/event/createEvent' +import {render} from '#testHelpers' + +function setupInput() { + return render(``).element +} + +describe('UIEvents receive the window as `view`', () => { + test.each([ + ['keydown', 'KeyboardEvent'], + ['keyup', 'KeyboardEvent'], + ['mousedown', 'MouseEvent'], + ['mouseup', 'MouseEvent'], + ['click', 'PointerEvent'], + ['pointerdown', 'PointerEvent'], + ['pointerup', 'PointerEvent'], + ['focus', 'FocusEvent'], + ['blur', 'FocusEvent'], + ['input', 'InputEvent'], + ['beforeinput', 'InputEvent'], + ] as const)('`%s` (%s) has `view === window`', type => { + const element = setupInput() + + const event = createEvent(type, element) as UIEvent + + expect(event.view).toBe(window) + }) +}) + +test('non-UIEvents do not expose `view`', () => { + const element = setupInput() + + const event = createEvent('change', element) + + expect((event as unknown as UIEvent).view).toBe(undefined) +}) + +test('an explicitly provided `view` is not overwritten', () => { + const element = setupInput() + const otherWindow = {} as Window + + const event = createEvent('click', element, {view: otherWindow}) + + expect(event.view).toBe(otherWindow) +})