From b09049cbf36598ed215cd92132b41931223b4f4b Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 24 Sep 2026 10:06:15 +0800 Subject: [PATCH] webapi: add new Option() support --- src/browser/tests/element/html/option.html | 66 ++++++++++++++++++++++ src/browser/webapi/element/html/Option.zig | 22 ++++++++ 2 files changed, 88 insertions(+) diff --git a/src/browser/tests/element/html/option.html b/src/browser/tests/element/html/option.html index 0494f6b4a..e35cc306e 100644 --- a/src/browser/tests/element/html/option.html +++ b/src/browser/tests/element/html/option.html @@ -191,3 +191,69 @@ $('#opt4').disabled = false testing.expectEqual(false, $('#opt4').disabled) + + diff --git a/src/browser/webapi/element/html/Option.zig b/src/browser/webapi/element/html/Option.zig index 42a5afce0..fea38fd64 100644 --- a/src/browser/webapi/element/html/Option.zig +++ b/src/browser/webapi/element/html/Option.zig @@ -39,6 +39,26 @@ _value: ?[]const u8 = null, _selected: bool = false, _default_selected: bool = false, +pub fn constructor(text_: ?js.NullableString, value_: ?js.NullableString, default_selected_: ?bool, selected_: ?bool, frame: *Frame) !*Option { + const node = try Frame.node_factory.createElementNS(frame.document, .html, "option", null); + const el = node.as(Element); + + const text = if (text_) |t| t.value else ""; + if (text.len > 0) { + _ = try node.appendChild(try frame.document.createTextNode(text), frame); + } + if (value_) |v| { + try el.setAttributeSafe(comptime .wrap("value"), .wrap(v.value), frame); + } + if (default_selected_ orelse false) { + try el.setAttributeSafe(comptime .wrap("selected"), comptime .wrap(""), frame); + } + + const self = el.as(Option); + self._selected = selected_ orelse false; + return self; +} + pub fn asElement(self: *Option) *Element { return Factory.protoOf(self).asElement(); } @@ -135,12 +155,14 @@ pub const JsApi = struct { pub const Meta = struct { pub const name = "HTMLOptionElement"; + pub const constructor_alias = "Option"; pub const prototype_chain = bridge.prototypeChain(); pub var class_id: bridge.ClassId = undefined; }; const reflect = Element.Reflect(Option); + pub const constructor = bridge.constructor(Option.constructor, .{}); pub const value = bridge.accessor(Option.getValue, Option.setValue, .{ .ce_reactions = true }); pub const text = bridge.accessor(Option.getText, Option.setText, .{ .ce_reactions = true }); pub const label = bridge.accessor(Option.getLabel, Option.setLabel, .{ .ce_reactions = true });