From 19043f226882ac5054f338fe07783e0a3dccbc9b Mon Sep 17 00:00:00 2001 From: Alex Macleod Date: Wed, 20 Oct 2021 18:10:27 +0100 Subject: [PATCH 1/3] Use MessageEvent in EventSource#addEventListener Fixes #736 --- baselines/dom.generated.d.ts | 4 ++-- baselines/serviceworker.generated.d.ts | 4 ++-- baselines/sharedworker.generated.d.ts | 4 ++-- baselines/webworker.generated.d.ts | 4 ++-- src/build/emitter.ts | 7 ++++++- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index b705170a2..7bfb1e28a 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -4928,9 +4928,9 @@ interface EventSource extends EventTarget { readonly CONNECTING: number; readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; - addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/baselines/serviceworker.generated.d.ts b/baselines/serviceworker.generated.d.ts index 21f97453d..0780ac4b8 100644 --- a/baselines/serviceworker.generated.d.ts +++ b/baselines/serviceworker.generated.d.ts @@ -1300,9 +1300,9 @@ interface EventSource extends EventTarget { readonly CONNECTING: number; readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; - addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/baselines/sharedworker.generated.d.ts b/baselines/sharedworker.generated.d.ts index 23d312a72..c17c101bc 100644 --- a/baselines/sharedworker.generated.d.ts +++ b/baselines/sharedworker.generated.d.ts @@ -1244,9 +1244,9 @@ interface EventSource extends EventTarget { readonly CONNECTING: number; readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; - addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index 6d622b95f..d108ca24f 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -1338,9 +1338,9 @@ interface EventSource extends EventTarget { readonly CONNECTING: number; readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; - addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; - removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/src/build/emitter.ts b/src/build/emitter.ts index 7a3e2d8e6..139db0399 100644 --- a/src/build/emitter.ts +++ b/src/build/emitter.ts @@ -1064,8 +1064,13 @@ export function emitWebIdl( : "EventListenerOptions"; if (tryEmitTypedEventHandlerForInterface(addOrRemove, optionsType)) { // only emit the string event handler if we just emitted a typed handler + const listener = + i.name === "EventSource" + ? "(this: EventSource, event: MessageEvent) => any" + : "EventListenerOrEventListenerObject"; + printer.printLine( - `${fPrefix}${addOrRemove}EventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | ${optionsType}): void;` + `${fPrefix}${addOrRemove}EventListener(type: string, listener: ${listener}, options?: boolean | ${optionsType}): void;` ); } } From 7d24773bbe4eb8d0d5e929234cc46b8221cb5a89 Mon Sep 17 00:00:00 2001 From: Alex Macleod Date: Sat, 23 Oct 2021 15:16:57 +0100 Subject: [PATCH 2/3] Retain EventSource's original listener --- baselines/dom.generated.d.ts | 2 ++ baselines/serviceworker.generated.d.ts | 2 ++ baselines/sharedworker.generated.d.ts | 2 ++ baselines/webworker.generated.d.ts | 2 ++ src/build/emitter.ts | 12 +++++++----- unittests/files/eventsource.ts | 4 ++++ 6 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 unittests/files/eventsource.ts diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 7bfb1e28a..2df5ad63c 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -4929,8 +4929,10 @@ interface EventSource extends EventTarget { readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/baselines/serviceworker.generated.d.ts b/baselines/serviceworker.generated.d.ts index 0780ac4b8..ed093cb4f 100644 --- a/baselines/serviceworker.generated.d.ts +++ b/baselines/serviceworker.generated.d.ts @@ -1301,8 +1301,10 @@ interface EventSource extends EventTarget { readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/baselines/sharedworker.generated.d.ts b/baselines/sharedworker.generated.d.ts index c17c101bc..de24c60fd 100644 --- a/baselines/sharedworker.generated.d.ts +++ b/baselines/sharedworker.generated.d.ts @@ -1245,8 +1245,10 @@ interface EventSource extends EventTarget { readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index d108ca24f..fa215cfe3 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -1339,8 +1339,10 @@ interface EventSource extends EventTarget { readonly OPEN: number; addEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | AddEventListenerOptions): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void; removeEventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | EventListenerOptions): void; + removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; } declare var EventSource: { diff --git a/src/build/emitter.ts b/src/build/emitter.ts index 139db0399..12e129831 100644 --- a/src/build/emitter.ts +++ b/src/build/emitter.ts @@ -1064,13 +1064,15 @@ export function emitWebIdl( : "EventListenerOptions"; if (tryEmitTypedEventHandlerForInterface(addOrRemove, optionsType)) { // only emit the string event handler if we just emitted a typed handler - const listener = - i.name === "EventSource" - ? "(this: EventSource, event: MessageEvent) => any" - : "EventListenerOrEventListenerObject"; + + if (i.name === "EventSource") { + printer.printLine( + `${fPrefix}${addOrRemove}EventListener(type: string, listener: (this: EventSource, event: MessageEvent) => any, options?: boolean | ${optionsType}): void;` + ); + } printer.printLine( - `${fPrefix}${addOrRemove}EventListener(type: string, listener: ${listener}, options?: boolean | ${optionsType}): void;` + `${fPrefix}${addOrRemove}EventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | ${optionsType}): void;` ); } } diff --git a/unittests/files/eventsource.ts b/unittests/files/eventsource.ts new file mode 100644 index 000000000..57925866b --- /dev/null +++ b/unittests/files/eventsource.ts @@ -0,0 +1,4 @@ +const source = new EventSource("/"); + +source.addEventListener("custom", (event: MessageEvent) => {}); +source.addEventListener("with-handle-event", { handleEvent(event: Event) {} }); From 6a953ea976b6df04f516d8b037200affa03cd7a2 Mon Sep 17 00:00:00 2001 From: Alex Macleod Date: Sat, 23 Oct 2021 16:24:44 +0100 Subject: [PATCH 3/3] Add test for MessageEvent being the default overload --- unittests/files/eventsource.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unittests/files/eventsource.ts b/unittests/files/eventsource.ts index 57925866b..f15fbcd06 100644 --- a/unittests/files/eventsource.ts +++ b/unittests/files/eventsource.ts @@ -1,4 +1,7 @@ const source = new EventSource("/"); +source.addEventListener("custom", (event) => { + event.data; // MessageEvent specific +}); source.addEventListener("custom", (event: MessageEvent) => {}); source.addEventListener("with-handle-event", { handleEvent(event: Event) {} });