diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index 7fe2c8824..613edf43c 100644 --- a/inputfiles/addedTypes.jsonc +++ b/inputfiles/addedTypes.jsonc @@ -82,30 +82,6 @@ "DeviceMotionEventRotationRate": { "noInterfaceObject": true }, - "HTMLImageElement": { - "name": "HTMLImageElement", - "properties": { - "property": { - "decoding": { - "name": "decoding", - "overrideType": "\"async\" | \"sync\" | \"auto\"" - }, - "loading": { - "overrideType": "\"eager\" | \"lazy\"" - } - } - } - }, - "HTMLMediaElement": { - "events": { - "event": [ - { - "name": "encrypted", - "type": "MediaEncryptedEvent" - } - ] - } - }, "CSSStyleProperties": { "properties": { "property": { @@ -208,15 +184,12 @@ } }, "HTMLCollectionOf": { - "name": "HTMLCollectionOf", "typeParameters": [ { "name": "T", "extends": "Element" } ], - "exposed": "Window", - "extends": "HTMLCollection", "methods": { "method": { "item": { @@ -243,8 +216,7 @@ ] } } - }, - "noInterfaceObject": true + } }, "Element": { "name": "Element", @@ -433,20 +405,6 @@ } } }, - "HTMLIFrameElement": { - "name": "HTMLIFrameElement", - "properties": { - "property": { - "referrerPolicy": { - "type": "ReferrerPolicy" - }, - "loading": { - "name": "loading", - "overrideType": "\"eager\" | \"lazy\"" - } - } - } - }, "IDBDatabase": { "name": "IDBDatabase", "events": { @@ -550,39 +508,7 @@ ] } }, - "HTMLBodyElement": { - "properties": { - "property": { - "onorientationchange": { - "deprecated": true - } - } - } - }, - "HTMLInputElement": { - "properties": { - "property": { - "labels": { - "overrideType": "NodeListOf" - } - } - } - }, - "HTMLLinkElement": { - "properties": { - "property": { - "charset": { - "deprecated": true - }, - "rev": { - "deprecated": true - }, - "target": { - "deprecated": true - } - } - } - }, + "KHR_parallel_shader_compile": { "overrideExposed": "Window Worker" }, diff --git a/inputfiles/overridingTypes.jsonc b/inputfiles/overridingTypes.jsonc index 30946d42d..15366d1c4 100644 --- a/inputfiles/overridingTypes.jsonc +++ b/inputfiles/overridingTypes.jsonc @@ -359,16 +359,6 @@ } }, "HTMLElement": { - "properties": { - "property": { - "hidden": { - // https://github.com/whatwg/html/pull/7475 - // Blink only as of 2024-11 - "overrideType": "boolean", - "nullable": false - } - } - }, "methods": { "method": { "togglePopover": { @@ -1292,40 +1282,10 @@ } }, "HTMLSelectElement": { - "properties": { - "property": { - "type": { - "name": "type", - "overrideType": "\"select-one\" | \"select-multiple\"" - }, - "autocomplete": { - "name": "autocomplete", - "overrideType": "AutoFill" - }, - "selectedOptions": { - "name": "selectedOptions", - "overrideType": "HTMLCollectionOf" - }, - "labels": { - "name": "labels", - "overrideType": "NodeListOf" - } - } - }, "overrideIndexSignatures": [ "[name: number]: HTMLOptionElement | HTMLOptGroupElement" ] }, - "HTMLDataListElement": { - "properties": { - "property": { - "options": { - "name": "options", - "overrideType": "HTMLCollectionOf" - } - } - } - }, "FontFace": { "properties": { "property": { @@ -1335,30 +1295,6 @@ } } }, - "HTMLTableElement": { - "properties": { - "property": { - "rows": { - "name": "rows", - "overrideType": "HTMLCollectionOf" - }, - "tBodies": { - "name": "tBodies", - "overrideType": "HTMLCollectionOf" - } - } - } - }, - "HTMLTableSectionElement": { - "properties": { - "property": { - "rows": { - "name": "rows", - "overrideType": "HTMLCollectionOf" - } - } - } - }, "Element": { "methods": { "method": { @@ -1486,9 +1422,6 @@ "[name: string]: any" ] }, - "HTMLOptionsCollection": { - "extends": "HTMLCollectionOf" - }, "SubtleCrypto": { "methods": { "method": { @@ -1671,22 +1604,6 @@ } }, "HTMLInputElement": { - "properties": { - "property": { - "autocomplete": { - "name": "autocomplete", - "overrideType": "AutoFill" - }, - "selectionDirection": { - "name": "selectionDirection", - "overrideType": "\"forward\" | \"backward\" | \"none\"" - }, - "valueAsDate": { - "name": "valueAsDate", - "overrideType": "Date" - } - } - }, "methods": { "method": { "setSelectionRange": { @@ -1749,76 +1666,7 @@ "exposed": "", "name": "Float16Array" }, - "HTMLButtonElement": { - "properties": { - "property": { - "labels": { - "name": "labels", - "overrideType": "NodeListOf" - }, - "type": { - "overrideType": "\"submit\" | \"reset\" | \"button\"" - } - } - } - }, - "HTMLLabelElement": { - "properties": { - "property": { - "form": { - "name": "form", - "overrideType": "HTMLFormElement" - } - } - } - }, - "HTMLMeterElement": { - "properties": { - "property": { - "labels": { - "name": "labels", - "overrideType": "NodeListOf" - } - } - } - }, - "HTMLOutputElement": { - "properties": { - "property": { - "labels": { - "name": "labels", - "overrideType": "NodeListOf" - } - } - } - }, - "HTMLProgressElement": { - "properties": { - "property": { - "labels": { - "name": "labels", - "overrideType": "NodeListOf" - } - } - } - }, "HTMLTextAreaElement": { - "properties": { - "property": { - "autocomplete": { - "name": "autocomplete", - "overrideType": "AutoFill" - }, - "labels": { - "name": "labels", - "overrideType": "NodeListOf" - }, - "selectionDirection": { - "name": "selectionDirection", - "overrideType": "\"forward\" | \"backward\" | \"none\"" - } - } - }, "methods": { "method": { "setSelectionRange": { @@ -1910,16 +1758,6 @@ } } }, - "HTMLTableRowElement": { - "properties": { - "property": { - "cells": { - "name": "cells", - "overrideType": "HTMLCollectionOf" - } - } - } - }, "XMLHttpRequestEventTarget": { "properties": { "property": { @@ -2520,15 +2358,7 @@ "overrideIndexSignatures": [ "[index: number]: Element", "[name: string]: any" - ], - "properties": { - "property": { - "autocomplete": { - "name": "autocomplete", - "overrideType": "AutoFillBase" - } - } - } + ] }, "Blob": { "methods": { @@ -3312,15 +3142,6 @@ "ContactAddress": { "name": "PaymentAddress" }, - "HTMLMediaElement": { - "properties": { - "property": { - "preload": { - "overrideType": "\"none\" | \"metadata\" | \"auto\" | \"\"" - } - } - } - }, "Global": { "name": "Global", "typeParameters": [ @@ -3399,33 +3220,6 @@ } } }, - "HTMLImageElement": { - "properties": { - "property": { - "fetchPriority": { - "overrideType": "\"high\" | \"low\" | \"auto\"" - } - } - } - }, - "HTMLLinkElement": { - "properties": { - "property": { - "fetchPriority": { - "overrideType": "\"high\" | \"low\" | \"auto\"" - } - } - } - }, - "HTMLScriptElement": { - "properties": { - "property": { - "fetchPriority": { - "overrideType": "\"high\" | \"low\" | \"auto\"" - } - } - } - }, "LockManager": { "methods": { "method": { diff --git a/inputfiles/patches/html-froms.kdl b/inputfiles/patches/html-froms.kdl new file mode 100644 index 000000000..c8d3a6aca --- /dev/null +++ b/inputfiles/patches/html-froms.kdl @@ -0,0 +1,36 @@ +interface HTMLButtonElement { + property labels overrideType=NodeListOf + property type overrideType="\"submit\" | \"reset\" | \"button\"" +} + +interface HTMLFormElement { + property autocomplete overrideType=AutoFillBase +} + +interface HTMLInputElement { + property labels overrideType=NodeListOf + property autocomplete overrideType=AutoFill + property selectionDirection overrideType="\"forward\" | \"backward\" | \"none\"" + property valueAsDate overrideType=Date +} + +interface HTMLLabelElement { + property form overrideType=HTMLFormElement +} + +interface HTMLOutputElement { + property labels overrideType=NodeListOf +} + +interface HTMLSelectElement { + property type overrideType="\"select-one\" | \"select-multiple\"" + property autocomplete overrideType=AutoFill + property selectedOptions overrideType=HTMLCollectionOf + property labels overrideType=NodeListOf +} + +interface HTMLTextAreaElement { + property autocomplete overrideType=AutoFill + property labels overrideType=NodeListOf + property selectionDirection overrideType="\"forward\" | \"backward\" | \"none\"" +} diff --git a/inputfiles/patches/html-table.kdl b/inputfiles/patches/html-table.kdl new file mode 100644 index 000000000..5a355e48b --- /dev/null +++ b/inputfiles/patches/html-table.kdl @@ -0,0 +1,16 @@ +interface HTMLTableDataCellElement extends=HTMLTableCellElement exposed=Window deprecated="prefer HTMLTableCellElement" noInterfaceObject=#true + +interface HTMLTableElement { + property rows overrideType=HTMLCollectionOf + property tBodies overrideType=HTMLCollectionOf +} + +interface HTMLTableHeaderCellElement extends=HTMLTableCellElement exposed=Window deprecated="prefer HTMLTableCellElement" noInterfaceObject=#true + +interface HTMLTableRowElement { + property cells overrideType=HTMLCollectionOf +} + +interface HTMLTableSectionElement { + property rows overrideType=HTMLCollectionOf +} diff --git a/inputfiles/patches/html.kdl b/inputfiles/patches/html.kdl index 78fc0837c..4d4b8339f 100644 --- a/inputfiles/patches/html.kdl +++ b/inputfiles/patches/html.kdl @@ -5,8 +5,61 @@ enum ImageOrientation { none } -interface HTMLTableDataCellElement extends=HTMLTableCellElement exposed=Window deprecated="prefer HTMLTableCellElement" noInterfaceObject=#true -interface HTMLTableHeaderCellElement extends=HTMLTableCellElement exposed=Window deprecated="prefer HTMLTableCellElement" noInterfaceObject=#true +interface HTMLBodyElement { + property onorientationchange deprecated=#true +} + +interface HTMLCollectionOf exposed=Window extends=HTMLCollection noInterfaceObject=#true + +interface HTMLDataListElement { + property options overrideType=HTMLCollectionOf +} + interface HTMLDocument extends=Document exposed=Window + +interface HTMLIFrameElement { + property referrerPolicy type=ReferrerPolicy + property loading overrideType="\"eager\" | \"lazy\"" +} + +interface HTMLImageElement { + property decoding overrideType="\"async\" | \"sync\" | \"auto\"" + property loading overrideType="\"eager\" | \"lazy\"" + property fetchPriority overrideType="\"high\" | \"low\" | \"auto\"" +} + +interface HTMLLinkElement { + property charset deprecated=#true + property rev deprecated=#true + property target deprecated=#true + property fetchPriority overrideType="\"high\" | \"low\" | \"auto\"" +} + +interface HTMLMediaElement { + event encrypted type=MediaEncryptedEvent + property preload overrideType="\"none\" | \"metadata\" | \"auto\" | \"\"" +} + +interface HTMLMeterElement { + property labels overrideType=NodeListOf +} + +interface HTMLOptionsCollection extends=HTMLCollectionOf + +interface HTMLProgressElement { + property labels overrideType=NodeListOf +} + +interface HTMLScriptElement { + property fetchPriority overrideType="\"high\" | \"low\" | \"auto\"" +} + +interface HTMLElement { + // https://github.com/whatwg/html/pull/7475 + // Blink only as of 2024-11 + property hidden overrideType=boolean { + type nullable=#false + } +} interface-mixin MessageEventTarget overrideThis=T typeParameters=T diff --git a/src/build/patches.ts b/src/build/patches.ts index 0b12aeae7..adfd4015a 100644 --- a/src/build/patches.ts +++ b/src/build/patches.ts @@ -45,7 +45,7 @@ function handleTyped(type: Node): Typed { if (!isTyped) { throw new Error("Expected a type node"); } - const name = string(type.values[0]); + const name = type.values[0] ? string(type.values[0]) : ""; const subType = type.children.length > 0 ? handleTyped(type.children[0]) : undefined; return { @@ -55,6 +55,19 @@ function handleTyped(type: Node): Typed { }; } +function findTypeNode(children: Node[], context: string): Node | undefined { + let typeNode: Node | undefined; + for (const c of children) { + if (c.name === "type") { + if (typeNode) { + throw new Error(`${context} has multiple type nodes (invalid)`); + } + typeNode = c; + } + } + return typeNode; +} + function handleTypeParameters(value: Value) { if (!value) return {}; return { @@ -204,8 +217,12 @@ function handleEvent(child: Node): Event { * @param child The child node to handle. */ function handleProperty(child: Node): Partial { + const name = string(child.values[0]); + const typeNode = findTypeNode(child.children, `Property "${name}"`); + const typed = typeNode ? handleTyped(typeNode) : undefined; return { - name: string(child.values[0]), + name, + ...typed, ...optionalMember("exposed", "string", child.properties?.exposed), ...optionalMember("optional", "boolean", child.properties?.optional), ...optionalMember("overrideType", "string", child.properties?.overrideType), @@ -220,18 +237,14 @@ function handleProperty(child: Node): Partial { function handleMethod(child: Node): Partial { const name = string(child.values[0]); - let typeNode: Node | undefined; + const typeNode = findTypeNode(child.children, `Property "${name}"`); const params: { name: string; type: string }[] = []; for (const c of child.children) { switch (c.name) { case "type": - if (typeNode) { - throw new Error(`Method "${name}" has multiple type nodes (invalid)`); - } - typeNode = c; + // already handled above break; - case "param": params.push({ name: string(c.values[0]),