diff --git a/src/html/elements.zig b/src/html/elements.zig index 1f581de6..c632b63c 100644 --- a/src/html/elements.zig +++ b/src/html/elements.zig @@ -26,6 +26,7 @@ const checkCases = jsruntime.test_utils.checkCases; const Element = @import("../dom/element.zig").Element; const URL = @import("../url/url.zig").URL; +const Node = @import("../dom/node.zig").Node; // HTMLElement interfaces pub const Interfaces = .{ @@ -117,6 +118,25 @@ pub const HTMLElement = struct { pub fn get_style(_: *parser.ElementHTML) CSSProperties { return .{}; } + + pub fn get_innerText(e: *parser.ElementHTML) ![]const u8 { + const n = @as(*parser.Node, @ptrCast(e)); + return try parser.nodeTextContent(n) orelse ""; + } + + pub fn set_innerText(e: *parser.ElementHTML, s: []const u8) !void { + const n = @as(*parser.Node, @ptrCast(e)); + + // create text node. + const doc = try parser.nodeOwnerDocument(n) orelse return error.NoDocument; + const t = try parser.documentCreateTextNode(doc, s); + + // remove existing children. + try Node.removeChildren(n); + + // attach the text node. + _ = try parser.nodeAppendChild(n, @as(*parser.Node, @ptrCast(t))); + } }; // Deprecated HTMLElements in Chrome (2023/03/15) @@ -1068,4 +1088,12 @@ pub fn testExecFn( .{ .src = "script.async", .ex = "false" }, }; try checkCases(js_env, &script); + + var innertext = [_]Case{ + .{ .src = "const backup = document.getElementById('content')", .ex = "undefined" }, + .{ .src = "document.getElementById('content').innerText = 'foo';", .ex = "foo" }, + .{ .src = "document.getElementById('content').innerText", .ex = "foo" }, + .{ .src = "document.getElementById('content').innerHTML = backup; true;", .ex = "true" }, + }; + try checkCases(js_env, &innertext); }