From b326abd422563e19d18b35aa42f536551298eefb Mon Sep 17 00:00:00 2001 From: Bashamega Date: Wed, 24 Sep 2025 10:36:15 +0300 Subject: [PATCH 1/4] Move most HTML related interfaces to KDL --- inputfiles/addedTypes.jsonc | 78 +---------- inputfiles/overridingTypes.jsonc | 208 +----------------------------- inputfiles/patches/html-froms.kdl | 36 ++++++ inputfiles/patches/html-table.kdl | 16 +++ inputfiles/patches/html.kdl | 55 +++++++- src/build/patches.ts | 1 + 6 files changed, 109 insertions(+), 285 deletions(-) create mode 100644 inputfiles/patches/html-froms.kdl create mode 100644 inputfiles/patches/html-table.kdl diff --git a/inputfiles/addedTypes.jsonc b/inputfiles/addedTypes.jsonc index ad7a7458c..5b0c0125a 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", @@ -454,20 +426,6 @@ } } }, - "HTMLIFrameElement": { - "name": "HTMLIFrameElement", - "properties": { - "property": { - "referrerPolicy": { - "type": "ReferrerPolicy" - }, - "loading": { - "name": "loading", - "overrideType": "\"eager\" | \"lazy\"" - } - } - } - }, "IDBDatabase": { "name": "IDBDatabase", "events": { @@ -571,39 +529,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 4d1d2822b..9f23842e0 100644 --- a/inputfiles/overridingTypes.jsonc +++ b/inputfiles/overridingTypes.jsonc @@ -367,16 +367,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": { @@ -1300,40 +1290,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" - } - } - } - }, "HTMLDirectoryElement": { "element": [ { @@ -1371,30 +1331,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": { @@ -1522,9 +1458,6 @@ "[name: string]: any" ] }, - "HTMLOptionsCollection": { - "extends": "HTMLCollectionOf" - }, "SubtleCrypto": { "methods": { "method": { @@ -1707,22 +1640,6 @@ } }, "HTMLInputElement": { - "properties": { - "property": { - "autocomplete": { - "name": "autocomplete", - "overrideType": "AutoFill" - }, - "selectionDirection": { - "name": "selectionDirection", - "overrideType": "\"forward\" | \"backward\" | \"none\"" - }, - "valueAsDate": { - "name": "valueAsDate", - "overrideType": "Date" - } - } - }, "methods": { "method": { "setSelectionRange": { @@ -1785,76 +1702,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": { @@ -1946,16 +1794,6 @@ } } }, - "HTMLTableRowElement": { - "properties": { - "property": { - "cells": { - "name": "cells", - "overrideType": "HTMLCollectionOf" - } - } - } - }, "XMLHttpRequestEventTarget": { "properties": { "property": { @@ -2563,15 +2401,7 @@ "overrideIndexSignatures": [ "[index: number]: Element", "[name: string]: any" - ], - "properties": { - "property": { - "autocomplete": { - "name": "autocomplete", - "overrideType": "AutoFillBase" - } - } - } + ] }, "Blob": { "methods": { @@ -3364,15 +3194,6 @@ "ContactAddress": { "name": "PaymentAddress" }, - "HTMLMediaElement": { - "properties": { - "property": { - "preload": { - "overrideType": "\"none\" | \"metadata\" | \"auto\" | \"\"" - } - } - } - }, "Global": { "name": "Global", "typeParameters": [ @@ -3451,33 +3272,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 96b44b149..8dc19b4b0 100644 --- a/inputfiles/patches/html.kdl +++ b/inputfiles/patches/html.kdl @@ -5,6 +5,57 @@ 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 nullable=#false +} diff --git a/src/build/patches.ts b/src/build/patches.ts index 981e50eb0..cf21a6540 100644 --- a/src/build/patches.ts +++ b/src/build/patches.ts @@ -197,6 +197,7 @@ function handleProperty(child: Node): Partial { ...optionalMember("optional", "boolean", child.properties?.optional), ...optionalMember("overrideType", "string", child.properties?.overrideType), ...optionalMember("type", "string", child.properties?.type), + ...optionalMember("nullable", "boolean", child.properties?.nullable), }; } From 6643afa49f08e4b68f3c85bdd787dde149579fd5 Mon Sep 17 00:00:00 2001 From: Bashamega Date: Wed, 24 Sep 2025 19:39:18 +0300 Subject: [PATCH 2/4] - --- inputfiles/overridingTypes.jsonc | 34 -------------------------------- 1 file changed, 34 deletions(-) diff --git a/inputfiles/overridingTypes.jsonc b/inputfiles/overridingTypes.jsonc index 71bd164af..2fe37fed8 100644 --- a/inputfiles/overridingTypes.jsonc +++ b/inputfiles/overridingTypes.jsonc @@ -1286,16 +1286,6 @@ "[name: number]: HTMLOptionElement | HTMLOptGroupElement" ] }, - "HTMLDataListElement": { - "properties": { - "property": { - "options": { - "name": "options", - "overrideType": "HTMLCollectionOf" - } - } - } - }, "FontFace": { "properties": { "property": { @@ -1305,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": { From bba385f054c87016939fe009e109b0bb87b64354 Mon Sep 17 00:00:00 2001 From: Bashamega Date: Sat, 27 Sep 2025 10:56:29 +0300 Subject: [PATCH 3/4] TYPED --- inputfiles/patches/html.kdl | 4 +++- src/build/patches.ts | 35 ++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/inputfiles/patches/html.kdl b/inputfiles/patches/html.kdl index 8dc19b4b0..9beb112a8 100644 --- a/inputfiles/patches/html.kdl +++ b/inputfiles/patches/html.kdl @@ -57,5 +57,7 @@ interface HTMLScriptElement { interface HTMLElement { // https://github.com/whatwg/html/pull/7475 // Blink only as of 2024-11 - property hidden overrideType=boolean nullable=#false + property hidden overrideType=boolean { + type nullable=#false + } } diff --git a/src/build/patches.ts b/src/build/patches.ts index ad50bc082..13ee8fcda 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,13 +217,16 @@ 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), ...optionalMember("type", "string", child.properties?.type), - ...optionalMember("nullable", "boolean", child.properties?.nullable), }; } @@ -221,18 +237,15 @@ 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}"`); + if (!typeNode) throw new Error(`Method "${name}" is missing a return type`); 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]), @@ -245,10 +258,6 @@ function handleMethod(child: Node): Partial { } } - if (!typeNode) { - throw new Error(`Method "${name}" is missing a return type`); - } - const signature: Method["signature"] = [ { param: params, From ebab56ab6c6400afd75e4ca429549489094b61b9 Mon Sep 17 00:00:00 2001 From: Adam Naji <110662505+Bashamega@users.noreply.github.com> Date: Mon, 29 Sep 2025 06:34:27 +0300 Subject: [PATCH 4/4] Update patches.ts --- src/build/patches.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/build/patches.ts b/src/build/patches.ts index ca8743da8..adfd4015a 100644 --- a/src/build/patches.ts +++ b/src/build/patches.ts @@ -238,7 +238,6 @@ function handleMethod(child: Node): Partial { const name = string(child.values[0]); const typeNode = findTypeNode(child.children, `Property "${name}"`); - if (!typeNode) throw new Error(`Method "${name}" is missing a return type`); const params: { name: string; type: string }[] = []; for (const c of child.children) {