diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 604beb99a..82b1ad26b 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -13142,7 +13142,7 @@ interface GlobalEventHandlers { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */ onended: ((this: GlobalEventHandlers, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */ - onerror: OnErrorEventHandler; + onerror: DocumentOrGlobalOnErrorHandler; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */ onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */ @@ -14183,6 +14183,12 @@ interface HTMLElement extends Element, ElementCSSInlineStyle, ElementContentEdit * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/togglePopover) */ togglePopover(options?: boolean): boolean; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -27401,6 +27407,12 @@ interface SVGElement extends Element, ElementCSSInlineStyle, GlobalEventHandlers * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SVGElement/viewportElement) */ readonly viewportElement: SVGElement | null; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -29763,6 +29775,12 @@ interface SVGSVGElement extends SVGGraphicsElement, SVGFitToViewBox, WindowEvent unsuspendRedraw(suspendHandleID: number): void; /** @deprecated */ unsuspendRedrawAll(): void; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -39572,7 +39590,7 @@ declare var onemptied: ((this: Window, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */ declare var onended: ((this: Window, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */ -declare var onerror: OnErrorEventHandler; +declare var onerror: DocumentOrGlobalOnErrorHandler; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */ declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */ @@ -39849,6 +39867,7 @@ type ConstrainDouble = number | ConstrainDoubleRange; type ConstrainULong = number | ConstrainULongRange; type CookieList = CookieListItem[]; type DOMHighResTimeStamp = number; +type DocumentOrGlobalOnErrorHandler = (((event: Event) => any) | ((event: UIEvent) => any) | OnErrorEventHandlerNonNull) | null; type EpochTimeStamp = number; type EventListenerOrEventListenerObject = EventListener | EventListenerObject; type FileSystemWriteChunkType = BufferSource | Blob | string | WriteParams; diff --git a/baselines/ts5.5/dom.generated.d.ts b/baselines/ts5.5/dom.generated.d.ts index d5ca4f096..e05dfbf8c 100644 --- a/baselines/ts5.5/dom.generated.d.ts +++ b/baselines/ts5.5/dom.generated.d.ts @@ -13131,7 +13131,7 @@ interface GlobalEventHandlers { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */ onended: ((this: GlobalEventHandlers, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */ - onerror: OnErrorEventHandler; + onerror: DocumentOrGlobalOnErrorHandler; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */ onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */ @@ -14170,6 +14170,12 @@ interface HTMLElement extends Element, ElementCSSInlineStyle, ElementContentEdit * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/togglePopover) */ togglePopover(options?: boolean): boolean; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -27379,6 +27385,12 @@ interface SVGElement extends Element, ElementCSSInlineStyle, GlobalEventHandlers * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SVGElement/viewportElement) */ readonly viewportElement: SVGElement | null; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -29741,6 +29753,12 @@ interface SVGSVGElement extends SVGGraphicsElement, SVGFitToViewBox, WindowEvent unsuspendRedraw(suspendHandleID: number): void; /** @deprecated */ unsuspendRedrawAll(): void; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -39549,7 +39567,7 @@ declare var onemptied: ((this: Window, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */ declare var onended: ((this: Window, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */ -declare var onerror: OnErrorEventHandler; +declare var onerror: DocumentOrGlobalOnErrorHandler; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */ declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */ @@ -39826,6 +39844,7 @@ type ConstrainDouble = number | ConstrainDoubleRange; type ConstrainULong = number | ConstrainULongRange; type CookieList = CookieListItem[]; type DOMHighResTimeStamp = number; +type DocumentOrGlobalOnErrorHandler = (((event: Event) => any) | ((event: UIEvent) => any) | OnErrorEventHandlerNonNull) | null; type EpochTimeStamp = number; type EventListenerOrEventListenerObject = EventListener | EventListenerObject; type FileSystemWriteChunkType = BufferSource | Blob | string | WriteParams; diff --git a/baselines/ts5.6/dom.generated.d.ts b/baselines/ts5.6/dom.generated.d.ts index 23672a6c7..4acf42a1f 100644 --- a/baselines/ts5.6/dom.generated.d.ts +++ b/baselines/ts5.6/dom.generated.d.ts @@ -13142,7 +13142,7 @@ interface GlobalEventHandlers { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */ onended: ((this: GlobalEventHandlers, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */ - onerror: OnErrorEventHandler; + onerror: DocumentOrGlobalOnErrorHandler; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */ onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */ @@ -14183,6 +14183,12 @@ interface HTMLElement extends Element, ElementCSSInlineStyle, ElementContentEdit * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/togglePopover) */ togglePopover(options?: boolean): boolean; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -27401,6 +27407,12 @@ interface SVGElement extends Element, ElementCSSInlineStyle, GlobalEventHandlers * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SVGElement/viewportElement) */ readonly viewportElement: SVGElement | null; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -29763,6 +29775,12 @@ interface SVGSVGElement extends SVGGraphicsElement, SVGFitToViewBox, WindowEvent unsuspendRedraw(suspendHandleID: number): void; /** @deprecated */ unsuspendRedrawAll(): void; + /** + * The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. + * + * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener) + */ + addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void; addEventListener(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -39572,7 +39590,7 @@ declare var onemptied: ((this: Window, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */ declare var onended: ((this: Window, ev: Event) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */ -declare var onerror: OnErrorEventHandler; +declare var onerror: DocumentOrGlobalOnErrorHandler; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */ declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */ @@ -39849,6 +39867,7 @@ type ConstrainDouble = number | ConstrainDoubleRange; type ConstrainULong = number | ConstrainULongRange; type CookieList = CookieListItem[]; type DOMHighResTimeStamp = number; +type DocumentOrGlobalOnErrorHandler = (((event: Event) => any) | ((event: UIEvent) => any) | OnErrorEventHandlerNonNull) | null; type EpochTimeStamp = number; type EventListenerOrEventListenerObject = EventListener | EventListenerObject; type FileSystemWriteChunkType = BufferSource | Blob | string | WriteParams; diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index 4bc4b1bd4..ed776e428 100644 --- a/inputfiles/addedTypes.jsonc +++ b/inputfiles/addedTypes.jsonc @@ -1216,6 +1216,12 @@ // Full spec at https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill. "name": "AutoFill", "overrideType": "AutoFillBase | `${OptionalPrefixToken}${OptionalPrefixToken}${AutoFillField}${OptionalPostfixToken}`" + }, + { + "name": "DocumentOrGlobalOnErrorHandler", + "nullable": true, + "overrideType": "((event: Event) => any) | ((event: UIEvent) => any) | OnErrorEventHandlerNonNull", + "exposed": "Window" } ] } diff --git a/inputfiles/knownTypes.json b/inputfiles/knownTypes.json index d0ba44099..092031fb5 100644 --- a/inputfiles/knownTypes.json +++ b/inputfiles/knownTypes.json @@ -21,6 +21,7 @@ "CompositeOperationOrAuto", "ComputedKeyframe", "DisplayCaptureSurfaceType", + "DocumentOrGlobalOnErrorHandler", "EcdhKeyDeriveParams", "EcdsaParams", "EcKeyAlgorithm", diff --git a/inputfiles/overridingTypes.jsonc b/inputfiles/overridingTypes.jsonc index fc9172285..91dfa489c 100644 --- a/inputfiles/overridingTypes.jsonc +++ b/inputfiles/overridingTypes.jsonc @@ -421,6 +421,14 @@ ] } } + }, + "addEventListener": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener", + "comment": "The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target.", + "overrideSignatures": [ + "addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void" + ] + } } } @@ -1281,6 +1289,18 @@ "type": "any" } } + }, + "methods": { + "method": { + "addEventListener": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener", + "comment": "The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target.", + "overrideSignatures": [ + "addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void" + ] + + } + } } }, "SVGSVGElement": { @@ -1299,6 +1319,14 @@ "overrideType": "NodeListOf" } } + }, + "addEventListener": { + "mdnUrl": "https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener", + "comment": "The addEventListener() method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target.", + "overrideSignatures": [ + "addEventListener(type: string, listener: ((event: Event) => void) | ((event: UIEvent) => void)): void" + ] + } } } diff --git a/inputfiles/patches/events.kdl b/inputfiles/patches/events.kdl index 504f6d0ed..f4bc663ee 100644 --- a/inputfiles/patches/events.kdl +++ b/inputfiles/patches/events.kdl @@ -74,7 +74,7 @@ interface-mixin GlobalEventHandlers { event transitionstart type=TransitionEvent event transitionend type=TransitionEvent event transitioncancel type=TransitionEvent - property onerror overrideType=OnErrorEventHandler + property onerror overrideType=DocumentOrGlobalOnErrorHandler } interface-mixin MessageEventTarget { diff --git a/src/build/expose.ts b/src/build/expose.ts index 0031d256c..4e90f6ea4 100644 --- a/src/build/expose.ts +++ b/src/build/expose.ts @@ -88,7 +88,9 @@ export function getExposedTypes( if (webidl.typedefs) { const referenced = webidl.typedefs.typedef.filter( - (t) => knownIDLTypes.has(t.name) || forceKnownTypesLogged.has(t.name), + (t) => + (knownIDLTypes.has(t.name) || forceKnownTypesLogged.has(t.name)) && + exposesTo(t, target), ); const { exposed, removed } = filterTypedefs(referenced, unexposedTypes); removed.forEach((s) => unexposedTypes.add(s)); diff --git a/src/build/types.ts b/src/build/types.ts index a1d5badf4..1992fcfea 100644 --- a/src/build/types.ts +++ b/src/build/types.ts @@ -227,6 +227,7 @@ export interface TypeDef extends Typed { deprecated?: boolean; legacyNamespace?: string; typeParameters?: TypeParameter[]; + exposed?: string; } export interface Dictionary { diff --git a/unittests/files/eventlistener.ts b/unittests/files/eventlistener.ts index 021afbc3c..32ebfa0cb 100644 --- a/unittests/files/eventlistener.ts +++ b/unittests/files/eventlistener.ts @@ -5,5 +5,91 @@ document.addEventListener("arbitrary_invalid_event", (ev) => { document.addEventListener("arbitrary_invalid_event", { handleEvent(ev) { return ev.returnValue; + }, +}); +const divElement: HTMLElement = document.createElement("div"); + +/** + * addEventListener works with a single event arg, Event + */ +divElement.addEventListener( + "click", + (event: Event) => { + if (event) { + return; + } + }, + false, +); + +/** + * HTMLElement addEventListener works with a single event arg, UIEvent + */ +divElement.addEventListener("click", (event: UIEvent) => { + if (event) { + return; + } +}); + +/** + * HTMLElement addEventListener works with a custom string and single event arg, Event + */ +divElement.addEventListener("beep", (event: Event) => { + if (event) { + return; + } +}); + +/** + * HTMLElement addEventListener works with a custom string and single event arg, UIEvent + */ +divElement.addEventListener("beep", (event: UIEvent) => { + if (event) { + return; + } +}); + +const svgElement = document.createElementNS( + "http://www.w3.org/2000/svg", + "svg", +); + +/** + * SVGElement addEventListener works with a single event arg, Event + */ +svgElement.addEventListener( + "click", + (event: Event) => { + if (event) { + return; + } + }, + false, +); + +/** + * SVGElement addEventListener works with a single event arg, UIEvent + */ +svgElement.addEventListener("click", (event: UIEvent) => { + if (event) { + return; + } +}); + +/** + * SVGElement addEventListener works with a custom string and single event arg, Event + */ +svgElement.addEventListener("beep", (event: Event) => { + if (event) { + return; + } +}); + +/** + * SVGElement addEventListener works with a custom string and single event arg, UIEvent + */ +svgElement.addEventListener("beep", (event: UIEvent) => { + if (event) { + return; } }); diff --git a/unittests/files/onerror.ts b/unittests/files/onerror.ts new file mode 100644 index 000000000..a3c52f08c --- /dev/null +++ b/unittests/files/onerror.ts @@ -0,0 +1,58 @@ +/** + * window.onerror works as intended with global event handler + */ +window.onerror = (message, src, lineno, colno, error) => { + if (message && src && lineno && colno && error) { + return; + } +}; + +const div: HTMLElement = document.createElement("div"); + +/** + * HTMLElement.onerror works with a single event arg, UIEvent + */ +div.onerror = (event: UIEvent) => { + if (event) { + return; + } +}; + +/** + * HTMLElement.onerror works with a single event arg, Event + */ +div.onerror = (event: Event) => { + if (event) { + return; + } +}; + +/** + * HTMLElement onerror is nullable + */ +div.onerror = null; + +const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + +/** + * SVGElement.onerror works with a single event arg, UIEvent + */ +svg.onerror = (event: UIEvent) => { + if (event) { + return; + } +}; + +/** + * SVGElement.onerror works with a single event arg, Event + */ +svg.onerror = (event: Event) => { + if (event) { + return; + } +}; + +/** + * SVGElement onerror is nullable + */ +svg.onerror = null;