diff --git a/src/browser/tests/element/html/source.html b/src/browser/tests/element/html/source.html
new file mode 100644
index 000000000..29c93c343
--- /dev/null
+++ b/src/browser/tests/element/html/source.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/browser/webapi/element/html/Source.zig b/src/browser/webapi/element/html/Source.zig
index 8bb43fb02..f654959d7 100644
--- a/src/browser/webapi/element/html/Source.zig
+++ b/src/browser/webapi/element/html/Source.zig
@@ -1,4 +1,5 @@
const js = @import("../../../js/js.zig");
+const Frame = @import("../../../Frame.zig");
const Node = @import("../../Node.zig");
const Element = @import("../../Element.zig");
const HtmlElement = @import("../Html.zig");
@@ -10,10 +11,74 @@ _proto: *HtmlElement,
pub fn asElement(self: *Source) *Element {
return self._proto._proto;
}
+pub fn asConstElement(self: *const Source) *const Element {
+ return self._proto._proto;
+}
pub fn asNode(self: *Source) *Node {
return self.asElement().asNode();
}
+pub fn getSrc(self: *const Source, frame: *Frame) ![]const u8 {
+ const element = self.asConstElement();
+ const src = element.getAttributeSafe(comptime .wrap("src")) orelse return "";
+ if (src.len == 0) {
+ return "";
+ }
+ return element.asConstNode().resolveURL(src, frame, .{});
+}
+
+pub fn setSrc(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("src"), .wrap(value), frame);
+}
+
+pub fn getSrcset(self: *const Source) []const u8 {
+ return self.asConstElement().getAttributeSafe(comptime .wrap("srcset")) orelse "";
+}
+
+pub fn setSrcset(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("srcset"), .wrap(value), frame);
+}
+
+pub fn getSizes(self: *const Source) []const u8 {
+ return self.asConstElement().getAttributeSafe(comptime .wrap("sizes")) orelse "";
+}
+
+pub fn setSizes(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("sizes"), .wrap(value), frame);
+}
+
+pub fn getMedia(self: *const Source) []const u8 {
+ return self.asConstElement().getAttributeSafe(comptime .wrap("media")) orelse "";
+}
+
+pub fn setMedia(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("media"), .wrap(value), frame);
+}
+
+pub fn getType(self: *const Source) []const u8 {
+ return self.asConstElement().getAttributeSafe(comptime .wrap("type")) orelse "";
+}
+
+pub fn setType(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("type"), .wrap(value), frame);
+}
+
+pub fn getWidth(self: *const Source) []const u8 {
+ return self.asConstElement().getAttributeSafe(comptime .wrap("width")) orelse "";
+}
+
+pub fn setWidth(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("width"), .wrap(value), frame);
+}
+
+pub fn getHeight(self: *const Source) []const u8 {
+ return self.asConstElement().getAttributeSafe(comptime .wrap("height")) orelse "";
+}
+
+pub fn setHeight(self: *Source, value: []const u8, frame: *Frame) !void {
+ try self.asElement().setAttributeSafe(comptime .wrap("height"), .wrap(value), frame);
+}
+
pub const JsApi = struct {
pub const bridge = js.Bridge(Source);
@@ -22,4 +87,17 @@ pub const JsApi = struct {
pub const prototype_chain = bridge.prototypeChain();
pub var class_id: bridge.ClassId = undefined;
};
+
+ pub const height = bridge.accessor(Source.getHeight, Source.setHeight, .{ .ce_reactions = true });
+ pub const media = bridge.accessor(Source.getMedia, Source.setMedia, .{ .ce_reactions = true });
+ pub const sizes = bridge.accessor(Source.getSizes, Source.setSizes, .{ .ce_reactions = true });
+ pub const src = bridge.accessor(Source.getSrc, Source.setSrc, .{ .ce_reactions = true });
+ pub const srcset = bridge.accessor(Source.getSrcset, Source.setSrcset, .{ .ce_reactions = true });
+ pub const @"type" = bridge.accessor(Source.getType, Source.setType, .{ .ce_reactions = true });
+ pub const width = bridge.accessor(Source.getWidth, Source.setWidth, .{ .ce_reactions = true });
};
+
+const testing = @import("../../../../testing.zig");
+test "WebApi: HTML.Source" {
+ try testing.htmlRunner("element/html/source.html", .{});
+}