From b9486e89350ffc10b6ec89d2a8f43a4fdf8fc34a Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 21 Nov 2025 08:55:39 +0800 Subject: [PATCH] add HTMLDialogElement --- src/browser/Page.zig | 6 ++ src/browser/js/bridge.zig | 1 + src/browser/tests/element/html/dialog.html | 78 ++++++++++++++++++++++ src/browser/webapi/Element.zig | 4 ++ src/browser/webapi/element/Html.zig | 3 + src/browser/webapi/element/html/Dialog.zig | 58 ++++++++++++++++ 6 files changed, 150 insertions(+) create mode 100644 src/browser/tests/element/html/dialog.html create mode 100644 src/browser/webapi/element/html/Dialog.zig diff --git a/src/browser/Page.zig b/src/browser/Page.zig index 77da5acc..8c75f2bc 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -1110,6 +1110,12 @@ pub fn createElement(self: *Page, ns_: ?[]const u8, name: []const u8, attribute_ attribute_iterator, .{ ._proto = undefined }, ), + asUint("dialog") => return self.createHtmlElementT( + Element.Html.Dialog, + namespace, + attribute_iterator, + .{ ._proto = undefined }, + ), asUint("strong") => return self.createHtmlElementT( Element.Html.Generic, namespace, diff --git a/src/browser/js/bridge.zig b/src/browser/js/bridge.zig index 23caa951..eccc7dc9 100644 --- a/src/browser/js/bridge.zig +++ b/src/browser/js/bridge.zig @@ -515,6 +515,7 @@ pub const JsApis = flattenTypes(&.{ @import("../webapi/element/html/BR.zig"), @import("../webapi/element/html/Button.zig"), @import("../webapi/element/html/Custom.zig"), + @import("../webapi/element/html/Dialog.zig"), @import("../webapi/element/html/Div.zig"), @import("../webapi/element/html/Form.zig"), @import("../webapi/element/html/Generic.zig"), diff --git a/src/browser/tests/element/html/dialog.html b/src/browser/tests/element/html/dialog.html new file mode 100644 index 00000000..b4c26df5 --- /dev/null +++ b/src/browser/tests/element/html/dialog.html @@ -0,0 +1,78 @@ + + + + +Dialog content +Open dialog + + + + + + + + + + + + + + diff --git a/src/browser/webapi/Element.zig b/src/browser/webapi/Element.zig index 6f5f15aa..c4e3bf1d 100644 --- a/src/browser/webapi/Element.zig +++ b/src/browser/webapi/Element.zig @@ -129,6 +129,7 @@ pub fn getTagNameLower(self: *const Element) []const u8 { .br => "br", .button => "button", .custom => |e| e._tag_name.str(), + .dialog => "dialog", .div => "div", .form => "form", .generic => |e| e._tag_name.str(), @@ -172,6 +173,7 @@ pub fn getTagNameSpec(self: *const Element, buf: []u8) []const u8 { .br => "BR", .button => "BUTTON", .custom => |e| upperTagName(&e._tag_name, buf), + .dialog => "DIALOG", .div => "DIV", .form => "FORM", .generic => |e| upperTagName(&e._tag_name, buf), @@ -760,6 +762,7 @@ pub fn getTag(self: *const Element) Tag { .form => .form, .p => .p, .custom => .custom, + .dialog => .dialog, .iframe => .iframe, .img => .img, .br => .br, @@ -800,6 +803,7 @@ pub const Tag = enum { button, circle, custom, + dialog, div, ellipse, em, diff --git a/src/browser/webapi/element/Html.zig b/src/browser/webapi/element/Html.zig index 788e11bd..475c1f21 100644 --- a/src/browser/webapi/element/Html.zig +++ b/src/browser/webapi/element/Html.zig @@ -42,6 +42,7 @@ pub const Custom = @import("html/Custom.zig"); pub const Script = @import("html/Script.zig"); pub const Anchor = @import("html/Anchor.zig"); pub const Button = @import("html/Button.zig"); +pub const Dialog = @import("html/Dialog.zig"); pub const Form = @import("html/Form.zig"); pub const Heading = @import("html/Heading.zig"); pub const Unknown = @import("html/Unknown.zig"); @@ -70,6 +71,7 @@ pub const Type = union(enum) { br: BR, button: Button, custom: *Custom, + dialog: Dialog, div: Div, form: Form, generic: *Generic, @@ -117,6 +119,7 @@ pub fn className(self: *const HtmlElement) []const u8 { .form => "[object HTMLFormElement]", .p => "[object HtmlParagraphElement]", .custom => "[object CUSTOM-TODO]", + .dialog => "[object HTMLDialogElement]", .img => "[object HTMLImageElement]", .iframe => "[object HTMLIFrameElement]", .br => "[object HTMLBRElement]", diff --git a/src/browser/webapi/element/html/Dialog.zig b/src/browser/webapi/element/html/Dialog.zig new file mode 100644 index 00000000..bc610b9a --- /dev/null +++ b/src/browser/webapi/element/html/Dialog.zig @@ -0,0 +1,58 @@ +const js = @import("../../../js/js.zig"); +const Page = @import("../../../Page.zig"); + +const Node = @import("../../Node.zig"); +const Element = @import("../../Element.zig"); +const HtmlElement = @import("../Html.zig"); + +const Dialog = @This(); + +_proto: *HtmlElement, + +pub fn asElement(self: *Dialog) *Element { + return self._proto._proto; +} +pub fn asConstElement(self: *const Dialog) *const Element { + return self._proto._proto; +} +pub fn asNode(self: *Dialog) *Node { + return self.asElement().asNode(); +} + +pub fn getOpen(self: *const Dialog) bool { + return self.asConstElement().getAttributeSafe("open") != null; +} + +pub fn setOpen(self: *Dialog, open: bool, page: *Page) !void { + if (open) { + try self.asElement().setAttributeSafe("open", "", page); + } else { + try self.asElement().removeAttribute("open", page); + } +} + +pub fn getReturnValue(self: *const Dialog) []const u8 { + return self.asConstElement().getAttributeSafe("returnvalue") orelse ""; +} + +pub fn setReturnValue(self: *Dialog, value: []const u8, page: *Page) !void { + try self.asElement().setAttributeSafe("returnvalue", value, page); +} + +pub const JsApi = struct { + pub const bridge = js.Bridge(Dialog); + + pub const Meta = struct { + pub const name = "HTMLDialogElement"; + pub const prototype_chain = bridge.prototypeChain(); + pub var class_id: bridge.ClassId = undefined; + }; + + pub const open = bridge.accessor(Dialog.getOpen, Dialog.setOpen, .{}); + pub const returnValue = bridge.accessor(Dialog.getReturnValue, Dialog.setReturnValue, .{}); +}; + +const testing = @import("../../../../testing.zig"); +test "WebApi: HTML.Dialog" { + try testing.htmlRunner("element/html/dialog.html", .{}); +}