diff --git a/src/html/elements.zig b/src/html/elements.zig index cf0175f5..6b6ad83f 100644 --- a/src/html/elements.zig +++ b/src/html/elements.zig @@ -674,10 +674,120 @@ pub const HTMLQuoteElement = struct { pub const mem_guarantied = true; }; +// https://html.spec.whatwg.org/#the-script-element pub const HTMLScriptElement = struct { pub const Self = parser.Script; pub const prototype = *HTMLElement; pub const mem_guarantied = true; + + pub fn get_src(self: *parser.Script) !?[]const u8 { + return try parser.elementGetAttribute( + parser.scriptToElt(self), + "src", + ) orelse ""; + } + + pub fn set_src(self: *parser.Script, v: []const u8) !void { + return try parser.elementSetAttribute( + parser.scriptToElt(self), + "src", + v, + ); + } + + pub fn get_type(self: *parser.Script) !?[]const u8 { + return try parser.elementGetAttribute( + parser.scriptToElt(self), + "type", + ) orelse ""; + } + + pub fn set_type(self: *parser.Script, v: []const u8) !void { + return try parser.elementSetAttribute( + parser.scriptToElt(self), + "type", + v, + ); + } + + pub fn get_text(self: *parser.Script) !?[]const u8 { + return try parser.elementGetAttribute( + parser.scriptToElt(self), + "text", + ) orelse ""; + } + + pub fn set_text(self: *parser.Script, v: []const u8) !void { + return try parser.elementSetAttribute( + parser.scriptToElt(self), + "text", + v, + ); + } + + pub fn get_integrity(self: *parser.Script) !?[]const u8 { + return try parser.elementGetAttribute( + parser.scriptToElt(self), + "integrity", + ) orelse ""; + } + + pub fn set_integrity(self: *parser.Script, v: []const u8) !void { + return try parser.elementSetAttribute( + parser.scriptToElt(self), + "integrity", + v, + ); + } + + pub fn get_async(self: *parser.Script) !bool { + _ = try parser.elementGetAttribute( + parser.scriptToElt(self), + "async", + ) orelse return false; + + return true; + } + + pub fn set_async(self: *parser.Script, v: bool) !void { + if (v) { + return try parser.elementSetAttribute(parser.scriptToElt(self), "async", ""); + } + + return try parser.elementRemoveAttribute(parser.scriptToElt(self), "async"); + } + + pub fn get_defer(self: *parser.Script) !bool { + _ = try parser.elementGetAttribute( + parser.scriptToElt(self), + "defer", + ) orelse false; + return true; + } + + pub fn set_defer(self: *parser.Script, v: bool) !void { + if (v) { + return try parser.elementSetAttribute(parser.scriptToElt(self), "defer", ""); + } + + return try parser.elementRemoveAttribute(parser.scriptToElt(self), "defer"); + } + + pub fn get_noModule(self: *parser.Script) !bool { + _ = try parser.elementGetAttribute( + parser.scriptToElt(self), + "nomodule", + ) orelse false; + return true; + } + + pub fn set_noModule(self: *parser.Script, v: bool) !void { + if (v) { + return try parser.elementSetAttribute(parser.scriptToElt(self), "nomodule", ""); + } + + return try parser.elementRemoveAttribute(parser.scriptToElt(self), "nomodule"); + } }; pub const HTMLSelectElement = struct { @@ -922,4 +1032,15 @@ pub fn testExecFn( .{ .src = "a.text = 'OK'", .ex = "OK" }, }; try checkCases(js_env, &anchor); + + var script = [_]Case{ + .{ .src = "let script = document.createElement('script')", .ex = "undefined" }, + .{ .src = "script.src = 'foo.bar'", .ex = "foo.bar" }, + + .{ .src = "script.async = true", .ex = "true" }, + .{ .src = "script.async", .ex = "true" }, + .{ .src = "script.async = false", .ex = "false" }, + .{ .src = "script.async", .ex = "false" }, + }; + try checkCases(js_env, &script); } diff --git a/src/netsurf.zig b/src/netsurf.zig index a3001839..f5b3a141 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -1513,9 +1513,16 @@ pub fn elementHTMLGetTagType(elem_html: *ElementHTML) !Tag { return @as(Tag, @enumFromInt(tag_type)); } +// HTMLScriptElement + +// scriptToElt is an helper to convert an script to an element. +pub inline fn scriptToElt(s: *Script) *Element { + return @as(*Element, @ptrCast(s)); +} + // HTMLAnchorElement -// anchorToNode is an helper to convert an element to a node. +// anchorToNode is an helper to convert an anchor to a node. pub inline fn anchorToNode(a: *Anchor) *Node { return @as(*Node, @ptrCast(a)); }