diff --git a/src/diff/props.js b/src/diff/props.js index 2e0f52c806..54bf66876e 100644 --- a/src/diff/props.js +++ b/src/diff/props.js @@ -167,10 +167,7 @@ function createEventProxy(useCapture) { } else if (e._dispatched < eventHandler._attached) { return; } - if (options.event) e = options.event(e); - return 'handleEvent' in eventHandler - ? eventHandler.handleEvent(e) - : eventHandler(e); + return eventHandler(options.event ? options.event(e) : e); } }; } diff --git a/src/jsx.d.ts b/src/jsx.d.ts index 9bb81a15bf..0c1afa2a60 100644 --- a/src/jsx.d.ts +++ b/src/jsx.d.ts @@ -521,15 +521,9 @@ export namespace JSXInternal { export type TargetedPictureInPictureEvent = TargetedEvent; - export type EventHandlerObject = { - handleEvent(e: E): unknown; - }; - - export type EventHandler = - | { - bivarianceHack(event: E): void; - }['bivarianceHack'] - | EventHandlerObject; + export type EventHandler = { + bivarianceHack(event: E): void; + }['bivarianceHack']; export type AnimationEventHandler = EventHandler< TargetedAnimationEvent diff --git a/test/browser/events.test.js b/test/browser/events.test.js index f36e31c31a..ef4f990e49 100644 --- a/test/browser/events.test.js +++ b/test/browser/events.test.js @@ -235,52 +235,4 @@ describe('event handling', () => { .to.have.been.calledTwice.and.to.have.been.calledWith('focusin') .and.calledWith('focusout'); }); - - it('should register EventListenerObject as handler', () => { - let handler = { handleEvent() {} } - - render(
, scratch); - - expect(scratch.childNodes[0].attributes.length).to.equal(0); - - expect(proto.addEventListener).to.have.been.calledOnce; - }); - - it('should call registered EventListenerObject through the .handleEvent() method', () => { - let onclick = sinon.spy(); - - let handler = { - onclick, - handleEvent() { - this.onclick() - } - } - - render(
, scratch); - - fireEvent(scratch.childNodes[0], 'click'); - - expect(onclick).to.have.been.calledOnce; - }); - - it('should keep the registered EventListenerObject referentially identical when calling', () => { - let onclick = sinon.spy(); - - // if the handler object was destructured or otherwise copied, this will fail - let handler = new class { - onclick = onclick - #onClick() { - this.onclick() - } - handleEvent() { - this.#onClick() - } - } - - render(
, scratch); - - fireEvent(scratch.childNodes[0], 'click'); - - expect(onclick).to.have.been.calledOnce; - }); }); diff --git a/test/ts/preact.tsx b/test/ts/preact.tsx index 43d88336ff..ba617452de 100644 --- a/test/ts/preact.tsx +++ b/test/ts/preact.tsx @@ -6,7 +6,8 @@ import { FunctionalComponent, AnyComponent, h, - createRef + createRef, + JSX } from '../../'; interface DummyProps { @@ -381,3 +382,14 @@ h('form', { onSubmit: onSubmit }); h('option', { value: 'foo' }); createElement('option', { value: 'foo' }); + +function Checkbox({ onChange }: JSX.HTMLAttributes) { + function handleChange( + this: void, + event: JSX.TargetedEvent + ) { + onChange?.call(this, event); + } + + return ; +}