Skip to content

Commit b82ecee

Browse files
have a draft working
1 parent f9f0880 commit b82ecee

File tree

8 files changed

+100
-23
lines changed

8 files changed

+100
-23
lines changed

baselines/dom.generated.d.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15096,7 +15096,7 @@ interface GlobalEventHandlersEventMap {
1509615096
"durationchange": Event;
1509715097
"emptied": Event;
1509815098
"ended": Event;
15099-
"error": ErrorEvent;
15099+
"error": Event;
1510015100
"focus": FocusEvent;
1510115101
"focusin": FocusEvent;
1510215102
"focusout": FocusEvent;
@@ -15237,7 +15237,7 @@ interface GlobalEventHandlers {
1523715237
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
1523815238
onended: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1523915239
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
15240-
onerror: OnErrorEventHandler;
15240+
onerror: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1524115241
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
1524215242
onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
1524315243
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */
@@ -39460,6 +39460,7 @@ interface WindowEventMap extends GlobalEventHandlersEventMap, WindowEventHandler
3946039460
"devicemotion": DeviceMotionEvent;
3946139461
"deviceorientation": DeviceOrientationEvent;
3946239462
"deviceorientationabsolute": DeviceOrientationEvent;
39463+
"error": ErrorEvent;
3946339464
"gamepadconnected": GamepadEvent;
3946439465
"gamepaddisconnected": GamepadEvent;
3946539466
"orientationchange": Event;
@@ -39612,6 +39613,7 @@ interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandler
3961239613
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
3961339614
*/
3961439615
ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
39616+
onerror: OnErrorEventHandler;
3961539617
/**
3961639618
* @deprecated
3961739619
*
@@ -41794,6 +41796,7 @@ declare var ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) =>
4179441796
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
4179541797
*/
4179641798
declare var ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
41799+
declare var onerror: OnErrorEventHandler;
4179741800
/**
4179841801
* @deprecated
4179941802
*
@@ -42174,8 +42177,6 @@ declare var ondurationchange: ((this: Window, ev: Event) => any) | null;
4217442177
declare var onemptied: ((this: Window, ev: Event) => any) | null;
4217542178
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
4217642179
declare var onended: ((this: Window, ev: Event) => any) | null;
42177-
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
42178-
declare var onerror: OnErrorEventHandler;
4217942180
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
4218042181
declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null;
4218142182
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */

baselines/ts5.5/dom.generated.d.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15082,7 +15082,7 @@ interface GlobalEventHandlersEventMap {
1508215082
"durationchange": Event;
1508315083
"emptied": Event;
1508415084
"ended": Event;
15085-
"error": ErrorEvent;
15085+
"error": Event;
1508615086
"focus": FocusEvent;
1508715087
"focusin": FocusEvent;
1508815088
"focusout": FocusEvent;
@@ -15223,7 +15223,7 @@ interface GlobalEventHandlers {
1522315223
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
1522415224
onended: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1522515225
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
15226-
onerror: OnErrorEventHandler;
15226+
onerror: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1522715227
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
1522815228
onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
1522915229
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */
@@ -39434,6 +39434,7 @@ interface WindowEventMap extends GlobalEventHandlersEventMap, WindowEventHandler
3943439434
"devicemotion": DeviceMotionEvent;
3943539435
"deviceorientation": DeviceOrientationEvent;
3943639436
"deviceorientationabsolute": DeviceOrientationEvent;
39437+
"error": ErrorEvent;
3943739438
"gamepadconnected": GamepadEvent;
3943839439
"gamepaddisconnected": GamepadEvent;
3943939440
"orientationchange": Event;
@@ -39586,6 +39587,7 @@ interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandler
3958639587
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
3958739588
*/
3958839589
ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
39590+
onerror: OnErrorEventHandler;
3958939591
/**
3959039592
* @deprecated
3959139593
*
@@ -41768,6 +41770,7 @@ declare var ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) =>
4176841770
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
4176941771
*/
4177041772
declare var ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
41773+
declare var onerror: OnErrorEventHandler;
4177141774
/**
4177241775
* @deprecated
4177341776
*
@@ -42148,8 +42151,6 @@ declare var ondurationchange: ((this: Window, ev: Event) => any) | null;
4214842151
declare var onemptied: ((this: Window, ev: Event) => any) | null;
4214942152
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
4215042153
declare var onended: ((this: Window, ev: Event) => any) | null;
42151-
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
42152-
declare var onerror: OnErrorEventHandler;
4215342154
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
4215442155
declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null;
4215542156
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */

baselines/ts5.6/dom.generated.d.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15093,7 +15093,7 @@ interface GlobalEventHandlersEventMap {
1509315093
"durationchange": Event;
1509415094
"emptied": Event;
1509515095
"ended": Event;
15096-
"error": ErrorEvent;
15096+
"error": Event;
1509715097
"focus": FocusEvent;
1509815098
"focusin": FocusEvent;
1509915099
"focusout": FocusEvent;
@@ -15234,7 +15234,7 @@ interface GlobalEventHandlers {
1523415234
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
1523515235
onended: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1523615236
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
15237-
onerror: OnErrorEventHandler;
15237+
onerror: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1523815238
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
1523915239
onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
1524015240
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */
@@ -39457,6 +39457,7 @@ interface WindowEventMap extends GlobalEventHandlersEventMap, WindowEventHandler
3945739457
"devicemotion": DeviceMotionEvent;
3945839458
"deviceorientation": DeviceOrientationEvent;
3945939459
"deviceorientationabsolute": DeviceOrientationEvent;
39460+
"error": ErrorEvent;
3946039461
"gamepadconnected": GamepadEvent;
3946139462
"gamepaddisconnected": GamepadEvent;
3946239463
"orientationchange": Event;
@@ -39609,6 +39610,7 @@ interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandler
3960939610
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
3961039611
*/
3961139612
ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
39613+
onerror: OnErrorEventHandler;
3961239614
/**
3961339615
* @deprecated
3961439616
*
@@ -41791,6 +41793,7 @@ declare var ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) =>
4179141793
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
4179241794
*/
4179341795
declare var ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
41796+
declare var onerror: OnErrorEventHandler;
4179441797
/**
4179541798
* @deprecated
4179641799
*
@@ -42171,8 +42174,6 @@ declare var ondurationchange: ((this: Window, ev: Event) => any) | null;
4217142174
declare var onemptied: ((this: Window, ev: Event) => any) | null;
4217242175
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
4217342176
declare var onended: ((this: Window, ev: Event) => any) | null;
42174-
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
42175-
declare var onerror: OnErrorEventHandler;
4217642177
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
4217742178
declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null;
4217842179
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */

baselines/ts5.9/dom.generated.d.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15093,7 +15093,7 @@ interface GlobalEventHandlersEventMap {
1509315093
"durationchange": Event;
1509415094
"emptied": Event;
1509515095
"ended": Event;
15096-
"error": ErrorEvent;
15096+
"error": Event;
1509715097
"focus": FocusEvent;
1509815098
"focusin": FocusEvent;
1509915099
"focusout": FocusEvent;
@@ -15234,7 +15234,7 @@ interface GlobalEventHandlers {
1523415234
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
1523515235
onended: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1523615236
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
15237-
onerror: OnErrorEventHandler;
15237+
onerror: ((this: GlobalEventHandlers, ev: Event) => any) | null;
1523815238
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
1523915239
onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
1524015240
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */
@@ -39457,6 +39457,7 @@ interface WindowEventMap extends GlobalEventHandlersEventMap, WindowEventHandler
3945739457
"devicemotion": DeviceMotionEvent;
3945839458
"deviceorientation": DeviceOrientationEvent;
3945939459
"deviceorientationabsolute": DeviceOrientationEvent;
39460+
"error": ErrorEvent;
3946039461
"gamepadconnected": GamepadEvent;
3946139462
"gamepaddisconnected": GamepadEvent;
3946239463
"orientationchange": Event;
@@ -39609,6 +39610,7 @@ interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandler
3960939610
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
3961039611
*/
3961139612
ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
39613+
onerror: OnErrorEventHandler;
3961239614
/**
3961339615
* @deprecated
3961439616
*
@@ -41791,6 +41793,7 @@ declare var ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) =>
4179141793
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Window/deviceorientationabsolute_event)
4179241794
*/
4179341795
declare var ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
41796+
declare var onerror: OnErrorEventHandler;
4179441797
/**
4179541798
* @deprecated
4179641799
*
@@ -42171,8 +42174,6 @@ declare var ondurationchange: ((this: Window, ev: Event) => any) | null;
4217142174
declare var onemptied: ((this: Window, ev: Event) => any) | null;
4217242175
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLMediaElement/ended_event) */
4217342176
declare var onended: ((this: Window, ev: Event) => any) | null;
42174-
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLElement/error_event) */
42175-
declare var onerror: OnErrorEventHandler;
4217642177
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Element/focus_event) */
4217742178
declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null;
4217842179
/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLFormElement/formdata_event) */

inputfiles/overridingTypes.jsonc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,9 +427,22 @@
427427
// making it nullable breaks compatibility as it has historically been non-nullable in TS lib.
428428
// See the example in https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-parent.
429429
"nullable": false
430+
},
431+
"onerror": {
432+
"name": "onerror",
433+
"overrideType": "OnErrorEventHandler",
434+
"eventHandler": "error"
430435
}
431436
}
432437
},
438+
"events": {
439+
"event": [
440+
{
441+
"name": "error",
442+
"type": "ErrorEvent"
443+
}
444+
]
445+
},
433446
"methods": {
434447
"method": {
435448
"alert": {

inputfiles/patches/events.kdl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ interface-mixin GlobalEventHandlers {
2929
event dragover type=DragEvent
3030
event dragstart type=DragEvent
3131
event drop type=DragEvent
32-
event error type=ErrorEvent
32+
event error type=Event
3333
event focus type=FocusEvent
3434
event focusin type=FocusEvent
3535
event focusout type=FocusEvent
@@ -76,7 +76,6 @@ interface-mixin GlobalEventHandlers {
7676
event transitionstart type=TransitionEvent
7777
event transitionend type=TransitionEvent
7878
event transitioncancel type=TransitionEvent
79-
property onerror overrideType=OnErrorEventHandler
8079
}
8180

8281
interface-mixin MessageEventTarget {

src/build/emitter.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,12 @@ export function emitWebIdl(
856856
// A covariant EventHandler is one that is defined in a parent interface as then redefined in current interface with a more specific argument types
857857
// These patterns are unsafe, and flagged as error under --strictFunctionTypes.
858858
// Here we know the property is already defined on the interface, we elide its declaration if the parent has the same handler defined
859+
// Exception: if the property has an overrideType, we should emit it as an intentional override
859860
function isCovariantEventHandler(i: Browser.Interface, p: Browser.Property) {
861+
// If this property has an explicit overrideType, emit it (it's an intentional override)
862+
if (p.overrideType) {
863+
return false;
864+
}
860865
return (
861866
isEventHandler(p) &&
862867
iNameToEhParents[i.name].some((parent) =>
@@ -996,13 +1001,20 @@ export function emitWebIdl(
9961001
prefix: string,
9971002
emitScope: EmitScope,
9981003
i: Browser.Interface,
1004+
emittedProperties?: Set<string>,
9991005
) {
10001006
if (i.properties) {
10011007
mapToArray(i.properties.property)
10021008
.filter((m) => matchScope(emitScope, m))
10031009
.filter((p) => !isCovariantEventHandler(i, p))
1010+
.filter((p) => !emittedProperties || !emittedProperties.has(p.name))
10041011
.sort(compareName)
1005-
.forEach((p) => emitProperty(prefix, i, emitScope, p));
1012+
.forEach((p) => {
1013+
emitProperty(prefix, i, emitScope, p);
1014+
if (emittedProperties) {
1015+
emittedProperties.add(p.name);
1016+
}
1017+
});
10061018
}
10071019
}
10081020

@@ -1148,11 +1160,12 @@ export function emitWebIdl(
11481160
prefix: string,
11491161
emitScope: EmitScope,
11501162
i: Browser.Interface,
1163+
emittedProperties?: Set<string>,
11511164
) {
11521165
const conflictedMembers = extendConflictsBaseTypes[i.name]
11531166
? extendConflictsBaseTypes[i.name].memberNames
11541167
: new Set<string>();
1155-
emitProperties(prefix, emitScope, i);
1168+
emitProperties(prefix, emitScope, i, emittedProperties);
11561169
const methodPrefix = prefix.startsWith("declare var")
11571170
? "declare function "
11581171
: "";
@@ -1164,13 +1177,21 @@ export function emitWebIdl(
11641177

11651178
/// Emit all members of every interfaces at the root level.
11661179
/// Called only once on the global polluter object
1167-
function emitAllMembers(i: Browser.Interface) {
1168-
emitMembers(/*prefix*/ "declare var ", "InstanceOnly", i);
1180+
function emitAllMembers(
1181+
i: Browser.Interface,
1182+
emittedProperties: Set<string> = new Set(),
1183+
) {
1184+
emitMembers(
1185+
/*prefix*/ "declare var ",
1186+
"InstanceOnly",
1187+
i,
1188+
emittedProperties,
1189+
);
11691190

11701191
for (const relatedIName of iNameToIDependList[i.name]) {
11711192
const i = allInterfacesMap[relatedIName];
11721193
if (i) {
1173-
emitAllMembers(i);
1194+
emitAllMembers(i, emittedProperties);
11741195
}
11751196
}
11761197
}

unittests/files/onerror.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* window.onerror works as intended with global event handler
3+
*/
4+
window.onerror = (message, src, lineno, colno, error) => {
5+
if (message && src && lineno && colno && error) {
6+
return;
7+
}
8+
};
9+
10+
const div: HTMLElement = document.createElement("div");
11+
12+
/**
13+
* HTMLElement.onerror works with a single event arg, Event
14+
*/
15+
div.onerror = (event: Event) => {
16+
if (event) {
17+
return;
18+
}
19+
};
20+
21+
/**
22+
* HTMLElement onerror is nullable
23+
*/
24+
div.onerror = null;
25+
26+
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
27+
28+
/**
29+
* SVGElement.onerror works with a single event arg, Event
30+
*/
31+
svg.onerror = (event: Event) => {
32+
if (event) {
33+
return;
34+
}
35+
};
36+
37+
/**
38+
* SVGElement onerror is nullable
39+
*/
40+
svg.onerror = null;

0 commit comments

Comments
 (0)