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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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", .{});
+}