diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 75e1846fc..0903d1331 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -5088,12 +5088,12 @@ interface FormData { getAll(name: string): FormDataEntryValue[]; has(name: string): boolean; set(name: string, value: string | Blob, fileName?: string): void; + forEach(callbackfn: (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg?: any): void; } declare var FormData: { prototype: FormData; - new(): FormData; - new(form: HTMLFormElement): FormData; + new(form?: HTMLFormElement): FormData; }; interface GainNode extends AudioNode { @@ -10423,12 +10423,11 @@ interface ProgressEvent extends Event { readonly lengthComputable: boolean; readonly loaded: number; readonly total: number; - initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void; } declare var ProgressEvent: { prototype: ProgressEvent; - new(typeArg: string, eventInitDict?: ProgressEventInit): ProgressEvent; + new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent; }; interface PromiseRejectionEvent extends Event { @@ -15700,8 +15699,7 @@ interface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap { "readystatechange": Event; } -interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget { - msCaching: string; +interface XMLHttpRequest extends XMLHttpRequestEventTarget { onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null; readonly readyState: number; readonly response: any; @@ -15716,12 +15714,12 @@ interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget { withCredentials: boolean; abort(): void; getAllResponseHeaders(): string; - getResponseHeader(header: string): string | null; - msCachingEnabled(): boolean; - open(method: string, url: string, async?: boolean, user?: string | null, password?: string | null): void; + getResponseHeader(name: string): string | null; + open(method: string, url: string): void; + open(method: string, url: string, async: boolean, username?: string | null, password?: string | null): void; overrideMimeType(mime: string): void; - send(data?: any): void; - setRequestHeader(header: string, value: string): void; + send(body?: Document | BodyInit): void; + setRequestHeader(name: string, value: string): void; readonly DONE: number; readonly HEADERS_RECEIVED: number; readonly LOADING: number; @@ -15744,21 +15742,21 @@ declare var XMLHttpRequest: { }; interface XMLHttpRequestEventTargetEventMap { - "abort": Event; - "error": ErrorEvent; - "load": Event; + "abort": ProgressEvent; + "error": ProgressEvent; + "load": ProgressEvent; "loadend": ProgressEvent; - "loadstart": Event; + "loadstart": ProgressEvent; "progress": ProgressEvent; "timeout": ProgressEvent; } -interface XMLHttpRequestEventTarget { - onabort: ((this: XMLHttpRequest, ev: Event) => any) | null; - onerror: ((this: XMLHttpRequest, ev: ErrorEvent) => any) | null; - onload: ((this: XMLHttpRequest, ev: Event) => any) | null; +interface XMLHttpRequestEventTarget extends EventTarget { + onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; - onloadstart: ((this: XMLHttpRequest, ev: Event) => any) | null; + onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; addEventListener(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; @@ -15767,7 +15765,12 @@ interface XMLHttpRequestEventTarget { removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; } -interface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget { +declare var XMLHttpRequestEventTarget: { + prototype: XMLHttpRequestEventTarget; + new(): XMLHttpRequestEventTarget; +}; + +interface XMLHttpRequestUpload extends XMLHttpRequestEventTarget { addEventListener(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -16410,11 +16413,11 @@ type DOMHighResTimeStamp = number; type PerformanceEntryList = PerformanceEntry[]; type BufferSource = ArrayBufferView | ArrayBuffer; type DOMTimeStamp = number; +type FormDataEntryValue = File | string; type ScrollBehavior = "auto" | "instant" | "smooth"; type ScrollLogicalPosition = "start" | "center" | "end" | "nearest"; type MouseWheelEvent = WheelEvent; type ScrollRestoration = "auto" | "manual"; -type FormDataEntryValue = string | File; type InsertPosition = "beforebegin" | "afterbegin" | "beforeend" | "afterend"; type OrientationLockType = "any" | "natural" | "portrait" | "landscape" | "portrait-primary" | "portrait-secondary" | "landscape-primary"| "landscape-secondary"; type IDBValidKey = number | string | Date | BufferSource | IDBArrayKey; diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index 02e7a0271..f365abe9b 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -647,12 +647,12 @@ interface FormData { getAll(name: string): FormDataEntryValue[]; has(name: string): boolean; set(name: string, value: string | Blob, fileName?: string): void; + forEach(callbackfn: (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg?: any): void; } declare var FormData: { prototype: FormData; - new(): FormData; - new(form: object): FormData; + new(form?: object): FormData; }; interface GlobalFetch { @@ -1172,12 +1172,11 @@ interface ProgressEvent extends Event { readonly lengthComputable: boolean; readonly loaded: number; readonly total: number; - initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void; } declare var ProgressEvent: { prototype: ProgressEvent; - new(typeArg: string, eventInitDict?: ProgressEventInit): ProgressEvent; + new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent; }; interface PushEvent extends ExtendableEvent { @@ -1619,8 +1618,7 @@ interface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap { "readystatechange": Event; } -interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget { - msCaching: string; +interface XMLHttpRequest extends XMLHttpRequestEventTarget { onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null; readonly readyState: number; readonly response: any; @@ -1635,12 +1633,12 @@ interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget { withCredentials: boolean; abort(): void; getAllResponseHeaders(): string; - getResponseHeader(header: string): string | null; - msCachingEnabled(): boolean; - open(method: string, url: string, async?: boolean, user?: string | null, password?: string | null): void; + getResponseHeader(name: string): string | null; + open(method: string, url: string): void; + open(method: string, url: string, async: boolean, username?: string | null, password?: string | null): void; overrideMimeType(mime: string): void; - send(data?: any): void; - setRequestHeader(header: string, value: string): void; + send(body?: object | BodyInit): void; + setRequestHeader(name: string, value: string): void; readonly DONE: number; readonly HEADERS_RECEIVED: number; readonly LOADING: number; @@ -1663,21 +1661,21 @@ declare var XMLHttpRequest: { }; interface XMLHttpRequestEventTargetEventMap { - "abort": Event; - "error": ErrorEvent; - "load": Event; + "abort": ProgressEvent; + "error": ProgressEvent; + "load": ProgressEvent; "loadend": ProgressEvent; - "loadstart": Event; + "loadstart": ProgressEvent; "progress": ProgressEvent; "timeout": ProgressEvent; } -interface XMLHttpRequestEventTarget { - onabort: ((this: XMLHttpRequest, ev: Event) => any) | null; - onerror: ((this: XMLHttpRequest, ev: ErrorEvent) => any) | null; - onload: ((this: XMLHttpRequest, ev: Event) => any) | null; +interface XMLHttpRequestEventTarget extends EventTarget { + onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; + onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; - onloadstart: ((this: XMLHttpRequest, ev: Event) => any) | null; + onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null; addEventListener(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; @@ -1686,7 +1684,12 @@ interface XMLHttpRequestEventTarget { removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void; } -interface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget { +declare var XMLHttpRequestEventTarget: { + prototype: XMLHttpRequestEventTarget; + new(): XMLHttpRequestEventTarget; +}; + +interface XMLHttpRequestUpload extends XMLHttpRequestEventTarget { addEventListener(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void; addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void; removeEventListener(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void; @@ -1773,7 +1776,7 @@ type BodyInit = Blob | BufferSource | FormData | URLSearchParams | ReadableStrea type RequestInfo = Request | string; type PerformanceEntryList = PerformanceEntry[]; type BufferSource = ArrayBufferView | ArrayBuffer; -type FormDataEntryValue = string | File; +type FormDataEntryValue = File | string; type IDBValidKey = number | string | Date | BufferSource | IDBArrayKey; type AlgorithmIdentifier = string | Algorithm; type AAGUID = string; diff --git a/inputfiles/addedTypes.json b/inputfiles/addedTypes.json index 8c78542bc..40a8e7ca6 100644 --- a/inputfiles/addedTypes.json +++ b/inputfiles/addedTypes.json @@ -1622,48 +1622,6 @@ }, "no-interface-object": "1" }, - "FormData": { - "name": "FormData", - "methods": { - "method": { - "delete": { - "name": "delete", - "flavor": "Web", - "override-signatures": [ - "delete(name: string): void" - ] - }, - "get": { - "name": "get", - "flavor": "Web", - "override-signatures": [ - "get(name: string): FormDataEntryValue | null" - ] - }, - "getAll": { - "name": "getAll", - "flavor": "Web", - "override-signatures": [ - "getAll(name: string): FormDataEntryValue[]" - ] - }, - "has": { - "name": "has", - "flavor": "Web", - "override-signatures": [ - "has(name: string): boolean" - ] - }, - "set": { - "name": "set", - "flavor": "Web", - "override-signatures": [ - "set(name: string, value: string | Blob, fileName?: string): void" - ] - } - } - } - }, "ValidityState": { "name": "ValidityState", "properties": { @@ -2954,10 +2912,6 @@ "override-type": "\"auto\" | \"manual\"", "new-type": "ScrollRestoration" }, - { - "override-type": "string | File", - "new-type": "FormDataEntryValue" - }, { "override-type": "\"beforebegin\" | \"afterbegin\" | \"beforeend\" | \"afterend\"", "new-type": "InsertPosition" diff --git a/inputfiles/idl/XMLHttpRequest.widl b/inputfiles/idl/XMLHttpRequest.widl new file mode 100644 index 000000000..d3c2808ff --- /dev/null +++ b/inputfiles/idl/XMLHttpRequest.widl @@ -0,0 +1,89 @@ +[Exposed=(Window,DedicatedWorker,SharedWorker)] +interface XMLHttpRequestEventTarget : EventTarget { + // event handlers + attribute EventHandler onloadstart; + attribute EventHandler onprogress; + attribute EventHandler onabort; + attribute EventHandler onerror; + attribute EventHandler onload; + attribute EventHandler ontimeout; + attribute EventHandler onloadend; +}; + +[Exposed=(Window,DedicatedWorker,SharedWorker)] +interface XMLHttpRequestUpload : XMLHttpRequestEventTarget { +}; + +enum XMLHttpRequestResponseType { + "", + "arraybuffer", + "blob", + "document", + "json", + "text" +}; + +[Constructor, + Exposed=(Window,DedicatedWorker,SharedWorker)] +interface XMLHttpRequest : XMLHttpRequestEventTarget { + // event handler + attribute EventHandler onreadystatechange; + + // states + const unsigned short UNSENT = 0; + const unsigned short OPENED = 1; + const unsigned short HEADERS_RECEIVED = 2; + const unsigned short LOADING = 3; + const unsigned short DONE = 4; + readonly attribute unsigned short readyState; + + // request + void open(ByteString method, USVString url); + void open(ByteString method, USVString url, boolean async, optional USVString? username = null, optional USVString? password = null); + void setRequestHeader(ByteString name, ByteString value); + attribute unsigned long timeout; + attribute boolean withCredentials; + [SameObject] readonly attribute XMLHttpRequestUpload upload; + void send(optional (Document or BodyInit)? body = null); + void abort(); + + // response + readonly attribute USVString responseURL; + readonly attribute unsigned short status; + readonly attribute ByteString statusText; + ByteString? getResponseHeader(ByteString name); + ByteString getAllResponseHeaders(); + void overrideMimeType(DOMString mime); + attribute XMLHttpRequestResponseType responseType; + readonly attribute any response; + readonly attribute USVString responseText; + [Exposed=Window] readonly attribute Document? responseXML; +}; +typedef (File or USVString) FormDataEntryValue; + +[Constructor(optional HTMLFormElement form), + Exposed=(Window,Worker)] +interface FormData { + void append(USVString name, USVString value); + void append(USVString name, Blob blobValue, optional USVString filename); + void delete(USVString name); + FormDataEntryValue? get(USVString name); + sequence getAll(USVString name); + boolean has(USVString name); + void set(USVString name, USVString value); + void set(USVString name, Blob blobValue, optional USVString filename); + iterable; +}; +[Constructor(DOMString type, optional ProgressEventInit eventInitDict), + Exposed=(Window,DedicatedWorker,SharedWorker)] +interface ProgressEvent : Event { + readonly attribute boolean lengthComputable; + readonly attribute unsigned long long loaded; + readonly attribute unsigned long long total; +}; + +dictionary ProgressEventInit : EventInit { + boolean lengthComputable = false; + unsigned long long loaded = 0; + unsigned long long total = 0; +}; diff --git a/inputfiles/idlSources.json b/inputfiles/idlSources.json index 17978ce58..0f3dc3334 100644 --- a/inputfiles/idlSources.json +++ b/inputfiles/idlSources.json @@ -46,5 +46,9 @@ { "url": "https://w3c.github.io/webrtc-pc/", "title": "WebRTC" + }, + { + "url": "https://xhr.spec.whatwg.org/", + "title": "XMLHttpRequest" } ] diff --git a/inputfiles/overridingTypes.json b/inputfiles/overridingTypes.json index 62ee9450f..b64ef602d 100644 --- a/inputfiles/overridingTypes.json +++ b/inputfiles/overridingTypes.json @@ -1,41 +1,6 @@ { "mixins": { "mixin": { - "XMLHttpRequestEventTarget": { - "name": "XMLHttpRequestEventTarget", - "properties": { - "property": { - "onload": { - "name": "onload", - "override-type": "(this: XMLHttpRequest, ev: Event) => any" - }, - "onabort": { - "name": "onabort", - "override-type": "(this: XMLHttpRequest, ev: Event) => any" - }, - "onerror": { - "name": "onerror", - "override-type": "(this: XMLHttpRequest, ev: ErrorEvent) => any" - }, - "onloadend": { - "name": "onloadend", - "override-type": "(this: XMLHttpRequest, ev: ProgressEvent) => any" - }, - "onloadstart": { - "name": "onloadstart", - "override-type": "(this: XMLHttpRequest, ev: Event) => any" - }, - "onprogress": { - "name": "onprogress", - "override-type": "(this: XMLHttpRequest, ev: ProgressEvent) => any" - }, - "ontimeout": { - "name": "ontimeout", - "override-type": "(this: XMLHttpRequest, ev: ProgressEvent) => any" - } - } - } - }, "ElementTraversal": { "name": "ElementTraversal", "properties": { @@ -1045,23 +1010,6 @@ }, "FormData": { "name": "FormData", - "constructor": { - "signature": [ - { - "param-min-required": 0, - "type": "FormData", - "param": [ - { - "name": "form", - "type": "HTMLFormElement", - "type-original": "HTMLFormElement" - } - ], - "type-original": "FormData" - } - ], - "name": "" - }, "methods": { "method": { "append": { @@ -1070,6 +1018,13 @@ "override-signatures": [ "append(name: string, value: string | Blob, fileName?: string): void" ] + }, + "set": { + "name": "set", + "flavor": "Web", + "override-signatures": [ + "set(name: string, value: string | Blob, fileName?: string): void" + ] } } } @@ -1884,15 +1839,95 @@ }, "XMLHttpRequest": { "name": "XMLHttpRequest", - "methods": { - "method": { - "send": { - "name": "send", - "override-signatures": [ - "send(data?: any): void" - ] + "properties": { + "property": { + "onreadystatechange": { + "name": "onreadystatechange", + "event-handler": "readystatechange" + } + } + }, + "events": { + "event": [ + { + "name": "readystatechange", + "type": "Event" + } + ] + } + }, + "XMLHttpRequestEventTarget": { + "name": "XMLHttpRequestEventTarget", + "properties": { + "property": { + "onloadstart": { + "name": "onloadstart", + "event-handler": "loadstart", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" + }, + "onprogress": { + "name": "onprogress", + "event-handler": "progress", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" + }, + "onabort": { + "name": "onabort", + "event-handler": "abort", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" + }, + "onerror": { + "name": "onerror", + "event-handler": "error", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" + }, + "onload": { + "name": "onload", + "event-handler": "load", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" + }, + "ontimeout": { + "name": "ontimeout", + "event-handler": "timeout", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" + }, + "onloadend": { + "name": "onloadend", + "event-handler": "loadend", + "override-type": "((this: XMLHttpRequest, ev: ProgressEvent) => any) | null" } } + }, + "events": { + "event": [ + { + "name": "loadstart", + "type": "ProgressEvent" + }, + { + "name": "progress", + "type": "ProgressEvent" + }, + { + "name": "abort", + "type": "ProgressEvent" + }, + { + "name": "error", + "type": "ProgressEvent" + }, + { + "name": "load", + "type": "ProgressEvent" + }, + { + "name": "timeout", + "type": "ProgressEvent" + }, + { + "name": "loadend", + "type": "ProgressEvent" + } + ] } }, "FileReader": { diff --git a/inputfiles/removedTypes.json b/inputfiles/removedTypes.json index 458d8a33f..a4146837c 100644 --- a/inputfiles/removedTypes.json +++ b/inputfiles/removedTypes.json @@ -4,8 +4,10 @@ "Function": {} } }, - "mixin-interfaces": { - "interface": {} + "mixins": { + "mixin": { + "XMLHttpRequestEventTarget": {} + } }, "callback-interfaces": { "interface": {} diff --git a/src/emitter.ts b/src/emitter.ts index 3e7477ba4..f2d725703 100644 --- a/src/emitter.ts +++ b/src/emitter.ts @@ -227,26 +227,13 @@ export function emitWebIDl(webidl: Browser.WebIdl, flavor: Flavor) { } function getEventTypeInInterface(eName: string, i: Browser.Interface) { - switch (i.name) { - case "XMLHttpRequest": - if (eName === "readystatechange") return "Event"; - else return "ProgressEvent"; - - case "IDBDatabase": - case "IDBTransaction": - case "MSBaseReader": - case "XMLHttpRequestEventTarget": - if (eName === "abort") return "Event"; - - default: - if (i.events) { - const event = i.events.event.find(e => e.name === eName); - if (event && event.type) { - return event.type; - } - } - return eNameToEType[eName] || "Event"; + if (i.events) { + const event = i.events.event.find(e => e.name === eName); + if (event && event.type) { + return event.type; + } } + return eNameToEType[eName] || "Event"; } /// Determine if interface1 depends on interface2 diff --git a/src/index.ts b/src/index.ts index f877a04de..09e38f05f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -111,7 +111,7 @@ function emitDom() { if (obj["callback-interfaces"]) result["callback-interfaces"]!.interface = filterInterface(obj["callback-interfaces"]!.interface, template["callback-interfaces"] && template["callback-interfaces"]!.interface); if (obj.dictionaries) result.dictionaries!.dictionary = filterDictionary(obj.dictionaries.dictionary, template.dictionaries && template.dictionaries.dictionary); if (obj.enums) result.enums!.enum = filterEnum(obj.enums.enum, template.enums && template.enums.enum); - if (obj.mixins) result.mixins!.mixin = filterInterface(obj.mixins.mixin, template.mixins && template.mixins.mixin); + if (obj.mixins) result.mixins!.mixin = filterProperties(obj.mixins.mixin, mixin => !(template.mixins && template.mixins!.mixin[mixin.name])); if (obj.interfaces) result.interfaces!.interface = filterInterface(obj.interfaces.interface, template.interfaces && template.interfaces.interface); if (obj.typedefs) result.typedefs!.typedef = obj.typedefs.typedef.filter(t => !(template.typedefs && template.typedefs.typedef.find(o => o["new-type"] === t["new-type"])));