Skip to content

Commit ead0855

Browse files
committed
script: implement interface
1 parent 6d808d8 commit ead0855

File tree

2 files changed

+129
-1
lines changed

2 files changed

+129
-1
lines changed

src/html/elements.zig

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,10 +674,120 @@ pub const HTMLQuoteElement = struct {
674674
pub const mem_guarantied = true;
675675
};
676676

677+
// https://html.spec.whatwg.org/#the-script-element
677678
pub const HTMLScriptElement = struct {
678679
pub const Self = parser.Script;
679680
pub const prototype = *HTMLElement;
680681
pub const mem_guarantied = true;
682+
683+
pub fn get_src(self: *parser.Script) !?[]const u8 {
684+
return try parser.elementGetAttribute(
685+
parser.scriptToElt(self),
686+
"src",
687+
) orelse "";
688+
}
689+
690+
pub fn set_src(self: *parser.Script, v: []const u8) !void {
691+
return try parser.elementSetAttribute(
692+
parser.scriptToElt(self),
693+
"src",
694+
v,
695+
);
696+
}
697+
698+
pub fn get_type(self: *parser.Script) !?[]const u8 {
699+
return try parser.elementGetAttribute(
700+
parser.scriptToElt(self),
701+
"type",
702+
) orelse "";
703+
}
704+
705+
pub fn set_type(self: *parser.Script, v: []const u8) !void {
706+
return try parser.elementSetAttribute(
707+
parser.scriptToElt(self),
708+
"type",
709+
v,
710+
);
711+
}
712+
713+
pub fn get_text(self: *parser.Script) !?[]const u8 {
714+
return try parser.elementGetAttribute(
715+
parser.scriptToElt(self),
716+
"text",
717+
) orelse "";
718+
}
719+
720+
pub fn set_text(self: *parser.Script, v: []const u8) !void {
721+
return try parser.elementSetAttribute(
722+
parser.scriptToElt(self),
723+
"text",
724+
v,
725+
);
726+
}
727+
728+
pub fn get_integrity(self: *parser.Script) !?[]const u8 {
729+
return try parser.elementGetAttribute(
730+
parser.scriptToElt(self),
731+
"integrity",
732+
) orelse "";
733+
}
734+
735+
pub fn set_integrity(self: *parser.Script, v: []const u8) !void {
736+
return try parser.elementSetAttribute(
737+
parser.scriptToElt(self),
738+
"integrity",
739+
v,
740+
);
741+
}
742+
743+
pub fn get_async(self: *parser.Script) !bool {
744+
_ = try parser.elementGetAttribute(
745+
parser.scriptToElt(self),
746+
"async",
747+
) orelse return false;
748+
749+
return true;
750+
}
751+
752+
pub fn set_async(self: *parser.Script, v: bool) !void {
753+
if (v) {
754+
return try parser.elementSetAttribute(parser.scriptToElt(self), "async", "");
755+
}
756+
757+
return try parser.elementRemoveAttribute(parser.scriptToElt(self), "async");
758+
}
759+
760+
pub fn get_defer(self: *parser.Script) !bool {
761+
_ = try parser.elementGetAttribute(
762+
parser.scriptToElt(self),
763+
"defer",
764+
) orelse false;
765+
return true;
766+
}
767+
768+
pub fn set_defer(self: *parser.Script, v: bool) !void {
769+
if (v) {
770+
return try parser.elementSetAttribute(parser.scriptToElt(self), "defer", "");
771+
}
772+
773+
return try parser.elementRemoveAttribute(parser.scriptToElt(self), "defer");
774+
}
775+
776+
pub fn get_noModule(self: *parser.Script) !bool {
777+
_ = try parser.elementGetAttribute(
778+
parser.scriptToElt(self),
779+
"nomodule",
780+
) orelse false;
781+
return true;
782+
}
783+
784+
pub fn set_noModule(self: *parser.Script, v: bool) !void {
785+
if (v) {
786+
return try parser.elementSetAttribute(parser.scriptToElt(self), "nomodule", "");
787+
}
788+
789+
return try parser.elementRemoveAttribute(parser.scriptToElt(self), "nomodule");
790+
}
681791
};
682792

683793
pub const HTMLSelectElement = struct {
@@ -922,4 +1032,15 @@ pub fn testExecFn(
9221032
.{ .src = "a.text = 'OK'", .ex = "OK" },
9231033
};
9241034
try checkCases(js_env, &anchor);
1035+
1036+
var script = [_]Case{
1037+
.{ .src = "let script = document.createElement('script')", .ex = "undefined" },
1038+
.{ .src = "script.src = 'foo.bar'", .ex = "foo.bar" },
1039+
1040+
.{ .src = "script.async = true", .ex = "true" },
1041+
.{ .src = "script.async", .ex = "true" },
1042+
.{ .src = "script.async = false", .ex = "false" },
1043+
.{ .src = "script.async", .ex = "false" },
1044+
};
1045+
try checkCases(js_env, &script);
9251046
}

src/netsurf.zig

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1513,9 +1513,16 @@ pub fn elementHTMLGetTagType(elem_html: *ElementHTML) !Tag {
15131513
return @as(Tag, @enumFromInt(tag_type));
15141514
}
15151515

1516+
// HTMLScriptElement
1517+
1518+
// scriptToElt is an helper to convert an script to an element.
1519+
pub inline fn scriptToElt(s: *Script) *Element {
1520+
return @as(*Element, @ptrCast(s));
1521+
}
1522+
15161523
// HTMLAnchorElement
15171524

1518-
// anchorToNode is an helper to convert an element to a node.
1525+
// anchorToNode is an helper to convert an anchor to a node.
15191526
pub inline fn anchorToNode(a: *Anchor) *Node {
15201527
return @as(*Node, @ptrCast(a));
15211528
}

0 commit comments

Comments
 (0)